真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

本篇文章給大家分享的是有關(guān)Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括京口網(wǎng)站建設(shè)、京口網(wǎng)站制作、京口網(wǎng)頁制作以及京口網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,京口網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到京口省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一、概述

1.1、環(huán)境介紹

我們使用的是 AWS 的 EC2 來搭建我們的集群,安裝方式使用 kubeadm 來進(jìn)行安裝,如果使用二進(jìn)制安裝,可以參考我相關(guān)文檔。

  • 系統(tǒng)版本:ubuntu 16.04

  • k8s 版本:1.17.1

  • docker 版本:18.06-ce

1.2、流程圖

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

1.3、集群配置

名稱配置內(nèi)網(wǎng)IP外網(wǎng)IP
k8s-master2核4GB172.31.20.18454.226.118.74
k8s-node12核4GB172.31.27.6952.90.221.230
k8s-node22核4GB172.31.30.93.85.219.119

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

二、k8s 部署

2.1、安裝 docker

安裝源大家可以參照官方文檔 https://docs.docker.com/install/linux/docker-ce/ubuntu/ ,我這里不再進(jìn)行演示,如沒有特殊說明,操作將在三臺集群上面都要執(zhí)行。

apt-get install docker-ce=18.06.3~ce~3-0~ubuntu
systemctl enable docker

2.2、安裝 kubeadm, kubelet and kubectl

安裝源文檔請參考官方文檔 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm ,詳細(xì)步驟我這里進(jìn)行省略。

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <

2.3、安裝 k8s 集群

請參考文檔 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ ,在 master 節(jié)點(diǎn)運(yùn)行。

kubeadm init --kubernetes-version=v1.17.1 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

在 node 節(jié)點(diǎn)上運(yùn)行添加集群的命令。

kubeadm join 172.31.20.184:6443 --token w3fu9a.rs8eknt079n2e8r8 \
    --discovery-token-ca-cert-hash sha256:7392d6f6576b3c9ba5f78d1c54d9a0b1369f77bd498da8104a096b62c6b14c06

以后的 kubectl 都是在 master 節(jié)點(diǎn)上進(jìn)行操作,添加 cni 插件,我們這里選擇 flannel。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

到目前為止,我們的集群已經(jīng)創(chuàng)建完成,參照官方文檔執(zhí)行,過程很簡單。

root@ip-172-31-20-184:~# kubectl get no
NAME               STATUS   ROLES    AGE   VERSION
ip-172-31-20-184   Ready    master   21m   v1.17.1
ip-172-31-27-69    Ready       16m   v1.17.1
ip-172-31-30-9     Ready       16m   v1.17.1

三、組件安裝

整個(gè) CI/CD 過程中我們用到了很多工具,比如 gitlab,jenkins,harbor,在生產(chǎn)環(huán)境,建議大家把 gitlab 和 harbor 放在獨(dú)立的機(jī)器上面,我這里為了簡便,直接放在 k8s 集群中。

3.1、安裝 helm3

請參見官方文檔 https://helm.sh/docs/intro/install/ 。

wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
tar xf helm-v3.0.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
chmod +x /usr/local/bin/helm

3.2、安裝 gitlab

參見官方文檔 https://docs.gitlab.com/charts/installation/ 。

helm repo add gitlab https://charts.gitlab.io/

后來發(fā)現(xiàn) gitlab 目前還不支持 helm3,那我就選擇了使用 EC2 來進(jìn)行創(chuàng)建。
https://about.gitlab.com/install/#ubuntu?version=ce

訪問地址:gitlab.wzlinux.com

3.3、安裝 harbor

參見官方文檔 https://github.com/goharbor/harbor-helm/blob/master/README.md

helm repo add harbor https://helm.goharbor.io
helm install my-release harbor/harbor

安裝過程中還是出現(xiàn)了一些問題,是因?yàn)闆]有 pv,懶得去設(shè)置了,后來還是選擇了單機(jī)進(jìn)行安裝,因?yàn)?docker 的一些要求,harbor 倉庫配置了 https 證書。
參照下面文檔安裝 https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md 。

訪問地址:https://harbor.wzlinux.com

3.4、安裝 jenkins

3.4.1、優(yōu)點(diǎn)

