jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

DevOps是一套完整的運維開發流程,能夠實現快速的構建、測試和發佈軟件,整個流程包括敏捷開發->持續集成->持續交付->持續部署->DevOps,經過 Kubernetes,咱們能夠實現容器在多個計算節點上的統一調度,能夠將容器對接到持久存儲、虛擬網絡,還能夠實現彈性伸縮等,提升了產品的迭代速度,kubernetes在DevOps中能夠實現以下功能:前端

* 多集羣管理
能夠根據客戶需求對開發,測試,生產環境部署多套kubernetes集羣,每一個環境使用獨立的物理資源,相互之間避免影響node

* 多環境一致性
Kubernetes是基於docker的容器編排工具,由於容器的鏡像是不可變的,因此鏡像把 OS、業務代碼、運行環境、程序庫、目錄結構都包含在內,鏡像保存在咱們的私有倉庫,只要用戶從咱們提供的私有倉庫拉取鏡像,就能保證環境的一致性linux

* 持續集成,持續部署,持續交付
可讓產品快速迭代,自動部署,根據客戶的要求達到持續交付的能力git

第一部分:在k8s集羣安裝jenkins

1.安裝nfs服務,選擇本身的任意一臺機器,我選擇master1節點(192.168.80.180)

(1)在master1上安裝nfs服務github

yum install nfs-utils -y
systemctl start nfs

(2)在master1上建立一個nfs共享目錄web

建立一個共享目錄
mkdir /data/v1  -p

修改nfs配置文件
vim  /etc/exports 

在/etc/exports文件加入以下內容
/data/v1       192.168.80.0/24(rw,no_root_squash)

使配置文件生效
exportfs -arv 

從新啓動nfs服務
systemctl restart nfs

2.kubernetes中部署jenkins

(1)建立名稱空間
kubectl create namespace jenkins-k8sdocker

(2)建立pv
cat pv.yamlvim

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-k8s-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  nfs:
    server: 192.168.80.180
    path: /data/v1

kubectl apply -f pv.yamlapi

(3)建立pvc
cat pvc.yaml瀏覽器

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins-k8s-pvc
  namespace: jenkins-k8s
spec:
  resources:
    requests:
      storage: 10Gi
  accessModes:
    - ReadWriteMany

kubectl apply -f pvc.yaml

查看pvc和pv綁定是否成功

kubectl get pvc -n jenkins-k8s

看到以下說明綁定成功
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

(4)建立一個sa帳號

kubectl create sa jenkins-k8s-sa -n jenkins-k8s

(5)把上面的sa帳號作rbac受權

kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa

(6)經過deployment部署jenkins
cat jenkins-deployment.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: jenkins
  namespace: jenkins-k8s
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins-k8s-sa
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        - containerPort: 50000
          name: agent
          protocol: TCP
        resources:
          limits:
            cpu: 1000m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        volumeMounts:
        - name: jenkins-volume
          subPath: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-volume
        persistentVolumeClaim:
          claimName: jenkins-k8s-pvc

chown -R 1000 /data/v1
kubectl apply -f jenkins-deployment.yaml
kubectl get pods -n jenkins-k8s
看到以下STATUS狀態是running說明jenkins部署成功

jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

(7)把jenkins前端加上service,提供外部網絡訪問
cat jenkins-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: jenkins-k8s
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: NodePort
  ports:
  - name: web
    port: 8080
    targetPort: web
    nodePort: 30002
  - name: agent
    port: 50000
    targetPort: agent

kubectl apply -f jenkins-service.yaml
kubectl get svc -n jenkins-k8s
顯示以下,記住下面的30002端口
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

第二部分:配置Jenkins

在瀏覽器訪問jenkins的web界面:
http://192.168.80.199:30002/login?from=%2F

jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

1.獲取管理員密碼:

在nfs服務端,也就是咱們的master1節點獲取密碼:
cat /data/v1/jenkins-home/secrets/initialAdminPassword
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

把上面獲取到的密碼拷貝到上面管理員密碼下的方框裏
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

點擊繼續,出現以下界面
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

