­

這是我看過最詳細的k8s中部署Jenkins教程

  • 2019 年 12 月 25 日
  • 筆記

原文地址:http://www.mydlq.club/article/6/

前幾天發過一篇部署Jenkins的文章:

5分鐘搞定在k8s上部署jenkins,並提供域名訪問

使用的HostPath的方式,今天看到一篇用NFS做存儲,且更為詳細的文章推薦給大家。

目錄[-]

一、設置存儲目錄

1、安裝 NFS 服務端

2、掛載 NFS 並設置存儲文件夾

二、創建 PV & PVC

1、準備 PV & PVC 部署文件

2、創建 PV & PVC

三、創建 ServiceAccount & ClusterRoleBinding

四、創建 Service & Deployment

1、創建 Service & Deployment 部署文件

2、部署 Jenkins

五、獲取 Jenkins 生成的 Token

六、啟動 Jenkins 進行安裝

1、進入Jenkins

2、安裝插件

3、設置用戶名、密碼

七、其他

1、插件因網路問題安裝失敗


系統環境:

  • kubernetes 版本:1.14.0
  • jenkins 版本:2.172
  • jenkins 部署示例文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins-deploy

一、設置存儲目錄

在 Kubenetes 環境下所起的應用都是一個個 Docker 鏡像,為了保證應用重啟的情況下數據安全,所以需要將 Jenkins 持久化到存儲中。這裡用的是 NFS 網路存儲,方便在 Kubernetes 環境下應用啟動節點轉義數據一致。當然也可以選擇存儲到本地,但是為了保證應用數據一致,需要設置 Jenkins 固定到某一 Kubernetes 節點。

1、安裝 NFS 服務端

詳情請看 CentOS7 搭建 nfs 伺服器 ,這裡不過多敘述。

2、掛載 NFS 並設置存儲文件夾

如果不能直接操作 NFS 服務端創建文件夾,需要知道 NFS 伺服器地址,然後將其掛在到本地目錄,進入其中創建 Jenkins 目錄空間。

(1)、掛載 NFS

$ mount -o vers=4.1 192.168.2.11:/nfs/ /nfs  

(2)、在 NFS 共享存儲文件夾下創建存儲 Jenkins 數據的文件夾

$ mkdir -p /nfs/data/jenkins  

二、創建 PV & PVC

創建 PV 綁定 NFS 創建的 Jenkins 目錄,然後創建 PVC 綁定這個 PV,將此 PVC 用於後面創建 Jenkins 服務時掛載的存儲。

1、準備 PV & PVC 部署文件

一定要確保 PV 的空間大於 PVC,否則無法關聯

jenkins-pv-pvc.yaml

apiVersion: v1  kind: PersistentVolume  metadata:    name: jenkins    labels:      app: jenkins  spec:    capacity:      storage: Gi    accessModes:      - ReadWriteOnce    persistentVolumeReclaimPolicy: Retain    mountOptions:   #NFS掛在選項      - hard      - nfsvers=4.1    nfs:            #NFS設置      path: /nfs/data/jenkins      server: 192.168.2.11  ---  kind: PersistentVolumeClaim  apiVersion: v1  metadata:    name: jenkins  spec:    accessModes:      - ReadWriteOnce    resources:      requests:        storage: Gi			#生產環境空間一定要設置比較大點    selector:      matchLabels:        app: jenkins  

2、創建 PV & PVC

提前將 namespace 修改成你自己的 namespace

  • -n:指定 namespace
$ kubectl apply -f jenkins-pv-pvc.yaml -n public  

三、創建 ServiceAccount & ClusterRoleBinding

此 kubernetes 集群用的是 RBAC 安全插件,必須創建許可權給一個 ServiceAccount,然後將此 ServiceAccount 綁定到 Jenkins 服務,這樣賦予 Jenkins 服務一定許可權執行一些操作,為了方便,這裡將 cluster-admin 綁定到 ServiceAccount 以保證 Jenkins 能擁有一定的許可權。

注意:請提前修改 yaml 中的 namespace

(1)、jenkins-rbac.yaml

apiVersion: v1  kind: ServiceAccount  metadata:    name: jenkins-admin       #ServiceAccount名    namespace: mydlqcloud     #指定namespace,一定要修改成你自己的namespace    labels:      name: jenkins  ---  kind: ClusterRoleBinding  apiVersion: rbac.authorization.k8s.io/v1beta1  metadata:    name: jenkins-admin    labels:      name: jenkins  subjects:    - kind: ServiceAccount      name: jenkins-admin      namespace: mydlqcloud  roleRef:    kind: ClusterRole    name: cluster-admin    apiGroup: rbac.authorization.k8s.io  

(2)、創建 RBAC 命令

$ kubectl create -f jenkins-rbac.yaml  

四、創建 Service & Deployment

這裡開始部署 Jenkins 服務,創建 Service 與 Deployment,其中 Service 暴露兩個介面 80880 與 50000。而 Deployment 裡面要注意的是要設置上面創建的 ServiceAccount ,並且設置容器安全策略為「runAsUser: 0」以 Root 許可權運行容器,而且暴露8080、50000兩個埠。