我們以云原生的方式,將jenkins master,jenkins slave全部部署于kubernetes之上,從而打造一個(gè)高可用,彈性伸縮的CI/CD管道。

  1. 推送代碼到托管鏡像倉庫

  2. gitlab 基于webhook觸發(fā)jenkins pipeline項(xiàng)目

  3. Jenkins master分配kubernetes slave作為項(xiàng)目的執(zhí)行環(huán)境,同時(shí)k8s啟動(dòng)slave pod

  4. Jenkins slave pod運(yùn)行pipeline中指定的任務(wù)第一步從私有代碼倉庫拉下代碼

  5. Jenkins slave pod執(zhí)行代碼測試,測試完畢后依據(jù)代碼倉庫格式,構(gòu)造鏡像

  6. Jenkins slave pod推送鏡像到Harbor上

  7. Jenkins slave pod執(zhí)行應(yīng)用服務(wù)的更新任務(wù)

  8. 應(yīng)用服務(wù)pod所在節(jié)點(diǎn)拉取相應(yīng)的鏡像,完成鏡像的替換,即應(yīng)用的更新

3.4.2、創(chuàng)建 nfs

因?yàn)?master 需要持久存儲,我們這里就簡單的選擇 nfs ,我們在 master 節(jié)點(diǎn)上進(jìn)行創(chuàng)建服務(wù)。
創(chuàng)建過程請參照文檔 https://blog.csdn.net/qq_37860012/article/details/86717891 。

root@ip-172-31-20-184:/home/nfs# showmount -e 172.31.20.184
Export list for 172.31.20.184:
/home/nfs/jenkins *

master 節(jié)點(diǎn)目前授予權(quán)限。

chown ubuntu.ubuntu -R /home/nfs/jenkins

3.4.3、安裝 jenkins

前面所需要的東西都已經(jīng)配置好了,那我們開始安裝 jenkins,請應(yīng)用我下面的 yaml 文件

kubectl apply -f https://raw.githubusercontent.com/wangzan18/jenkins-cicd/master/master/jenkins.yaml

關(guān)于動(dòng)態(tài)創(chuàng)建 jenkins agent,具體使用方法請參照我的博文 https://blog.51cto.com/wzlinux/2467307 。

訪問地址:http://jenkins.wzlinux.com:30814/

3.4.4、gitlab 觸發(fā) jenkins

首先為 jenkins 安裝 gitlab 插件。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

創(chuàng)建一個(gè) jenkins pipeline job,命名為 gitlab-pipeline,選中 gitlab 觸發(fā)器。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

記錄生成的數(shù)值,然后回到我們的 gitlab project 里面,填寫好 jenkins 的信息。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

然后我們提交代碼到倉庫,可以看到 jenkins 被觸發(fā)了。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

四、自動(dòng)化構(gòu)建

因?yàn)?jenkins 在構(gòu)建的時(shí)候,會向 gitlab 拉取代碼,因?yàn)槲覀兊?gitlab 是私有倉庫,所以需要為 jenkins 配置權(quán)限,同樣的,harbor 倉庫也是私有的,jenkins 在向 harbor 推鏡像的時(shí)候,也是需要相應(yīng)的權(quán)限。

4.1、為 jenkins 配置 gitlab 憑證

切換到 jenkins 憑據(jù)界面,創(chuàng)建我們需要的憑據(jù),填寫你 gitlab 的賬戶密碼即可,你也可以單獨(dú)為這個(gè)倉庫創(chuàng)建一個(gè)用戶。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

4.2、為 jenkins 配置 harbor 憑證

首先為 jenkins 在 harbor 中創(chuàng)建一個(gè)用戶 jenkins,然后登陸用戶創(chuàng)建一個(gè)項(xiàng)目gitlab-pipeline,這里我不再掩飾,然后同意的方式,在 jenkins 為其創(chuàng)建憑據(jù)。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

最終生成的兩個(gè)憑據(jù)如下,記錄下各憑據(jù)的 ID,我們后面會引用到。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

4.3、為 job 添加 pipeline 腳本

我們前面測試 gitlab 觸發(fā) jenkins 的時(shí)候已經(jīng)創(chuàng)建了一個(gè) job,我們使用 SCM 的方式,我已經(jīng)把我測試的倉庫同步到 github了,大家查看代碼可以去我的 github 地址:https://github.com/wangzan18/gitlab-jenkins-k8s-pipeline.git

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

出現(xiàn)一些錯(cuò)誤,可能是 harbor 倉庫的問題,我單獨(dú)去 push 鏡像也是有問題的,目前這個(gè)問題我還不知道如何去解決。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

那我們就直接測試上傳到阿里云的 docker hub 吧,首先我們?nèi)?chuàng)建一個(gè)倉庫。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

