????隨著Kubernetes的普遍應(yīng)用,基于Kubernetes的jenkins發(fā)布模式也需要隨之做出一些改變,本博客基于之前搭建的Kubernetes 1.16.0高可用集群搭建一套企業(yè)級(jí)別Jenkins CI/CD發(fā)布流程。
為共和等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及共和網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、共和網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
????Jenkins采用Pipline發(fā)布,容器化部署,主從結(jié)構(gòu),Jenkins master負(fù)責(zé)調(diào)度slave,而slave進(jìn)行拉代碼,打包,構(gòu)建鏡像發(fā)布等操作,待發(fā)布完成后slave自動(dòng)消亡,不占用服務(wù)器資源。代碼存儲(chǔ)這里為了方便采用的Git倉庫,鏡像存儲(chǔ)采用最新的1.9.0 Harbor。
? ? 服務(wù)器資源:
? ? 172.30.0.109 k8smaster1 Harbor
? ? 172.30.0.81? ?k8smaster2?
? ? 172.30.0.89? ?k8snode1? ? Git倉庫
? ? 注意:master節(jié)點(diǎn)設(shè)置為可調(diào)度,也可作為node,運(yùn)行業(yè)務(wù)容器,K8S部署方案,請(qǐng)參考上一篇博客,在這里不過多描述。
????
????本博客中相關(guān)配置文件,后面會(huì)上傳到百度網(wǎng)盤中
????一、部署Harbor
????1、安裝docker-compose
? ? harbor需要基于docker-compose插件進(jìn)行安裝,管理
? ? # curl -L?https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m`?-o /usr/local/bin/docker-compose
? ? # chmod +x /usr/local/bin/docker-compose
? ? 2、安裝docker
? ? Harbor 1.9版本的docker驅(qū)動(dòng)需要至少18.03以上,請(qǐng)自行安裝
? ? 3、下載Harbor安裝包
? ? Github上面搜索Harbor
? ? 4、修改harbor配置
? ? 修改haribor.yml,
??
? ? 若使用IP登錄,需要修改成IP地址,域名登錄,需要修改成域名,這里Harbor使用的是http模式,若要修改成https訪問,則要修改密鑰配置
? ? Harbor使用非安全認(rèn)證,docker需要修改安全配置,設(shè)置為新人非安全,否則無法上傳鏡像包
? ? docker.service配置如下
? ?
? ? 5、Harbor效果,正常上傳鏡像
????二、Git倉庫
? ? 生產(chǎn)建議使用Gitlab圖形化工具,方便管理
????1、初始化Git服務(wù)器
? ? 下載git
? ? # yum install git -y
? ? # useradd git
? ? # groupadd git
? ? # su - git 切換到git用戶,創(chuàng)建倉庫
? ? # mkdir tomcat-java-demo
? ? # cd tomcat-java-demo
????# git init --bare 初始化git
??
????# git服務(wù)器初始化完成
????2、上傳代碼到Git倉庫
????解壓java demo代碼
? ? # unzip tomcat-java-demo.zip
????# cd?tomcat-java-demo
????# git init 初始化客戶端git,準(zhǔn)備上傳代碼至遠(yuǎn)程服務(wù)端
????# git add . 添加代碼至本地git倉庫
????# git commit -m 'test'
????#?git remote add origin git@172.30.0.89:/home/git/tomcat-java-demo 設(shè)置git倉庫為遠(yuǎn)程客戶端
????# git push origin master 上傳代碼至遠(yuǎn)程客戶端master分支
????驗(yàn)證代碼是否正常上傳:
????重新創(chuàng)建一個(gè)目錄,初始化git,拉取代碼
????# mkdir test && cd test
????# git init && git?remote add origin git@172.30.0.89:/home/git/tomcat-java-demo
????# git pull origin master
????代碼拉取成功,上傳代碼無誤
????上傳代碼至指定分支,如1.0.0
????本地創(chuàng)建1.0.0的分支,切換到1.0.0分支,因?yàn)槟J(rèn)是在master分支,然后上傳代碼到遠(yuǎn)程1.0.0分支
????# git branch 1.0.0 創(chuàng)建1.0.0分支
????# git checkout 1.0.0 切換到1.0.0分支
????# git push origin 1.0.0 代碼上傳到遠(yuǎn)程1.0.0
????會(huì)在遠(yuǎn)程git服務(wù)器上看到多了一個(gè)1.0.0分支
????
????三、Jenkins部署
????1、部署Jenkins master
????????[root@k8s-master1 jenkins]# cat jenkins.yml?
????????apiVersion: apps/v1
????????kind: StatefulSet
????????metadata:
????????? name: jenkins
????????? labels:
????????? ? name: jenkins
????????spec:
????????? serviceName: jenkins
????????? replicas: 1
????????? updateStrategy:
????????? ? type: RollingUpdate
????????? selector:
????????? ? matchLabels:
????????? ? ? name: jenkins
????????? template:
????????? ? metadata:
????????? ? ? name: jenkins
????????? ? ? labels:
????????? ? ? ? name: jenkins
????????? ? spec:
????????? ? ? terminationGracePeriodSeconds: 10
????????? ? ? serviceAccountName: jenkins
????????? ? ? #imagePullSecrets:
????????? ? ? #? - name: registry-pull-secret?
????????? ? ? nodeName: k8s-master1
????????? ? ? containers:
????????? ? ? ? - name: jenkins
????????? ? ? ? ? image: jenkins/jenkins:lts
????????? ? ? ? ? imagePullPolicy: IfNotPresent
????????? ? ? ? ? ports:
????????? ? ? ? ? ? - containerPort: 8080
????????? ? ? ? ? ? - containerPort: 50000
????????? ? ? ? ? resources:
????????? ? ? ? ? ? limits:
????????? ? ? ? ? ? ? cpu: 1
????????? ? ? ? ? ? ? memory: 1Gi
????????? ? ? ? ? ? requests:
????????? ? ? ? ? ? ? cpu: 0.5
????????? ? ? ? ? ? ? memory: 500Mi
????????? ? ? ? ? env:
????????? ? ? ? ? ? - name: LIMITS_MEMORY
????????? ? ? ? ? ? ? valueFrom:
????????? ? ? ? ? ? ? ? resourceFieldRef:
????????? ? ? ? ? ? ? ? ? resource: limits.memory
????????? ? ? ? ? ? ? ? ? divisor: 1Mi
????????? ? ? ? ? ? - name: JAVA_OPTS
????????? ? ? ? ? ? ? # value: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
????????? ? ? ? ? ? ? value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
????????? ? ? ? ? volumeMounts:
????????? ? ? ? ? ? - name: data
????????? ? ? ? ? ? ? mountPath: /var/jenkins_home
????????? ? ? securityContext:
????????? ? ? ? fsGroup: 1000
????????? ? ? volumes:
????????? ? ? - name: data
????????? ? ? ? hostPath:
????????? ? ? ? ? path: /app/jenkins
????????
????????---
????????apiVersion: v1
????????kind: Service
????????metadata:
????????? name: jenkins
????????spec:
????????? type: NodePort
????????? selector:
????????? ? name: jenkins
????????? ports:
????????? ? -
????????? ? ? name: http
????????? ? ? port: 80
????????? ? ? targetPort: 8080
????????? ? ? protocol: TCP
????????? ? ? nodePort: 30009
????????? ? -
????????? ? ? name: agent
????????? ? ? port: 50000
????????? ? ? protocol: TCP
????對(duì)jenkins容器進(jìn)行授權(quán)
????[root@k8s-master1 jenkins]# cat rbac.yaml?
????# In GKE need to get RBAC permissions first with
????# kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=
????
????---
????apiVersion: v1
????kind: ServiceAccount
????metadata:
????? name: jenkins
????
????---
????kind: Role
????apiVersion: rbac.authorization.k8s.io/v1beta1
????metadata:
????? name: jenkins
????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
????roleRef:
????? apiGroup: rbac.authorization.k8s.io
????? kind: Role
????? name: jenkins
????subjects:
????- kind: ServiceAccount
????? name: jenkins
? ? # kubectl apply -f rbac.yaml? ?
????# kubectl apply -f jenkins.yaml
? ? 訪問http://172.30.0.109:30009?打開Jenkins web頁面,插件安裝默認(rèn)就好,之后再到插件管理頁面自行安裝需要的插件
??
????2、Jenkins系統(tǒng)配置
? ? ①集成Kubernetes到Jenkins中
? ? 在系統(tǒng)管理的系統(tǒng)設(shè)置中,修改配置
? ??
????修改后可以進(jìn)行連接測試,在右下角
????②下載Jenkins與Kubernetes集成的插件
? ? ? 在系統(tǒng)管理的插件管理中
? ? ? Kubernetes
? ? ? Kubernetes Continuous Deploy
? ? ? Extended Choice Parameter
? ? ③配置Git倉庫訪問密鑰以及Jenkins容器訪問Kubernetes使用的kubeconfig配置
? ? 在憑據(jù)中
? ?
? ??????訪問Git服務(wù)器的密鑰,只需要做Jenkins服務(wù)器到Git無密登錄,并復(fù)制Jenkins所在服務(wù)器的私鑰到以上位置,即可實(shí)現(xiàn)代碼拉取過程的無密登錄
????????
????將K8S集群/root/.kube/config文件復(fù)制到以上地區(qū),使Jenkins可以訪問K8S集群,部署pod
????3、Jenkins slave
?????構(gòu)建Jenkins Slave,再Jenkins上通過Pipline流水線調(diào)用JnekinsFile進(jìn)行發(fā)布操作?
??????
? ? ?Jenkins Slave Dockerfile:
??????
? ? 構(gòu)建鏡像
? ? # docker build -t 172.30.0.109/wujqc/jenkins-slave:lts -f dockerfile-jenkins-slave .
? ? 上傳到Harbor上
? ? # docker login 172.30.0.109
? ? 輸入harbor管理員賬號(hào)密碼,進(jìn)行登錄
? ? # docker push?172.30.0.109/wujqc/jenkins-slave:lts
? ?
????4、創(chuàng)建Pipline發(fā)布Java項(xiàng)目到K8S環(huán)境
? ? ①創(chuàng)建流水線項(xiàng)目
?????
????②設(shè)置參數(shù)化構(gòu)建
????
????可以通過標(biāo)簽,字符參數(shù)指定代碼分支,Branch等多種方式去拉取Git,Gitlab指定位置的代碼,進(jìn)行編譯,這里采用的是字符參數(shù)指定代碼分支的方式
????③配置Pipline流水線
????
????設(shè)置git地址,配置能夠拉取git的免登錄密鑰(前面配置的)
????通過字符參數(shù)Tag,獲取到想要編譯的代碼分支,如1.0.0,載入變量origin/1.0.0拉取代碼,在拉取的代碼中讀取JenkinsFile進(jìn)行下一步Jenkins Slave的maven構(gòu)建,鏡像構(gòu)建,K8S deploy操作
????可以說整個(gè)Jenkins項(xiàng)目中,是通過${Tag}版本去拉取指定分支的JenkinsFile以及代碼,在此基礎(chǔ)上進(jìn)行的流水線式部署,JenkinsFile中封裝的就是整個(gè)打包編譯,拉取指定服務(wù)的dockerfile,deploy.yaml,構(gòu)建鏡像,上傳鏡像,部署K8S deploy.yaml的流水線操作。
????注意:JenkinsFile需要在git代碼路徑中,要不然Jenkins識(shí)別不到,會(huì)報(bào)NotFoundFile
? ? JenkinsFile文件如下:
? ??
????注意:這兩處ID,需要替換成Jenkins上面的git,kubeconfig密鑰ID
????
? ? 因?yàn)镴enkins Slave需要要到Docker進(jìn)行鏡像構(gòu)建,上傳操作,于是將docker以掛載的方式放入Jenkins Slave中,讓其能夠使用
????Download Deploy File操作,是為了區(qū)分各個(gè)系統(tǒng)服務(wù),微服務(wù)模塊,因?yàn)椴煌姆?wù)模塊,其deploy.yaml以及Dockerfile可能都不一樣,所以需要有一個(gè)統(tǒng)一管理的路徑去獲取到這兩個(gè)文件,方便管理,只需要將目錄掛載到Jenkins Slave中即可,這個(gè)路徑,可以采用NFS,在這里為了方便使用的hostpath,生產(chǎn)不建議這么使用
????
????5、啟動(dòng)Pipline項(xiàng)目,輸入分支號(hào)1.0.0
????
????
????構(gòu)建成功!