1、創建 Service & Deployment 部署文件

jenkins-deployment.yaml

apiVersion: v1  kind: Service  metadata:    name: jenkins    labels:      app: jenkins  spec:    type: NodePort    ports:    - name: http      port:           #服務埠      targetPort:      nodePort: 		#NodePort方式暴露 Jenkins 埠    - name: jnlp      port:          #代理埠      targetPort:      nodePort:    selector:      app: jenkins  ---  apiVersion: apps/v1  kind: Deployment  metadata:    name: jenkins    labels:      app: jenkins  spec:    selector:      matchLabels:        app: jenkins    replicas:    template:      metadata:        labels:          app: jenkins      spec:        serviceAccountName: jenkins-admin        containers:        - name: jenkins          image: registry.cn-shanghai.aliyuncs.com/mydlq/jenkins:2.172          securityContext:            runAsUser:        #設置以ROOT用戶運行容器            privileged: true   #擁有特權          ports:          - name: http            containerPort:          - name: jnlp            containerPort:          resources:            limits:              memory: Gi              cpu: "1000m"            requests:              memory: Gi              cpu: "500m"          env:          - name: LIMITS_MEMORY            valueFrom:              resourceFieldRef:                resource: limits.memory                divisor: Mi          - name: "JAVA_OPTS"  #設置變數,指定時區和 jenkins slave 執行者設置            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                   "          - name: "JENKINS_OPTS"            value: "--prefix=/jenkins"         #設置路徑前綴加上 Jenkins          volumeMounts:                        #設置要掛在的目錄          - name: data            mountPath: /var/jenkins_home        volumes:        - name: data          persistentVolumeClaim:            claimName: jenkins      #設置PVC  

參數說明

  • JAVA_OPTS: JVM 參數設置
  • JENKINS_OPTS: Jenkins 參數設置
  • 設置執行任務時候不等待:

默認情況下,Jenkins生成代理是保守的。例如,如果隊列中有兩個構建,它不會立即生成兩個執行器。它將生成一個執行器,並等待某個時間釋放第一個執行器,然後再決定生成第二個執行器。Jenkins確保它生成的每個執行器都得到了最大限度的利用。如果你想覆蓋這個行為,並生成一個執行器為每個構建隊列立即不等待,所以在Jenkins啟動時候添加這些參數:

  • -Dhudson.slaves.NodeProvisioner.initialDelay=0
  • -Dhudson.slaves.NodeProvisioner.MARGIN=50
  • -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85

2、部署 Jenkins

執行 Kuberctl 命令將 Jenkins 部署到 Kubernetes 集群。

注意:將「-n」後面的 namespace 換成你自己的 namespace

  • -n:指定應用啟動的 namespace
$ kubectl create -f jenkins-deployment.yaml -n mydlqcloud  

五、獲取 Jenkins 生成的 Token

在安裝 Jenkins 時候,它默認生成一段隨機字元串,用於安裝驗證。這裡訪問它的安裝日誌,獲取它生成的 Token 字元串。

(1)、查看 Jenkins Pod 啟動日誌

注意:這裡「-n」指的是要 namespace,後面跟的 namespace 請替換成你jenkins 啟動的 namespace

$ kubectl log $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud  

(2)、查看日誌中生成的 Token 字元串

查看日誌,默認給的token為:

*************************************************************  *************************************************************  *************************************************************  Jenkins initial setup is required. An admin user has been created and a password generated.  Please use the following password to proceed to installation:    3b3e0dda9d6746358ade987775f924ef    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword  *************************************************************  *************************************************************  *************************************************************  

六、啟動 Jenkins 進行安裝

輸入集群地址和 Jenkins Service 提供的 NodePort 埠,訪問 Jenkins 進行安裝步驟,可以按下一步步執行:

1、進入Jenkins

輸入集群地址和上面設置的Nodeport方式的埠 32001,然後輸入上面獲取的 Token 字元串。例如,本人的集群IP為 192.168.2.11 ,所以就可以訪問 http://192.168.2.11:32001/jenkins ,進入後可以看到下面的介面。

2、安裝插件

選擇自定義插件來進行安裝

安裝一些常用的插件,這裡可以選擇一下,推薦安裝下面插件。

確定後可以看到正在安裝插件介面

3、設置用戶名、密碼

然後進入 Jenkins 介面

七、其他

1、插件因網路問題安裝失敗

如果 Jenkins 安裝插件失敗,則可以按一下設置

  • (1)、進入地址 http://192.168.2.11:32001/jenkins/pluginManager/advanced
  • (2)、將最下面的 Update Site 的 URL 地址替換成:http://mirror.esuni.jp/jenkins/updates/update-center.json
  • (3)、點「submit」按鈕,然後點右下角角 「check now」
  • (4)、然後輸入地址 http://192.168.2.11:32001/jenkins/restart 重啟 jenkins 後再重新安裝插件

PS:上面地址替換成你們的集群地址及埠。