用到的机器 | ip |
---|---|
客户机 | 10.130.xx |
Gitlab+Jenkins+Docker | 10.130.77.55 |
docker镜像仓库:harbor | 10.130.77.50 |
k8s集群-master节点 | 10.130.77.75 |
k8s集群-node节点 | 10.130.77.76 |
k8s集群-node节点 | 10.130.77.77 |
一、CICD服务器环境搭建
CI即为持续集成(Continue Integration,简称CI),用通俗的话讲,就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等,
常用的工具和平台有:
Jenkins:基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Bamboo: 是一个企业级商用软件,可以部署在大规模生产环境中。
CD即持续交付Continuous Delivery和持续部署Continuous Deployment,用通俗的话说,即可以持续的部署到生产环境给客户使用,这里分为两个阶段,持续交付理解为满足上线条件的过程,但是没有上线,持续部署,即为上线应用的过程
关于CD环境,我们使用搭建好的K8s集群,K8s集群可以实现应用的健康检测,动态扩容,滚动更新等优点。
搭建CI服务器:操作服务器
docker 环境安装
拉取镜像,启动并设置开机自启
# yum -y install docker-ce
# systemctl enable docker --now
配置docker加速器
# mkdir -p /etc/docker
# cat /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://kwk8mr4s.mirror.aliyuncs.com"]
}
EOF
#sudo systemctl daemon-reload
#sudo systemctl restart docker
1. 安装GitLab 并配置
Gitlab,一个基于Git的版本控制平台,,提供了Git仓库管理、代码审查、问题跟踪、活动反馈和wiki
# docker pull beginor/gitlab-ce
创建共享卷目录
# mkdir -p /data/gitlab/etc/ /data/gitlab/log /data/gitlab/data
# chmod 777 /data/gitlab/etc/ /data/gitlab/log /data/gitlab/data
创建 gitlab 容器
# docker run -itd --name=gitlab --restart=always --privileged=true -p 8443:443 -p 80:80 -p 222:22 -v /data/gitlab/etc:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab beginor/gitlab-ce
c0a38eb336535abac18f9d07c9ef18e52e7a1d684c7612f9f0382fc75c67419c
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0a38eb33653 beginor/gitlab-ce "/assets/wrapper" 2 hours ago Up 51 minutes (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp gitlab
切记:这里的端口要设置成80,要不push项目会提示没有报错,如果宿主机端口被占用,需要把这个端口腾出来
关闭容器修改配置文件
docker stop gitlab
修改external_url 'http://10.130.77.55’
# cat /data/gitlab/etc/gitlab.rb | grep external_url
##! For more details on configuring external_url see:
# external_url 'GENERATED_EXTERNAL_URL'
# registry_external_url 'https://registry.gitlab.example.com'
# pages_external_url "http://pages.example.com/"
# gitlab_pages['artifacts_server_url'] = nil # Defaults to external_url + '/api/v4'
# mattermost_external_url 'http://mattermost.example.com'
# sed -i "/external_url 'GENERATED_EXTERNAL_URL'/a external_url\t'http://10.130.77.55' " /data/gitlab/etc/gitlab.rb
# cat /data/gitlab/etc/gitlab.rb | grep external_url
##! For more details on configuring external_url see:
# external_url 'GENERATED_EXTERNAL_URL'
external_url 'http://10.130.77.55'
# registry_external_url 'https://registry.gitlab.example.com'
# pages_external_url "http://pages.example.com/"
# gitlab_pages['artifacts_server_url'] = nil # Defaults to external_url + '/api/v4'
# mattermost_external_url 'http://mattermost.example.com'
修改gitlab_rails[‘gitlab_ssh_host’] = '10.130.77.55’
# cat /data/gitlab/etc/gitlab.rb | grep gitlab_ssh_host
# gitlab_rails['gitlab_ssh_host'] = 'ssh.host_example.com'
# sed -i "/gitlab_ssh_host/a gitlab_rails['gitlab_ssh_host'] = '10.130.77.55' " /data/gitlab/etc/gitlab.rb
# cat /data/gitlab/etc/gitlab.rb | grep gitlab_ssh_host
# gitlab_rails['gitlab_ssh_host'] = 'ssh.host_example.com'
gitlab_rails['gitlab_ssh_host'] = '10.130.77.55'
修改gitlab_rails[gitlab_shell_ssh_port] = 222
# cat /data/gitlab/etc/gitlab.rb | grep gitlab_shell_ssh
# gitlab_rails['gitlab_shell_ssh_port'] = 22
# sed -i "/gitlab_shell_ssh_port/a gitlab_rails['gitlab_shell_ssh_port'] = 222" /data/gitlab/etc/gitlab.rb
# cat /data/gitlab/etc/gitlab.rb | grep gitlab_shell_ssh
# gitlab_rails['gitlab_shell_ssh_port'] = 22
gitlab_rails[gitlab_shell_ssh_port] = 222
编辑gitlab.yml配置文件
# mkdir -pv /data/gitlab/data/gitlab-rails/
# vim /data/gitlab/data/gitlab-rails/gitlab.yml
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 10.130.77.55
port: 80
https: false
修改完配置文件之后,启动容器
# docker start gitlab
在宿主机所在的物理机访问,http://10.130.77.55/ ,会自动跳转到修改密码(root用户),如果密码设置的没有满足一定的复杂性,则会报500,需要从新设置
登录进入仪表盘
然后简单测试一下,push一个项目上去,这里的项目是一个基于hexo的博客系统
相关的git命令
> git init
> git config --global user.name "Administrator"
> git config --global user.email "admin@example.com"
> git remote add origin http://10.130.77.55/root/blog.git
> git add .
> git commit -m "Initial commit"
> git push -u origin master
2. 安装配置远程镜像仓库harbor
这里仓库我们选择harbor,因为有web页面,当然也可以使用 registry
harbor部署教程:harbor仓库搭建
CI服务器的docker配置
这里因为我们要在10.130.77.55(CI服务器)上push镜像到10.130.77.50(私仓),所有需要修改CI服务器上的Docker配置。添加仓库地址
操作服务器:10.130.77.50
# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://kwk8mr4s.mirror.aliyuncs.com"]
}
修改配置文件
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://kwk8mr4s.mirror.aliyuncs.com"],
"insecure-registries": ["10.130.77.50"]
}
加载配置使其生效
# systemctl daemon-reload
# systemctl restart docker
CI机器简单测试一下
# docker login 10.130.77.50
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# docker pull busybox:latest
# docker tag busybox 10.130.77.50/demo/busybox
# docker push 10.130.77.50/demo/busybox
在私仓的web页面查看,是否正常推送镜像
3. 安装配置jenkins
操作服务器:10.130.77.55
镜像jenkins拉取
# docker pull jenkins/jenkins:centos7-jdk8
# docker history jenkins/jenkins:centos7-jdk8
创建共享卷,修改所属组和用户,和容器里相同
这里为什么要改成 1000,是因为容器里是以 jenkins 用户的身份去读写数据,而在容器里jenkins 的 uid 是 1000
# mkdir /jenkins && chown 1000:1000 /jenkins
创建创建 jenkins 容器
# docker run -dit -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always -v /jenkins:/var/jenkins_home jenkins/jenkins:centos7-jdk8
#docker ps | grep jenkins
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
597f8eb9f5ca jenkins/jenkins:centos7-jdk8 "/sbin/tini -- /usr/…" 4 seconds ago Up 1 second 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins
访问jenkins
先打开浏览器打开这个页面,让其初始化一下,直到看到界面
因为要修改 jenkins 的配置,所以此时关闭 jenkins 容器,修改配置文件
# docker stop jenkins
更换国内清华大学镜像,Jenkins下载插件特别慢,更换国内的清华源的镜像地址会快不少
# cat /jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
# sed -i 's#updates.jenkins.io/update-center.json#mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json#g ' /jenkins/hudson.model.UpdateCenter.xml
# cat /jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
“http://www.google.com/” 替换为 “http://www.baidu.com/”
# yum -y install jq
# cat /jenkins/updates/default.json | jq '.connectionCheckUrl'
"https://www.google.com/"
# cat /jenkins/updates/default.json | jq 'keys'
[
"connectionCheckUrl",
"core",
"deprecations",
"generationTimestamp",
"id",
"plugins",
"signature",
"updateCenterVersion",
"warnings"
]
# sed -i s#https://www.google.com/#http://www.baidu.com/#g /jenkins/updates/default.json
替换后查看
# cat /jenkins/updates/default.json | jq '.connectionCheckUrl'
"https://www.google.com/"
# cat /jenkins/updates/default.json | jq 'keys'
[
"connectionCheckUrl",
"core",
"deprecations",
"generationTimestamp",
"id",
"plugins",
"signature",
"updateCenterVersion",
"warnings"
]
重启docker,获取登录密匙
# docker start jenkins
# cat /jenkins/secrets/initialAdminPassword
dfc124a075ec4624b2ca48678ddba0eb
需要修改jenkins绑定的docker的启动参数
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock
修改镜像库启动参数后需要重启docker
# systemctl daemon-reload
# systemctl restart docker
安装 docker 插件
jenkins相关配置,这里的配置照着图片就好,需要配置一个docker集群供jenkins来根据Dockerfile构建镜像并push到私仓,这里docker集群即为CI服务器的docker
jenkins 安全设置
后面 gitlab 要和 jenkins 进行联动,所以必须要需要对 jenkins 的安全做一些设置,依次点击 系统管理-全局安全配置-授权策略,勾选"匿名用户具有可读权限"
添加 JVM 运行参数 -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true 运行跨站请求访问
# docker exec -u root -it jenkins bash
[root@4cca7ce1ba02 /]# ls
anaconda-post.log bin config dev etc home kubectl lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@4cca7ce1ba02 /]# vi /usr/local/bin/jenkins.sh
[root@4cca7ce1ba02 /]# exit
下载kubectl客户端工具
这里的话我们要通过jenkins上的kubectl客户端连接k8s,所以我们需要安装一个k8s的客户端kubectl,下载k8s客户端
# wget https://storage.googleapis.com/kubernetes-release/release/v1.22.2/bin/linux/amd64/kubectl
# yum install -y kubectl-1.22.2-0 --disableexcludes=kubernetes
拷贝 kubeconfig 文件
拷贝kubeconfig 证书,k8s集群中查看证书位置,这里的证书是之前创建好的
评论区