基於Kubernetes部署Jenkins動態構建環境

準備環境和工具

  • 一套K8s環境,這裏個人演示環境是基於v1.18.16版本,關於如何部署能夠參考我這篇文章
    https://blog.51cto.com/4073279/2671639
  • 一臺NFS服務器,並配置好訪問權限
    個人本地測試環境的NFS地址是: 192.168.137.22
    $ cat /etc/exports
    /ifs/kubernetes *(insecure,rw,sync,no_root_squash,fsid=0)
    $ chmod 777 -R /ifs/kubernetes/
  • (非必選)鏡像倉庫,能夠是自建的也能夠是公共的倉庫,若是是生產用最好是內部自建一套,推薦使用Harbor搭建
  • Helm是採用v3.4.2 版本,放到master節點就能夠了
  • (非必選,若是你不想經過Ingress訪問能夠不用配置)部署Ingress
    部署文件下載鏈接:
    連接: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"]

配置Storageclass

這裏我採用Helm來部署,一方面Helm部署很是方便,另外一方面,我偷懶了。node

1.1 準備NFS服務器並配置

$ 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

1.2 當前K8s集羣的全部工做節點部署NFS套件

$ 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 #檢查是否能正常讀寫

1.3 配置國內Chart倉庫

添加存儲庫: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

1.4 當前K8s集羣部署NFS動態供給類(Helm部署)

$ 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

1.5 測試是否生效

測試案例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

image-20210323151838040

部署Jenkins

部署配置文件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狀態以後,就能夠訪問了image-20210326091009925

訪問地址: http://jenkins.lxq.com/, 初步訪問須要安裝相關插件,按照默認的安裝就能夠了,插件安裝完成所需時間受限於你所在的網絡環境。

配置Jenkins訪問Kubernetes

1 安裝Kubernetes插件

登陸 Jenkins Master 頁面,點擊 「系統管理」 —> 「管理插件」 —> 「可選插件」 —> 「Kubernetes plugin」 勾選安裝

image-20210326092942157

若是下載慢的話,能夠將Jenkins的插件源改爲國內地址,具體如何修改,請Google相關文檔。

2 配置訪問Kubernetes集羣

登陸 Jenkins Master 頁面,點擊 「系統管理」 —> 「系統配置」 —> 「Cloud」

image-20210326093210501

新增一個K8s集羣配置

image-20210326093511337

鏈接測試成功以後,會提示以下信息

image-20210326093547740

最後保存退出就能夠了!

測試構建項目

新增一個Pipeline構建測試項目,注意要選流水線項目

image-20210326093646000

在流水線部分新增任務定義

image-20210326094340232

//定義參數

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容器

如圖,動態構建能夠正常工做

image-20210326094648559

關於Pipeline腳本更詳細的解讀,我會在後續再補充說明。

相關文章
相關標籤/搜索