Jenkins CI/CD on Kubernetes with dynamic slaves
本文檔介紹如何通過在 Kubernetes 集群上創建並配置 Jenkins Server 實現應用開發管理的 CI/CD 流程,並且利用 Kubernetes-Jenkins-Plugin 實現動態按需擴展 jenkins-slave。
步驟 1 安裝 Kubernetes 集群
如果您沒有 Kubernetes 集群,您需要先創建一個。具體操作參見 部署 Kubernetes 集群。
步驟 2 連接 Kubernetes 集群
有關如何連接到 Kubernetes 集群,參見 通過 kubectl 連接 Kubernetes 集群。
步驟 3 創建 NAS 持久化卷
註意:為了讓您的 Jenkins Server 可以具有 Fail Over 的能力,建議您將 Jenkins 的數據存儲到阿裏雲 NAS 存儲上。
有關如何創建 Kubernetes 持久化 NAS 存儲卷,參見 使用 NAS 數據卷。
假設您已經在阿裏雲控制臺上面創建了您自己的 NAS 存儲,其掛載點為 yournas-xxxx.cn-hangzhou.nas.aliyuncs.com
。執行下面的命令下載一個 persistent volume 模板,替換裏面的 server 的值為您的掛載點,然後執行 kubectl apply -f pv.yml
創建持久化 NAS 卷。
root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fpersistent-volume.yml > pv.yml
root@iZbp:~/jenkins# vi pv.yml
root@iZbp:~/jenkins# kubectl apply -f pv.yml
root@iZbp:~/jenkins# kubectl get pv -n ci
步驟 4 創建 Jenkins Server
通過以下命令啟動一個 Jenkins Server。該命令會創建一個阿裏雲公網負載均衡,方便您從公網訪問 Jenkins 服務。如果不需要公網訪問請將 Service 的 type 更改為 NodePort。
root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fjenkins.yml > jenkins.yml
root@iZbp:~/jenkins# kubectl apply -f jenkins.yml
root@iZbp:~/jenkins# kubectl get po -n ci
root@iZbp:~/jenkins# kubectl get svc -n ci
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins 172.19.0.10 40.112.120.10 53/UDP,53/TCP 34m
然後,您就可以通過地址 http://40.112.120.10
訪問 Jenkins 服務了。
步驟 5 配置 Jenkins
-
訪問上面的 Jenkins 地址
http://40.112.120.10
,如下圖所示。 -
您需要使用 token 來初始化 Jenkins。該 token 文件存放在
secrets/initialAdminPassword
下,您需要手動掛載 NAS 到本地目錄後查看 token 的內容。您需要將以下命令中的yournas-xxxx.cn-hangzhou.nas.aliyuncs.com
替換為您自己的掛載點。root@iZbp:~/jenkins# mkdir -p mnt
root@iZbp:~/jenkins# mount.nfs yournas-xxxx.cn-hangzhou.nas.aliyuncs.com:/ mnt
root@iZbp:~/jenkins# cat mnt/secrets/initialAdminPassword
7b48377b16ef49a8ba678031dd12111a
註意: 如果提示未找到
mount.nfs
命令,則需要先安裝nfs-utils
包。 -
將上面輸出的 token 粘貼到界面上的輸入框中並單擊 Continue。
-
單擊 Select plugins to install,安裝插件。
-
由於連接國外的網絡問題,ant 插件不一定能下載成功,建議您先去掉 ant 插件安裝。單擊 Install 並等待安裝完成。
-
設置用戶名和密碼,並單擊 Save and Finish。
至此,您就成功的創建了一個 Jenkins server。
步驟 6 配置 Kubernetes-jenkins-plugin 實現 dynamic slaves provision
-
安裝 Kubernetes-plugin。
-
單擊 系統管理 > 管理插件 > 可選插件,搜索
kubernetes plugin
,勾選要安裝的插件,然後單擊 直接安裝。 -
勾選 安裝完成後重啟 Jenkins。等待重啟完成後 kubernetes-plugin 就安裝完成了。
-
-
配置 Jenkins kubernetes-plugin 插件。
-
單擊 系統管理 > 系統設置,找到 雲,然後單擊 新增一個雲。
-
填寫配置參數,並單擊 Apply。
其中:
- Name:kubernetes
- kubernetes URL:
https://kubernetes.default.svc.cluster.loca
l - Disable https certificate check:true
- Jenkins URL:
http://jenkins-svc.ci.svc.cluster.local
- Connect Timeout:5
- Read Timeout:15
-
這樣就配置好了 kubernetes-plugin,可以實現動態 jenkins-slaves in pod.
步驟 7 Jenkins CI
-
新建一個 Pipeline 任務。
-
將下面的內容粘貼到 pipeline Script 裏,並單擊 保存。
podTemplate(label: ‘golang-pod‘, containers: [
containerTemplate(
name: ‘golang‘,
image: ‘registry.cn-hangzhou.aliyuncs.com/spacexnice/golang:1.8.3-docker‘,
ttyEnabled: true,
command: ‘cat‘
),
containerTemplate(
name: ‘jnlp‘,
image: ‘registry.cn-hangzhou.aliyuncs.com/google-containers/jnlp-slave:alpine‘,
args: ‘${computer.jnlpmac} ${computer.name}‘,
command: ‘‘
)
]
,volumes: [
/*persistentVolumeClaim(mountPath: ‘/home/jenkins‘, claimName: ‘jenkins‘, readOnly: false),*/
hostPathVolume(hostPath: ‘/root/work/jenkins‘, mountPath: ‘/home/jenkins‘),
hostPathVolume(hostPath: ‘/var/run/docker.sock‘, mountPath: ‘/var/run/docker.sock‘),
hostPathVolume(hostPath: ‘/tmp/‘, mountPath: ‘/tmp/‘),
])
{
node (‘golang-pod‘) {
container(‘golang‘) {
git url: ‘https://github.com/spacexnice/blog.git‘ , branch: ‘code‘
stage(‘Build blog project‘) {
sh("make")
}
}
}
}
-
單擊 開始構建。
通過構建日誌觀察任務的執行情況,您會發現 Jenkins Server 會通過 Kubernetes 啟動一個 Pod 作為 Jenkins slave 執行構建 Pipeline。
Jenkins CI/CD on Kubernetes with dynamic slaves