侧边栏壁纸
博主头像
zyixin

当你觉得为时已晚的时候,恰恰是最早的时候

  • 累计撰写 64 篇文章
  • 累计创建 0 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

搭建CI/CD平台:Gitlab+Jenkins+Docker+Harbor+K8s集群

zyixin
2022-08-24 / 0 评论 / 3 点赞 / 2,839 阅读 / 2,478 字
温馨提示:
本文最后更新于 2023-02-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
用到的机器 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

Gitlab中文社区docker镜像

创建共享卷目录

# 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,需要从新设置
Gitlab修改密码

Gitlab登陆

登录进入仪表盘
Gitlab创建第一个项目

Gitlab创建第一个项目2

Gitlab创建第一个项目3

然后简单测试一下,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页面查看,是否正常推送镜像
harbor仓库项目

3. 安装配置jenkins

操作服务器:10.130.77.55

镜像jenkins拉取

# docker pull jenkins/jenkins:centos7-jdk8

# docker history jenkins/jenkins:centos7-jdk8

jenkinx官网

创建共享卷,修改所属组和用户,和容器里相同

这里为什么要改成 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
jenkinx登陆1
先打开浏览器打开这个页面,让其初始化一下,直到看到界面
jenkinx登陆2

因为要修改 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
jenkinx登陆3

jenkinx登陆4

jenkinx登陆5

jenkinx登陆6

jenkinx登陆7

jenkinx插件安装

jenkinx插件安装2

jenkinx插件安装2

jenkinx插件安装2

jenkinx插件安装2

jenkinx插件安装2

jenkinx配置png

jenkinx配置png

jenkins 安全设置

后面 gitlab 要和 jenkins 进行联动,所以必须要需要对 jenkins 的安全做一些设置,依次点击 系统管理-全局安全配置-授权策略,勾选"匿名用户具有可读权限"
jenkinx配置png

jenkinx配置png

添加 JVM 运行参数 -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true 运行跨站请求访问
jenkinx配置5

# 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集群中查看证书位置,这里的证书是之前创建好的


3

评论区