Helm部署和體驗jenkins

  • 2019 年 12 月 26 日
  • 筆記

運行在Kubernetes上的Jenkins

下圖來自rancher官方博客,在kubernetes環境下,jenkins任務被交給各個pod執行,這些pod在需要時被創建,任務結束後被銷毀,這樣既能合理利用資源,又能給每個任務提供一致的乾淨的初始化環境(也可以保留pod,如查問題的時候)

如何在kubernetes快速部署jenkins

通過Helm可以快速且簡單的部署多種應用,關於helm的安裝和使用請參考《部署和體驗Helm(2.16.1版本) 》

環境信息

本次實戰的環境信息如下: 1. kubernetes集群:三台CentOS7.7服務器 2. kubernetes版本:1.15.3 3. helm版本:2.16.1 4. jenkins版本:2.190.3

準備工作

除了提前準備好kubernetes環境,還需要做好以下準備工作:

  1. 準備好helm,您可以參考《部署和體驗Helm(2.16.1版本) 》
  2. 準備好NFS服務,這樣就算jenkins的pod被銷毀重建,也不會丟失數據,NFS服務的搭建您可以參考《Ubuntu16環境安裝和使用NFS》; 準備完成後可以開始實戰了

本次實戰的namespace

本次實戰使用名為helm-jenkins的namespace,執行以下命令創建:

kubectl create namespace helm-jenkins

創建PV

為了後面的jenkins服務順利啟動,需要預先部署好pv:

  1. 新建名為pv-helm-jenkins.yaml的文件,內容如下,其中192.168.133.142是NFS服務器地址,/usr/local/work/test/002是分配給本次實戰使用的NFS文件夾:
apiVersion: v1  kind: PersistentVolume  metadata:   name: helm-jenkins   namespace: helm-jenkins  spec:   capacity:   storage: 10Gi   accessModes:   - ReadWriteOnce   persistentVolumeReclaimPolicy: Recycle   nfs:   path: /usr/local/work/test/002   server: 192.168.133.142
  1. 執行命令kubectl create -f pv-helm-jenkins.yaml,創建PV;
  2. 查看PV是否已經就緒:
[root@node1 helm-jenkins]# kubectl get pv  NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE  helm-jenkins 10Gi RWO Recycle Available 5s   14h

helm安裝jenkins

  1. 確保helm2.16.1版本安裝完畢,並且可以正常工作:
[root@node1 helm-jenkins]# helm version  Client: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}  Server: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
  1. 確保以下helm repo準備好(如果沒有可以通過helm repo add添加):
[root@node1 helm-jenkins]# helm repo list  NAME URL  stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  1. 執行以下命令,即可創建jenkins的deployment、service等資源:
helm install --namespace helm-jenkins --name my-jenkins stable/jenkins
  1. 執行完畢後,控制台輸出以下內容:
NOTES:  5. Get your 'admin' user password by running:   printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo  6. Get the Jenkins URL to visit by running these commands in the same shell:   NOTE: It may take a few minutes for the LoadBalancer IP to be available.   You can watch the status of by running 'kubectl get svc --namespace helm-jenkins -w my-jenkins'   export SERVICE_IP=$(kubectl get svc --namespace helm-jenkins my-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")   echo http://$SERVICE_IP:8080/login    7. Login with the password from step 1 and the username: admin

上述內容的第一條給出重要提示:獲取admin賬號密碼的方法,執行以下命令即可:

printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

如下圖紅框所示,我這裡得到了admin密碼為Eq6WxHvJ2V:

8. 檢查服務,發現helm-jenkins這個namespace下有兩個服務:my-jenkins和my-jenkins-agent,前者就是jenkins網站,後者用來接收執行任務的jenkins實例的註冊:

[root@node1 helm-jenkins]# kubectl get svc -n helm-jenkins  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE  my-jenkins LoadBalancer 10.233.10.35 <pending> 8080:31763/TCP 31m  my-jenkins-agent ClusterIP 10.233.35.20 <none> 50000/TCP 31m
  1. my-jenkins這個服務的類型是LoadBalancer,8080端口被映射到宿主機的31763端口,因此,使用kubernetes集群中一台宿主機的IP,再加上31763端口即可通過瀏覽器訪問; 至此,jenkins安裝已完成,接下來要做必要的設置

設置kubernetes插件

為了讓jenkins在以下模式工作,還需要設置kubernetes插件

  1. 點擊下圖紅框中的"Manage Jenkins",進入設置頁面:
  1. 由於很多插件版本較舊,頁面上會有升級提示,這裡暫時用不到,因此直接點擊下圖紅框中的"Configure System":
  1. 點擊下圖紅框1中的"Test Connection」按鈕,您會見到紅框2中的錯誤信息:
  1. 產生上述錯誤的原因,是由於jenkins容器沒有權限訪問kubernetes的api server,為了解決此問題,要先搞清楚容器的身份,我們知道容器在kubernetes環境中都有自己的serviceaccount,執行命令kubectl get serviceaccount -n helm-jenkins查看當前namespace下的serviceaccount:
[root@node1 helm-jenkins]# kubectl get serviceaccount -n helm-jenkins  NAME SECRETS AGE  default 1 3h55m

可見jenkins容器的serviceaccount是default 4. 知道了容器的serviceaccount,上述問題就好解決了,我們用RBAC將訪問api server所需權限綁定給default即可,這裡為了省事兒就不將權限一一列出了,接下來直接給default最高權限(生產環境千萬別這麼做,必須按需分配); 5. 新建名為rbac-helm-jenkins-default.yaml的文件,內容如下:

apiVersion: rbac.authorization.k8s.io/v1  kind: ClusterRoleBinding  metadata:   name: rbac-helm-jenkins-default   namespace: helm-jenkins  roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: cluster-admin  subjects:  - kind: ServiceAccount   name: default   namespace: helm-jenkins
  1. 執行命令kubectl create -f rbac-helm-jenkins-default.yaml使得RBAC生效
  2. 再次回到之前的頁面點擊"Test Connection"按鈕,如下圖,提示"Connection successful":
  1. 接下來設置Pod模板參數,如下圖,namepsace要設置為helm-jenkins,另外要記下來Labels的值my-jenkins-jenkins-slave,後面會用到:
  1. 點擊底部的"Save"按鈕,使設置生效;
  2. 設置完畢,接下來創建任務體驗一下kubernetes上的jenkins功能

體驗Freestyle project

  1. 創建一個Freestyle project,如下圖:
  1. 如下圖紅框,表單中Label Expression的值是前面記下來的my-jenkins-jenkins-slave:
  1. 本次任務的具體內容很簡單,執行一段shell,輸出"Hello World!",如下圖所示:
  1. 點擊底部的"Save"按鈕保存
  2. 點擊下圖紅框中的"Build Now",即可開始構建:
  1. 如果是第一次執行,會觸發jenkins任務pod的docker鏡像的下載,您需要耐心等候一會兒;
  2. 此時去控制台執行命令kubectl get pods -n helm-jenkins查看pod,會發現有新的pod出現,如下所示,這是執行jenkins任務的pod:
[root@node1 helm-jenkins]# kubectl get pods -n helm-jenkins  NAME READY STATUS RESTARTS AGE  default-66vcq 0/1 ContainerCreating 0 1s  my-jenkins-74bcdfc566-jbw28 1/1 Running 0 5h5m
  1. 返回jenkins頁面,可見任務已經執行完畢:
  1. 再去控制台查看pod,發現剛剛創建的pod已經消失了
  2. 至此,kubernetes環境部署和體驗jenkins的實戰就完成了,希望本文帶給您一些參考信息。