$ cat /etc/exports /ifs/kubernetes *(insecure,rw,sync,no_root_squash,fsid=0) $ chmod 777 -R /ifs/kubernetes/
連接:https://share.weiyun.com/IgtuI4xK 密碼:tqm9uf
$ helm version version.BuildInfo{Version:"v3.4.2", GitCommit:"23dd3af5e19a02d4f4baa5b2f242645a1a3af629", GitTreeState:"clean", GoVersion:"go1.14.13"} $ which helm /usr/local/bin/helm
## 準備鏡像 一共用到了兩個鏡像,一個是官方的Jenkins Master鏡像`jenkins/jenkins:lts-alpine`,一個是基於官方的Slave鏡像`jenkins/jnlp-slave:latest`再從新打包的Slave鏡像。 Slave鏡像Dockerfile ```bash FROM jenkins/jnlp-slave:latest USER root #配置時區文件,容器啓動以後能正確獲取到東八區時區信息 RUN echo "/usr/share/zoneinfo/Asia/Shanghai" > /etc/timezone \ && echo "$LANG UTF-8" > /etc/locale.gen \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENTRYPOINT ["jenkins-slave"]
這裏我採用Helm來部署,一方面Helm部署很是方便,另外一方面,我偷懶了。node
$ yum -y install nfs-utils $ mkdir -p /ifs/kubernetes/ $ chmod 777 /ifs/kubernetes/ $ cat /etc/exports /ifs/kubernetes *(insecure,rw,sync,no_root_squash,fsid=0) $ systemctl enable nfs-server $ systemctl start nfs-server
$ yum -y install nfs-utils $ showmount -e 192.168.137.22 #檢查是否NFS部署配置是否正常 $ mount -t nfs 192.168.137.22:/ifs/kubernetes/ /mnt #檢查是否能正常掛載 $ cd /mnt && touch abc.txt #檢查是否能正常讀寫
添加存儲庫:web
helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo update
查看配置的存儲庫:api
helm repo list helm search repo stable
一直在stable存儲庫中安裝charts,你能夠配置其餘存儲庫。bash
刪除存儲庫:服務器
helm repo remove aliyun
$ helm install nfs-prov --set nfs.server=192.168.137.22 --set nfs.path=/ifs/kubernetes stable/nfs-client-provisioner #stable是倉庫名稱 $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client cluster.local/nfs-prov-nfs-client-provisioner Delete Immediate true 39m
這裏要注意,不是全部倉庫都有nfs-client-provisioner chart包,我這裏用的是 https://charts.helm.sh/stable
配置的名稱爲stable倉庫網絡
$ helm repo list NAME URL stable https://charts.helm.sh/stable
測試案例app
$ cat test-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: test-pvc spec: #使用NFS動態供給 storageClassName: nfs-client accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
執行完以後,效果以下圖所示,pvc能自動綁定pv就說明部署成功了dom
部署配置文件ide
--- #PVC申請持久化存儲資源,由於Jenkins的插件、項目信息要持久化保存 apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: jenkins name: jenkins-pvc spec: #使用NFS動態供給 storageClassName: nfs-client accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- #命名空間 apiVersion: v1 kind: Namespace metadata: name: jenkins #配置訪問Jenkins所在集羣的權限 --- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: jenkins name: jenkins-admin namespace: jenkins --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: jenkins-admin namespace: jenkins labels: k8s-app: jenkins roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: jenkins-admin namespace: jenkins --- apiVersion: apps/v1 kind: Deployment metadata: name: jenkins namespace: jenkins labels: app: jenkins spec: replicas: 1 selector: matchLabels: app: jenkins template: metadata: labels: app: jenkins spec: volumes: - name: jenkins-pv-storage persistentVolumeClaim: claimName: jenkins-pvc serviceAccount: "jenkins-admin" containers: - name: jenkins image: jenkins/jenkins:lts-alpine imagePullPolicy: IfNotPresent volumeMounts: - name: jenkins-pv-storage mountPath: /var/jenkins_home ports: - containerPort: 8080 name: web - containerPort: 50000 name: agent --- kind: Service apiVersion: v1 metadata: labels: app: jenkins name: jenkins-svc namespace: jenkins spec: type: ClusterIP ports: - port: 8080 name: web protocol: TCP targetPort: 8080 - port: 50000 name: agent protocol: TCP targetPort: 50000 selector: app: jenkins --- --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: jenkins-ingress namespace: jenkins labels: app: jenkins spec: rules: - host: "jenkins.lxq.com" #這個域名記得要映射成你所在woker節點的IP,若是不用Ingress也能夠,自行再配置下Service Type爲了NodePort就能夠了,並去掉這塊配置 http: paths: - path: / backend: serviceName: jenkins-svc servicePort: 8080
執行應用部署kubectl apply jenkins-deploy.yaml
工具
當jenkins pods 處在running狀態以後,就能夠訪問了
訪問地址: http://jenkins.lxq.com/
, 初步訪問須要安裝相關插件,按照默認的安裝就能夠了,插件安裝完成所需時間受限於你所在的網絡環境。
登陸 Jenkins Master 頁面,點擊 「系統管理」 —> 「管理插件」 —> 「可選插件」 —> 「Kubernetes plugin」 勾選安裝
若是下載慢的話,能夠將Jenkins的插件源改爲國內地址,具體如何修改,請Google相關文檔。
登陸 Jenkins Master 頁面,點擊 「系統管理」 —> 「系統配置」 —> 「Cloud」
新增一個K8s集羣配置
鏈接測試成功以後,會提示以下信息
最後保存退出就能夠了!
新增一個Pipeline構建測試項目,注意要選流水線項目
在流水線部分新增任務定義
//定義參數 def label = "mypod-${UUID.randomUUID().toString()}" //代理定義 podTemplate(label: label, cloud: 'kubernetes', containers: [ containerTemplate(name: 'jnlp', ttyEnabled: true, image: "10.2.7.40/base/jenkins-slave:latest", alwaysPullImage:true), ]) { node(label) { container('jnlp') { stage('Jenkins 動態構建') { sh 'echo hello world!' } } } }
說明:
cloud: 'kubernetes' -- 鏈接的集羣名稱
image: "10.2.7.40/base/jenkins-slave:latest" -- Jenkins Slave鏡像名稱
container('jnlp') -- 生成的agent容器
如圖,動態構建能夠正常工做
關於Pipeline腳本更詳細的解讀,我會在後續再補充說明。