容器化技術(shù)架構(gòu)jenkins?docker?k8s腳本淺析
前言碎語
基于kubernetes容器化技術(shù)架構(gòu)能夠帶來諸多好處,諸如,彈性伸縮,自動(dòng)修復(fù)等,在比如藍(lán)綠部署,灰度發(fā)布等。近幾年容器化技術(shù)飛速發(fā)展,了解服務(wù)網(wǎng)格 的人可能會(huì)發(fā)現(xiàn),新興技術(shù) istio 等service mesh技術(shù)沒有容器化的技術(shù)環(huán)境根本就沒法實(shí)踐。
淺談docker
docker可以類比為jvm,jvm也是虛擬機(jī),然后docker的image可以類比為jar包,jar運(yùn)行在jvm里面,image當(dāng)然運(yùn)行在docker容器里,然后jar包是通過maven 的pom.xml定義構(gòu)建的產(chǎn)物,那docker也有一個(gè)Dockerfile來定義打包的鏡像。在沒有容器化之前,我們開發(fā)提供的最終產(chǎn)物是jar,容器化之后我們需要提供docker的鏡像,docker的鏡像會(huì)包含我們的jar,然后提供一個(gè)穩(wěn)定的可移植的運(yùn)行環(huán)境。下面是最簡單的一個(gè)docker鏡像構(gòu)建:

通過 docker build -t kl/sales . 就可以構(gòu)建一個(gè)可運(yùn)行的鏡像
淺談k8s的部署腳本
其實(shí)k8s的腳本沒什么可說的,本身k8s的概念非常之多,具體可參考官方的文檔,下面貼出我們的部署文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sales-app
namespace: #namespace
spec:
replicas: 2
minReadySeconds: 130 # 從容器啟動(dòng)到應(yīng)用正常提供服務(wù)
strategy: # k8s更新策略
type: RollingUpdate #滾動(dòng)更新
rollingUpdate:
maxSurge: 2 # 更新時(shí)允許最大激增的容器數(shù),默認(rèn) replicas 的 1/4 向上取整
maxUnavailable: 1 # 更新時(shí)允許最大 unavailable 容器數(shù),默認(rèn) 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 #首次檢查在多少時(shí)間后
periodSeconds: 180 #檢查周期
timeoutSeconds: 3 #超時(shí)時(shí)間
failureThreshold: 3 #失敗的閾值,連續(xù)三次
readinessProbe: #檢查是否成功啟動(dòng)
httpGet:
path: /health
port: 6002
initialDelaySeconds: 140 #首次檢查在多少時(shí)間后
periodSeconds: 300 #檢查周期
timeoutSeconds: 3 #超時(shí)時(shí)間
---
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定義一樣,容器化后就多了兩個(gè)步驟,一個(gè)是在jar生成后,根據(jù)前面的講的Dockerfile文件構(gòu)建docker的鏡像,這個(gè)要求jenkins所在主機(jī)必須有docker的環(huán)境。第二個(gè)步驟是發(fā)送k8s的部署腳本到k8s容器,這個(gè)是通過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過程,當(dāng)然過程中還有很多細(xì)枝末節(jié)未詳盡描述,比如k8s的搭建(博主使用的阿里云的容器服務(wù))等,歡迎看到此篇有容器化此需求的同行一起探討
以上就是jenkins docker k8s的容器化之路腳本淺析的詳細(xì)內(nèi)容,更多關(guān)于jenkins docker k8s的容器化腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解ASP.NET Core 網(wǎng)站在Docker中運(yùn)行
本篇文章主要介紹了詳解ASP.NET Core 網(wǎng)站在Docker中運(yùn)行,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
Docker設(shè)置獲取環(huán)境變量的方法實(shí)現(xiàn)
本文主要介紹了Docker設(shè)置獲取環(huán)境變量的方法實(shí)現(xiàn),包含設(shè)置環(huán)境變量到使用獲取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
使用Maven打包構(gòu)建Docker鏡像并推送到倉庫
這篇文章主要介紹了使用Maven打包構(gòu)建Docker鏡像并推送到倉庫問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