2.安裝插件

安裝推薦的插件
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

插件安裝好以後顯示以下:
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

3.建立第一個管理員用戶

jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

用戶名和密碼都設置成admin,線上環境須要設置成複雜的密碼,修改好以後點擊保存並完成,出現以下界面
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

點擊保存並完成,出現以下界面
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

第三部分:測試jenkins的CI/CD

1.在Jenkins中安裝kubernetes插件

(1)在jenkins中安裝k8s插件
Manage Jnekins------>Manage Plugins------>可選插件------>搜索kubernetes------>出現以下
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

選中kubernetes以後------>點擊下面的直接安裝------>安裝以後選擇從新啓動jenkins--->重啓以後登錄jenkins便可

2.配置jenkins鏈接到咱們存在的k8s集羣

(1)點擊系統管理->系統設置-新增一個雲,在下拉菜單中選擇kubernets並添加
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

(2)填寫雲kubernetes配置內容
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

注:Name值任意添加,Kubernetes URL值添加K8S apiserver鏈接地址和端口

(3)測試jenkins和k8s是否能夠通訊
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

點擊鏈接測試,若是顯示Connection test successful,說明測試成功,Jenkins能夠和k8s進行通訊

應用------>保存

3.配置pod-template

(1)配置pod template

系統管理------>系統設置------>添加Pod模板------>Kubernetes Pod Template--->按以下配置
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

(2)在上面的pod template下添加容器
添加容器------>Container Template------>按以下配置------>
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

在每個pod template右下腳都有一個Advanced,點擊Advanced,出現以下
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

在Service Account處輸入jenkins-k8s-sa,這個sa就是咱們最開始安裝jenkins時的sa

(3)給上面的pod template添加捲
添加捲------>選擇Host Path Volume
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

上面配置好以後,應用------>保存

4.添加本身的dockerhub憑據

首頁------>憑據------>點擊Stores scoped to Jenkins下的第一行jenkins,顯示以下----->
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

點擊這個全局憑據,出現以下------>
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

username:xianchao
password:1989*****
ID:dockerhub
描述:隨意

上面改好以後選擇肯定便可

5.測試經過Jenkins部署k8s

回到首頁:

新建一個任務------>輸入一個任務名稱處輸入jenkins-variable-test-deploy------>流水線------>肯定------>在Pipeline script處輸入以下內容

node('testhan') {
    stage('Clone') {
        echo "1.Clone Stage"
        git url: "https://github.com/luckylucky421/jenkins-sample.git"
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
        }
    }
    stage('Test') {
      echo "2.Test Stage"
    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "docker build -t xianchao/jenkins-demo:${build_tag} ."
    }
    stage('Push') {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
            sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push xianchao/jenkins-demo:${build_tag}"
        }
    }
    stage('Deploy to dev') {
        echo "5. Deploy DEV"
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"
//        sh "bash running-devlopment.sh"
        sh "kubectl apply -f k8s-dev.yaml  --validate=false"
    }   
    stage('Promote to qa') {    
        def userInput = input(
            id: 'userInput',
            message: 'Promote to qa?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa.yaml"
//            sh "bash running-qa.sh"
            sh "kubectl apply -f k8s-qa.yaml --validate=false"
            sh "sleep 6"
            sh "kubectl get pods -n qa"
        } else {
            //exit
        }
    }
    stage('Promote to pro') {   
        def userInput = input(
            id: 'userInput',
            message: 'Promote to pro?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"
//            sh "bash running-production.sh"
            sh "cat k8s-prod.yaml"
            sh "kubectl apply -f k8s-prod.yaml --record --validate=false"
        }
    }
}

應用------&gt;保存------&gt;當即構建便可,打開blue ocean會看到以下流程,能夠手動點擊確認
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

DevOps工具鏈的完整流程圖以下:
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

學無止境,瞭解更多關於kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS相關內容,想要獲取更多資料和免費視頻,可按以下方式進入技術交流羣
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

微信:luckylucky421302
jenkins+kubernetes+harbor+gitlab構建企業級devops平臺

相關文章
相關標籤/搜索