相關(guān)的憑據(jù)也需要在 jenkins 里面配置好,我這里不再掩飾,同樣的,job 我們也選擇 SCM 獲取,腳本路徑選擇 Jenkinsfile,然后我們選擇去執(zhí)行,這時(shí)候就沒有錯(cuò)誤了。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

在 Jenkinsfile 中,我們用到的兩個(gè)容器,一個(gè)是 jenkins agent,用來連接 jenkins server,還有一個(gè) docker,用來 build 鏡像,如果你有其他的需求,可以去找相應(yīng)的鏡像,在特定的 stage 的時(shí)候去應(yīng)用。

然后我們?nèi)グ⒗镌频溺R像倉庫查看一下我們構(gòu)建好的鏡像。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

五、自動(dòng)化部署

既然我們已經(jīng)把鏡像打包構(gòu)建好,那我們需要把它部署到 k8s 集群中。

5.1、給 jenkins 配置 k8s 認(rèn)證

我們需要告訴 jenkins ,我們的 k8s 集群在哪里,怎么去請求 api 創(chuàng)建 pod。因?yàn)槲覀優(yōu)?serviceaccount jenkins 已經(jīng)配置了 RBAC,所以我們可以為其創(chuàng)建一個(gè) kubeconfig,這里我為了簡單,使用集群管理員的 config,也就是~.kube/config。

同樣的,我們需要給 jenkins 安裝插件 Kubernetes Continuous Deploy,然后創(chuàng)建對應(yīng)的憑據(jù)。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

記錄下憑據(jù)的 ID,稍后我們會在 pipeline 中使用。

5.2、k8s 添加 aliyun 倉庫 secret

在可以執(zhí)行 kubectl 命令的服務(wù)器上面執(zhí)行。

kubectl create secret docker-registry aliyun-pull-secret --docker-username=wangzan18@126.com \
--docker-password=YOUR_PASSWORD \
--docker-email=wangzan18@126.com \
--docker-server=registry.us-east-1.aliyuncs.com

5.3、更新 pipeline 腳本。

大家可以查看我 github 倉庫 jenkins 的變化情況。

已經(jīng)創(chuàng)建我們要部署的 deployment.yaml 文件,都可以在 github 上面看到 https://github.com/wangzan18/gitlab-jenkins-k8s-pipeline.git 。

5.4、代碼提交觸發(fā)更新

我們可以看到 jenkins pipeline 都已經(jīng)更新成功。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

然后查看我的頁面是否正常。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

那我們把代碼更新一下,然后我們可以看下 k8s 集群 pod 的變化情況。

wangzan:~ $ kubectl get pod -w
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-5df4dff655-f4gk8   1/1     Running   0          26h
myapp1                     1/1     Running   0          47h
web-5bd9f98844-622hn       1/1     Running   0          3m35s
web-5bd9f98844-dppvh       1/1     Running   0          4m30s
web-5bd9f98844-wp7g7       1/1     Running   0          3m58s
jenkins-agent-004xl-vdjjl   0/2     Pending   0          0s
jenkins-agent-004xl-vdjjl   0/2     Pending   0          0s
jenkins-agent-004xl-vdjjl   0/2     ContainerCreating   0          0s
jenkins-agent-004xl-vdjjl   2/2     Running             0          1s
web-559864cbd7-fj66t        0/1     Pending             0          0s
web-559864cbd7-fj66t        0/1     Pending             0          0s
web-559864cbd7-fj66t        0/1     ContainerCreating   0          0s
jenkins-agent-004xl-vdjjl   2/2     Terminating         0          30s
web-559864cbd7-fj66t        0/1     Running             0          3s
web-559864cbd7-fj66t        1/1     Running             0          30s
web-5bd9f98844-622hn        1/1     Terminating         0          4m45s
web-559864cbd7-jssmn        0/1     Pending             0          0s
web-559864cbd7-jssmn        0/1     Pending             0          0s
web-559864cbd7-jssmn        0/1     ContainerCreating   0          0s
web-5bd9f98844-622hn        0/1     Terminating         0          4m46s
jenkins-agent-004xl-vdjjl   0/2     Terminating         0          61s
jenkins-agent-004xl-vdjjl   0/2     Terminating         0          61s
web-559864cbd7-jssmn        0/1     Running             0          2s
jenkins-agent-004xl-vdjjl   0/2     Terminating         0          62s
web-5bd9f98844-622hn        0/1     Terminating         0          4m50s
web-5bd9f98844-622hn        0/1     Terminating         0          4m50s
jenkins-agent-004xl-vdjjl   0/2     Terminating         0          74s
jenkins-agent-004xl-vdjjl   0/2     Terminating         0          74s
web-559864cbd7-jssmn        1/1     Running             0          24s
web-5bd9f98844-wp7g7        1/1     Terminating         0          5m32s
web-559864cbd7-2jl6l        0/1     Pending             0          0s
web-559864cbd7-2jl6l        0/1     Pending             0          0s
web-559864cbd7-2jl6l        0/1     ContainerCreating   0          0s

