基於Jenkins + Kubernetes實踐
概述
本文將介紹兩個令人驚奇和相當有趣的技術實踐。一個是Jenkins,一個流行的持續整合/釋出的工具,另一個是Kubernetes,一個流行的容器編排引擎。
文章主要分為兩部分:在kubernetes叢集中部署jenkins叢集;利用jenkins的kubernetes plugin實現對jenkins slave的動態管理
架構如下
部署jenkins
建立jenkins-rbac.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: jenkins namespace: kube-ops --- kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: jenkins namespace: kube-ops rules: - apiGroups: [""] resources: ["pods"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/exec"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/log"] verbs: ["get","list","watch"] - apiGroups: [""] resources: ["secrets"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: RoleBinding metadata: name: jenkins namespace: kube-ops roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: jenkins subjects: - kind: ServiceAccount name: jenkins namespace: kube-ops
建立jenkins-deployment.yaml
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: jenkins namespace: kube-ops spec: template: metadata: labels: app: jenkins spec: terminationGracePeriodSeconds: 10 serviceAccountName: jenkins containers: - name: jenkins image: jenkins/jenkins:lts imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: web protocol: TCP - containerPort: 50000 name: agent protocol: TCP resources: limits: cpu: 2000m memory: 4Gi requests: cpu: 1000m memory: 2Gi livenessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 readinessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 volumeMounts: - name: jenkinshome subPath: jenkins mountPath: /var/jenkins_home env: - name: LIMITS_MEMORY valueFrom: resourceFieldRef: resource: limits.memory divisor: 1Mi - name: JAVA_OPTS value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 -Duser.timezone=Asia/Shanghai securityContext: fsGroup: 1000 volumes: - name: jenkinshome emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: jenkins namespace: kube-ops labels: app: jenkins spec: selector: app: jenkins type: NodePort ports: - name: web port: 8080 targetPort: web - name: agent port: 50000 targetPort: agent
由於臨時測試所以上述deployment.yaml中volume我採用的是empyDir。我們也可以使用PVC、Hostpath來實現持久化。
建立namespace
kubectl create namespace kube-ops
建立ServiceAccount
kubectl create -f jenkins-rbac.yaml
建立deployment和service
kubectl create -f jenkins-deployment.yaml
檢視service暴露埠
kubectl get svc -n kube-ops NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins NodePort 10.105.89.206 <none> 8080:31347/TCP,50000:30414/TCP 20h
jenkins部署完成
配置jenkins
1、登陸jenkiins:因為是NodePort模式,所以我們可以使用主機IP+埠的方式訪問Jenkins
密碼檢視/var/jenkins_home/secrets/initialAdminPassword
檔案
2、選擇安裝推薦外掛
3、等待安裝完成,點選下一步,繼續使用admin使用者
4、進入jenkins主介面
5、安裝常用外掛
點選系統管理 ——> 外掛管理,選擇要安裝的外掛
6、安裝完上述常用外掛之後,配置kubernetes
點選系統管理 ——> 系統設定 ——> Add a new cloud ——> 選擇kubernetes,填寫相關資訊
可以通過連線測試確定kubernetes地址連線是否正常
7、配置Pod Template
點選Advanced,配置高階選項
建議配置CPU、MEM資源。否則後期執行Job可能回報如下錯誤
配置volume
該配置為了實現docker in docker
配置完成點選儲存
通過jenkins建立pipeline實現slave動態配置
1、新建job,選擇free style
2、通過label選擇slave節點
3、配置執行shell
儲存配置
4、開始構建,點選立即構建
可以看到構建任務在執行
構建任務執行的同時我們可以點選系統管理 ——> 節點管理,可以檢視臨時新建的工作slave,構建完成之後刪除該slave。
檢視Console Output可以看到整個pipeline的輸出資訊,例如:slave節點,shell輸出等。
5、通過自定義pipeline
建立一個自定義pipeline,配置pipeline script
構建輸出如下圖
到這裡就完成了jenkins在kubernetes中的部署,以及jenkins通過kubernetes plugin實現對jenkins slave的動態管理。