DevOps 平台建设
首先先来学习下在 Kubernetes 中进行 CICD 的过程,一般的步骤如下:
- 在 GitLab 中创建对应的项目;
- 配置 Jenkins 集成 Kubernetes 集群,后期 Jenkins 的 Slave 将是在 Kubernetes 中动态创建的 Slave;
- Jenkins 创建对应的任务(Job),集成该项目的 Git 地址和 Kubernetes 集群;
- 开发者将代码提交到 GitLab;
- 如有配置钩子,推送(Push)代码会自动触发 Jenkins 构建,如没有配置钩子,需要手动构建;
- Jenkins 控制 Kubernetes (使用的是 Kubernetes 插件) 创建 Jenkins Slave (Pod 形式);
- Jenkins Slave 根据流水线(Pipeline)定义的步骤执行构建;
- 通过 Dockerfile 生成镜像;
- 将镜像提送(Push)到私有 Harbor(或者其它的镜像仓库);
- Jenkins 再次控制 Kubernetes 进行最新的镜像部署;
- 流水线结束删除JenkinsSlave。
Jenkins 安装(Docker)
首先需要一个 Linux 服务器,配置不低于 2C4G 和 40G 硬盘。首先安装 Docker:
1
2
3
4# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# yum install docker-ce-19.03.* docker-ce-cli-19.03.* -y # systemctl daemon-reload && systemctl enable --now docker创建 Jenkins 的数据目录,防止容器重启后数据丢失:
1
2# mkdir /data/jenkins_data -p
# chmod 777 -R /data/jenkins_data启动 Jenkins 容器,并配置管理员账号密码为 admin / admin123
1
2
3
4
5
6
7
8
9
10docker run -d \
--name=jenkins \
--restart=always \
-e JENKINS_PASSWORD=admin123 \
-e JENKINS_USERNAME=admin \
-e JENKINS_HTTP_PORT_NUMBER=8080 \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins_data:/bitnami/jenkins \
bitnami/jenkins:2.303.1-debian-10-r29其中 8080 端口为 Jenkins Web 界面的端口,50000 是 jnlp 使用的端口,后期 Jenkins Slave 需要使用 50000 端口和 Jenkins 主节点通信。
安装插件,在安装之前首先配置国内的插件源,点击
Advanced
,将插件源更改为国内插件源 (https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
)。这里需要的插件如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Git
Git Parameter
Git Pipeline for Blue Ocean
GitLab
Credentials
Credentials Binding
Blue Ocean
Blue Ocean Pipeline Editor
Blue Ocean Core JS
Pipeline SCM API for Blue Ocean
Dashboard for Blue Ocean
Build With Parameters
Dynamic Extended Choice Parameter Plug-In
Dynamic Parameter Plug-in
Extended Choice Parameter
List Git Branches Parameter
Pipeline
Pipeline: Declarative
Kubernetes
Kubernetes CLI
Kubernetes Credentials
Image Tag Parameter
Active Choices
GitLab 安装
GitLab 的安装可以参考文章 Linux 环境下安装 GitLab 与配置
Harbor 安装
Harbor 的安装可以参考文章 Harbor 部署安装
注意: 如果配置不是https协议,所有的 Kubernetes 节点的 Docker (如果是 containerd 作为Runtime,可以参考下文配置 insecure-registry) 都需要添加 insecure-registries 配置:
1 | # vi /etc/docker/daemon.json |
如果 Kubernetes 集群采用的是 Containerd 作为的 Runtime,配置 insecure-registry 只需要在 Containerd 配置文件的 mirrors 下添加自己的镜像仓库地址即可:
1 | [plugins."io.containerd.grpc.v1.cri".registry] |
Jenkins 凭证 Credentials
Harbor 的账号密码、GitLab 的私钥、Kubernetes 的证书均使用 Jenkins 的 Credentials 管理。
配置 kubernetes 证书
首先需要找到集群中的 KUBECONFIG
,一般是 kubectl 节点的 ~/.kube/config
文件,或者是 KUBECONFIG
环境变量所指向的文件。接下来只需要把证书文件放置于 Jenkins 的 Credentials 中即可。
首先点击 Manage Jenkins, 之后点击 Manage Credentials,然后点击 global 旁边的小三角,选择 Add Credentials:
在打开的添加凭证页面,将凭证类型改为
Secret file
,然后选择 config 文件,输入 ID 以及描述,点击 OK 添加即可
- File: KUBECONFIG 文件或其它加密文件;
- ID: 该凭证的 ID;
- Description: 证书的描述.
配置 Harbor 账号密码
对于账号密码和 Key 类型的凭证,配置步骤是一致的,只是选择的凭证类型不一样。接下来通过 Jenkins 凭证管理 Harbor 的账号密码。
在同样的位置点击 Add Credentials,然后在凭证添加页面,选择凭证类型为
Username with password
:
- Username: Harbor 或其他平台的用户名;
- Password: Harbor 或者其他平台的密码;
- ID: 该凭证的 ID;
- Description: 证书的描述。
配置 GitLab key
点击 Add Credentials,类型选择为
SSH Username with private key
:
注意:
- Username: 用户名,无强制性,随便填一个都行
- Private Key: Jenkins 服务器的私钥,一般位于 ~/.ssh/id_rsa
- Passphrase: 如果创建私钥时没有设置密码,此处留空即可
添加 Jenkins 的公钥到 GitLab,登录 gitlab,点击用户头像,选择
Edit profile
–>SSH Keys
–> 输入 Jenkins 服务器上的公钥,点击添加即可
配置 Agent
通常情况下,Jenkins Slave 会通过 Jenkins Master 节点的 50000 端口与之通信,所以需要开启 Agent 的 50000 端口。
点击 Manage Jenkins,然后点击 Configure Global Security,在安全配置下方找到 Agents,点击 Fixed,输入 50000 即可:
实际使用时,没有必要把整个 Kubernetes 集群的节点都充当创建 Jenkins Slave Pod 的节点,可以选择任意的一个或多个节点作为创建 Slave Pod 的节点。假设将 k8s-node-03 作为 slave 节点,给 k8s-node-03 打一个标签
1
2# kubectl label nodes k8s-node-03 build=true
node/k8s-node-03 labeled注意: 如果集群并非使用 Docker 作为 Runtime,但是由于构建镜像时,需要使用 Docker,所以该节点需要安装 Docker
Jenkins 配置 Kubernetes 多集群
首先点击 Manage Jenkins,之后点击 Manage Nodes and Clouds
选择 Configure Clouds,点击 Add a new cloud,选择 kubernetes:
在 Name 字段除,输入集群的名称,一般填写可识别的名称即可。之后点击
Kubernetes Cloud details
在 Credentials 处选择之前添加 Kubernetes 证书,选择后点击 Test Connection,最后在凭证下方即可看到能否正常连接的结果:
最后点击 Save 即可,添加完 Kubernetes 后,在 Jenkinsfile 的 Agent 中,就可以选择该集群 作为创建 Slave 的集群。
如果想要添加多个集群,重复上述的步骤即可。首先添加 Kubernetes 凭证,然后添加 Cloud 即可。