然后再去查看我的頁面。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

也去我們的倉庫看下各個(gè)版本的鏡像。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

基本上整個(gè) CI/CD 的過程已經(jīng)比較完善。

5.5、pipeline 腳本

最終的 pipeline 腳本如下,對其中語法不理解的,可以使用官網(wǎng)的流水線語法編輯器。

// 鏡像倉庫地址
def registry = "registry.us-east-1.aliyuncs.com"
// 命名空間
def namespace = "wzlinux"
// 鏡像倉庫項(xiàng)目
def project = "gitlab-pipeline"
// 鏡像名稱
def app_name = "citest"
// 鏡像完整名稱
def image_name = "${registry}/${namespace}/${project}:${app_name}-${BUILD_NUMBER}"
// git倉庫地址
def git_address = "http://gitlab.wzlinux.com/root/gitlab-jenkins-k8s-pipeline.git"
// fenzhi分支
def branch = "*/master"

// 認(rèn)證
def aliyunhub_auth = "2187b285-f62e-437a-b6cf-d4a22c668891"
def gitlab_auth = "cca83969-0fe3-4aa8-9c37-172f19d7338f"

// K8s認(rèn)證
def k8s_auth = "4fd99c44-2834-4aeb-9403-003ab579ad45"
// aliyun倉庫secret_name
def aliyun_registry_secret = "aliyun-pull-secret"
// k8s部署后暴露的nodePort
def nodePort = "30666"

podTemplate(
    label: 'jenkins-agent', 
    cloud: 'kubernetes', 
    containers: [
       containerTemplate(name: 'jnlp', image: "wangzan18/jenkins-agent:maven-3.6.3"),
       containerTemplate(name: 'docker', image: 'docker:19.03.1-dind', ttyEnabled: true, command: 'cat')
    ],
    volumes: [
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
    ]){
    node('jenkins-agent'){
        stage('拉取代碼') { // for display purposes
            checkout([$class: 'GitSCM',branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${git_address}"]]])
        }
        stage('代碼編譯') {
        //    sh "mvn clean package -Dmaven.test.skip=true"
            sh "ls"
        }
        stage('構(gòu)建鏡像') {
            container('docker') {
                stage('打包鏡像') {
                   withCredentials([usernamePassword(credentialsId: "${aliyunhub_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                   sh """
                    docker build -t ${image_name} .
                    docker login -u ${username} -p '${password}' ${registry}
                    docker push ${image_name}
                    """
                    }
                }  
            }    
        }
        stage('部署到K8s'){
            sh """
                sed -i 's#\$IMAGE_NAME#${image_name}#' deployment.yaml
                sed -i 's#\$SECRET_NAME#${aliyun_registry_secret}#' deployment.yaml
                sed -i 's#\$NODE_PORT#${nodePort}#' deployment.yaml
            """
            kubernetesDeploy configs: 'deployment.yaml', kubeconfigId: "${k8s_auth}"
        }
    }
}

六、報(bào)警通知

6.1、郵件報(bào)警

post {
    failure {
        mail to: 'team@example.com',
             subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
             body: "Something is wrong with ${env.BUILD_URL}"
    }
}

6.2、微信報(bào)警

七、與 github 集成

7.1、安裝插件

安裝插件GitHub Integration Plugin。

7.2、添加觸發(fā)器

在 pipeline 的 job里面,我們勾選下面選項(xiàng):

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

7.3、github 配置 webhook

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

7.4、多分支流水線創(chuàng)建過程

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

配置分支源

這里主要也是去監(jiān)控 github 的提交情況,發(fā)現(xiàn)有提交就去構(gòu)建,相關(guān)憑證可以去申請 github access token。

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

配置 Jenkinsfile

Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地

以上就是Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:Jenkins加k8s如何實(shí)現(xiàn)企業(yè)CI或CD落地
文章分享:http://weahome.cn/article/ijgoio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部