新聞中心
本篇文章給大家分享的是有關如何基于開源組件使用CI/CD,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供介休企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計制作、網(wǎng)站設計、H5技術、小程序制作等業(yè)務。10年已為介休眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
前言
應對敏捷開發(fā)的需求,對CI(持續(xù)集成))/CD(持續(xù)交付)的提出了更高的標準,今天來討論下,如何基于開源組件(gitlab/jenkins/harbor/kubernetes)使用CI/CD,賦能團隊的開發(fā)、運維。
核心組件
組件名稱 | 版本 | 備注 |
---|---|---|
kubernetes | v1.15.3 | 10.0.0.182:6443 |
jenkins | 2.176.2 | 集群內(nèi)部署/ namespace: devops |
gitlab | 11.8 | 主機部署 |
harbor | v1.7.4 | docker-compose部署 |
基本流程
在GitLab創(chuàng)建對應的項目。
開發(fā)者將代碼提交到GitLab。
Jenkins創(chuàng)建對應的任務(Job),集成該項目的Git地址和Kubernetes集群。
如有配置鉤子,推送(Push)代碼會自動觸發(fā)Jenkins構建,如沒有配置鉤子,需要手動構建。
Jenkins控制Kubernetes(使用的是Kubernetes插件)創(chuàng)建Jenkins Slave。
Jenkins Slave根據(jù)流水線(Pipeline)定義的步驟執(zhí)行構建。
檢出代碼、打包、編譯。
通過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 的基礎鏡像來自公網(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
授權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
圖中標注:
設置基礎的jenkins-agent鏡像;
指定工作目錄;
如果你需要下載、導出或是緩存構建的話,指定一個為共享存儲的目錄就很有意義了。
設置目錄掛載
如步驟2如說,你可以將宿主機的目錄或是網(wǎng)絡存儲掛載至jenkins-agent.
以上就是如何基于開源組件使用CI/CD,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享文章:如何基于開源組件使用CI/CD
URL分享:http://fisionsoft.com.cn/article/pdheje.html