共計 4397 個字符,預計需要花費 11 分鐘才能閱讀完成。
本篇文章給大家分享的是有關(guān)如何基于開源組件使用 CI/CD,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
前言
應對敏捷開發(fā)的需求,對 CI(持續(xù)集成))/CD(持續(xù)交付)的提出了更高的標準,今天來討論下,如何基于開源組件(gitlab/jenkins/harbor/kubernetes)使用 CI/CD,賦能團隊的開發(fā)、運維。
核心組件組件名稱版本備注 kubernetesv1.15.310.0.0.182:6443jenkins2.176.2 集群內(nèi)部署 / namespace: devopsgitlab11.8 主機部署 harborv1.7.4docker-compose 部署基本流程
在 GitLab 創(chuàng)建對應的項目。
開發(fā)者將代碼提交到 GitLab。
Jenkins 創(chuàng)建對應的任務(Job),集成該項目的 Git 地址和 Kubernetes 集群。
如有配置鉤子,推送(Push)代碼會自動觸發(fā) Jenkins 構(gòu)建,如沒有配置鉤子,需要手動構(gòu)建。
Jenkins 控制 Kubernetes(使用的是 Kubernetes 插件)創(chuàng)建 Jenkins Slave。
Jenkins Slave 根據(jù)流水線(Pipeline)定義的步驟執(zhí)行構(gòu)建。
檢出代碼、打包、編譯。
通過 Dockerfile 生成鏡像。
將鏡像提送(Push)到私有 Harbor。
Jenkins 再次控制 Kubernetes 進行最新的鏡像部署。
注:
上面所述為一般步驟,中間還可能會涉及自動化測試等步驟,可自行根據(jù)業(yè)務場景添加。
上面流水線步驟一般由應用代碼庫的根目錄下 Jenkinsfile 決定,Jenkins 會自動讀取該文件;另外如果需要對具體的應用流水線實施強管控,可以獨立管理 jenkinsfile 模板,然后根據(jù) jenkins API 接口即時生成流水線。
默認使用的 Dockerfile 放置在代碼倉庫的根目錄下。
組件部署
kubernetes 第 3 篇 Kubernetes 集群安裝部署
gitlab 無忌過招: 手把手教你搭建自己的 GitLab 庫
harbor 安裝配置指南
jenkins
注: 本文主要說明下 jenkins 的部署及配置,其他組件如果你部署有問題,歡迎留言。
Jenkins 部署及配置
說明:
以下的 yaml 文件均在 k8s master 節(jié)點的 /home/jenkins_deploy 目錄下,
部署示例的 depployment.yaml 的注解
nodeName ipaddress , ipaddress 請確認其為一個有效的 ip.
示例中 jenkins 的目錄 /var/jenkins_home 是直接掛載到 host_path, 如果你有條件,建議替換為共享存儲。
因使用的 jenkins-master 的基礎(chǔ)鏡像來自公網(wǎng),需要 k8s maste 節(jié)點也要可以訪問公網(wǎng),或者你可以將 jenkins/jenkins:lts-alpine 推送至自己的內(nèi)網(wǎng)鏡像倉庫。
部署示例的 ingress.yaml 的注解
需要你也需要辦公網(wǎng)(集群外)訪問,請將 jenkins.dev.hanker.net, 改為有效的域名地址,或是你也可以通過 NodePort 的形式聲明 service,就可以直接通過 ip:port 的形式訪問 jenkins 了。
1. 準備部署 yaml
deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: devops
# Deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
namespace: devops
spec:
replicas: 1
revisionHistoryLimit: 3
template:
metadata:
labels:
app: jenkins
spec:
nodeName: 1.1.1.1
serviceAccountName: jenkins-admin
containers:
- image: jenkins/jenkins:lts-alpine
imagePullPolicy: IfNotPresent
name: jenkins
volumeMounts:
- name: jenkins-volume
mountPath: /var/jenkins_home
- name: jenkins-localtime
mountPath: /etc/localtime
env:
- name: JAVA_OPTS
value: -Xms256m -Xmx1024m -Duser.timezone=Asia/Shanghai
- name: TRY_UPGRADE_IF_NO_MARKER
value: true
ports:
- name: http
containerPort: 8080
- name: agent
containerPort: 50000
resources:
requests:
cpu: 1000m
memory: 1Gi
limits:
cpu: 1200m
memory: 2Gi
volumes:
- name: jenkins-localtime
hostPath:
path: /etc/localtime
- name: jenkins-volume
hostPath:
path: /home/jenkins/jenkins_home
配置 service, services.yaml
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: devops
spec:
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
- port: 50000
targetPort: 50000
name: agent
selector:
app: jenkins
授權(quán) jenkins 對 k8s 的訪問 rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: jenkins
name: jenkins-admin
namespace: devops
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: jenkins-rbac
namespace: devops
rules:
- apiGroups: [, extensions , app]
resources: [pods , pods/exec , deployments , replicasets]
verbs: [get , list , watch , create , update , patch , delete]
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
namespace: devops
labels:
k8s-app: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops
roleRef:
kind: ClusterRole
name: jenkins-rbac
apiGroup: rbac.authorization.k8s.io
為了便于辦公網(wǎng)(集群外)訪問,ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: jenkins-ingress
namespace: devops
spec:
rules:
- host: jenkins.dev.hanker.net
http:
paths:
- backend:
serviceName: jenkins-service
servicePort: 8080
path: /
2. 應用 yaml,部署 jenkins
$ pwd
$ /home/jenkins_deploy
$ kubectl apply -f *.yaml
3. 確認 jenkins 服務狀態(tài)
[root@node0 jenkins_deploy]# kubectl -n devops get deployment jenkins
NAME READY UP-TO-DATE AVAILABLE AGE
jenkins 1/1 1 1 51d
[root@node0 jenkins_deploy]#
4. 訪問 jenkins 安裝插件、設置
注: 步驟 1 聲明的域名 jenkins.dev.hanker.net 已經(jīng)解析至 ingress,故可直接訪問;如果你也想通過自定義域名訪問 jenkins,麻請解析至正確的 ingress 服務節(jié)點,即可。
確認你也已經(jīng)安裝了 kubernetes/ kubernetes cli 插件
操作指引:【Manage Jenkins】–【Manage Plugins】
你應該可以通過類似的指令獲取 jenkins-master 的密碼
$ kubectl -n devops exec jenkins-pod-name cat /var/jenkins_home/secrets/initialAdminPassword
配置 Kubernetes 插件
操作指引:【Manage Jenkins】-【Configure System】
圖中標注:
請修改為你所在環(huán)境對應的 k8s master
聲明 jenkins-agent 的命令空間,也可以根據(jù)需要調(diào)整;
jenkins-master 的訪問地址,本示例使用的是 service-name 的形式訪問。
測試與 k8s 分享群的連接情況。如果你獲取到『
Connection test successful』,恭喜你可以繼續(xù)。
配置 Kubernetes Pod Template
圖中標注:
設置基礎(chǔ)的 jenkins-agent 鏡像;
指定工作目錄;
如果你需要下載、導出或是緩存構(gòu)建的話,指定一個為共享存儲的目錄就很有意義了。
設置目錄掛載
如步驟 2 如說,你可以將宿主機的目錄或是網(wǎng)絡存儲掛載至 jenkins-agent.
以上就是如何基于開源組件使用 CI/CD,丸趣 TV 小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注丸趣 TV 行業(yè)資訊頻道。