容器化技術架構jenkins?docker?k8s腳本淺析
前言碎語
基于kubernetes容器化技術架構能夠帶來諸多好處,諸如,彈性伸縮,自動修復等,在比如藍綠部署,灰度發(fā)布等。近幾年容器化技術飛速發(fā)展,了解服務網格 的人可能會發(fā)現(xiàn),新興技術 istio 等service mesh技術沒有容器化的技術環(huán)境根本就沒法實踐。
淺談docker
docker可以類比為jvm,jvm也是虛擬機,然后docker的image可以類比為jar包,jar運行在jvm里面,image當然運行在docker容器里,然后jar包是通過maven 的pom.xml定義構建的產物,那docker也有一個Dockerfile來定義打包的鏡像。在沒有容器化之前,我們開發(fā)提供的最終產物是jar,容器化之后我們需要提供docker的鏡像,docker的鏡像會包含我們的jar,然后提供一個穩(wěn)定的可移植的運行環(huán)境。下面是最簡單的一個docker鏡像構建:
通過 docker build -t kl/sales . 就可以構建一個可運行的鏡像
淺談k8s的部署腳本
其實k8s的腳本沒什么可說的,本身k8s的概念非常之多,具體可參考官方的文檔,下面貼出我們的部署文件
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: sales-app namespace: #namespace spec: replicas: 2 minReadySeconds: 130 # 從容器啟動到應用正常提供服務 strategy: # k8s更新策略 type: RollingUpdate #滾動更新 rollingUpdate: maxSurge: 2 # 更新時允許最大激增的容器數,默認 replicas 的 1/4 向上取整 maxUnavailable: 1 # 更新時允許最大 unavailable 容器數,默認 replicas 的 1/4 向下取整 template: metadata: labels: app: sales-app spec: imagePullSecrets: #鏡像拉取秘鑰 - name: xx-xx-xx containers: - name: sales image: xxx-vpc.cn-xx.aliyuncs.com/keking/sales:#Tag imagePullPolicy: Always env: - name: runShell value: #runShell ports: - containerPort: 6002 name: web protocol: TCP resources: limits: cpu: 600m memory: 4Gi requests: cpu: 300m memory: 100Mi livenessProbe: #檢查是否存活 httpGet: path: /health port: 6002 initialDelaySeconds: 240 #首次檢查在多少時間后 periodSeconds: 180 #檢查周期 timeoutSeconds: 3 #超時時間 failureThreshold: 3 #失敗的閾值,連續(xù)三次 readinessProbe: #檢查是否成功啟動 httpGet: path: /health port: 6002 initialDelaySeconds: 140 #首次檢查在多少時間后 periodSeconds: 300 #檢查周期 timeoutSeconds: 3 #超時時間 --- apiVersion: v1 kind: Service metadata: name: sales-app namespace: #namespace labels: app: sales-app spec: selector: app: sales-app ports: - name: web port: 80 targetPort: 6002 nodePort: 31942 type: NodePort
最后聊聊jenkins pipeline
和一般的jenkins pipeline定義一樣,容器化后就多了兩個步驟,一個是在jar生成后,根據前面的講的Dockerfile文件構建docker的鏡像,這個要求jenkins所在主機必須有docker的環(huán)境。第二個步驟是發(fā)送k8s的部署腳本到k8s容器,這個是通過jenkins kuberneetes插件來完成的,詳見下面的jenkins腳本
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes', containers: [ containerTemplate( name: 'jnlp', image: 'xx-vpc.cn-xx.aliyuncs.com/keking/jenkins-slave:latest', alwaysPullImage: true ), ], volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'), hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'), hostPathVolume(mountPath: '/usr/local/jdk', hostPath: '/usr/local/jdk'), hostPathVolume(mountPath: '/usr/local/maven', hostPath: '/usr/local/maven'), ], imagePullSecrets: ['registry-pull-secret'], ) { node("jnlp-slave") { stage('Git Checkout') { checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xx', url: 'http://xx.xx.xx/xx/yudian-salesplatform-boot.git']]]) } stage('Maven Build') { script { if ('true' == "${build}") { sh "mvn clean install -U -P${profile} -Dmaven.test.skip=true" } else { echo "跳過maven build" } } } stage('Docker Build ') { script { if ('true' == "${build}") { sh ''' docker login -u it_sh@keking-group -p x#xxx-vpc.cn-xx.aliyuncs.com docker build -t xx-vpc.cn-xx.aliyuncs.com/keking/sales:${Tag} . docker push xx-vpc.cn-xx.aliyuncs.com/keking/sales:${Tag} ''' } else { echo "跳過docker build" } } } stage('Deploy to K8s') { script { if('true' == "${deploy}"){ if ('prod' == "${profile}") { sh ''' sed -i "s/#namespace/prod/g" deploy.yaml sed -i "s%#runShell%java -Xmx2G -Xms2G -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m -jar -Ddev_meta=http://conf.x.ops:8801/ -Denv=DEV -Didc=prod app.jar%g" deploy.yaml ''' } if ('uat' == "${profile}") { sh ''' sed -i "s/#namespace/uat/g" deploy.yaml sed -i "s%#runShell%java -Xmx1536M -Xms1536M -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m -jar -Ddev_meta=http://conf.keking.ops:8801/ -Denv=DEV -Didc=sales_docker app.jar%g" deploy.yaml ''' } sh ''' sed -i "s/#Tag/${Tag}/g" deploy.yaml ''' kubernetesDeploy configs: 'deploy.yaml', kubeConfig: [path: ''], kubeconfigId: '9c1da035-60b9-4bd8-aeae-1a31666280ce', secretName: '', ssh: [sshCredentialsId: '*', sshServer: ''], textCredentials: [certificateAuthorityData: '', clientCertificateData: '', clientKeyData: '', serverUrl: 'https://'] }else { echo "跳過Deploy k8s" } } } } }
綜上,就完成了從jenkins到k8s的ci和cd過程,當然過程中還有很多細枝末節(jié)未詳盡描述,比如k8s的搭建(博主使用的阿里云的容器服務)等,歡迎看到此篇有容器化此需求的同行一起探討
以上就是jenkins docker k8s的容器化之路腳本淺析的詳細內容,更多關于jenkins docker k8s的容器化腳本的資料請關注腳本之家其它相關文章!
相關文章
Docker設置獲取環(huán)境變量的方法實現(xiàn)
本文主要介紹了Docker設置獲取環(huán)境變量的方法實現(xiàn),包含設置環(huán)境變量到使用獲取,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05