k8s交付實戰-流水線構建dubbo服務
1 jenkins流水線准備工作
1.1 參數構建要點
jenkins流水線配置的java項目的十個常用參數:
參數名 | 作用 | 舉例或說明 |
---|---|---|
app_name | 項目名 | dubbo_demo_service |
image_name | docker鏡像名 | app/dubbo-demo-service |
git_repo | 項目的git地址 | https://x.com/x/x.git |
git_ver | 項目的git分支或版本號 | master |
add_tag | 鏡像標簽,常用時間戳 | 191203_1830 |
mvn_dir | 執行mvn編譯的目錄 | ./ |
target_dir | 編譯產生包的目錄 | ./target |
mvn_cmd | 編譯maven項目的命令 | mvc clean package -Dmaven. |
base_image | 項目的docker底包 | 不同的項目底包不一樣,下拉選擇 |
maven | maven軟件版本 | 不同的項目可能maven環境不一樣 |
除了base_image和maven是choice parameter,其他都是string parameter
1.2 創建流水線
1.2.1 創建流水線
創建名為dubbo-demo
的流水線(pipeline),並設置Discard old builds
為如下
Discard old builds選項 | 值 |
---|---|
Days to keep builds | 3 |
Max # of builds to keep | 30 |
1.2.2 添加10個構建參數
This project is parameterized
點擊Add Parameter
,分別添加如下10個參數
#第1個參數
參數類型 : String Parameter
Name : app_name
Description : 項目名 eg:dubbo-demo-service
#第2個參數
參數類型 : String Parameter
Name : image_name
Description : docker鏡像名 eg: app/dubbo-demo-service
#第3個參數
參數類型 : String Parameter
Name : git_repo
Description : 倉庫地址 eg: https://gitee.com/xxx/xxx.git
#第4個參數
參數類型 : String Parameter
Name : git_ver
Description : 項目的git分支或版本號
#第5個參數
參數類型 : String Parameter
Name : add_tag
Description :
給docker鏡像添加標簽組合的一部分,如
$git_ver_$add_tag=master_191203_1830
#第6個參數
參數類型 : String Parameter
Name : mvn_dir
Default Value : ./
Description : 執行mvn編譯的目錄,默認是項目根目錄, eg: ./
#第7個參數
參數類型 : String Parameter
Name : target_dir
Default Value : ./target
Description : 編譯產生的war/jar包目錄 eg: ./dubbo-server/target
#第8個參數
參數類型 : String Parameter
Name : mvn_cmd
Default Value : mvn clean package -Dmaven.test.skip=true
Description : 編譯命令,常加上-e -q參數只輸出錯誤
#第9個參數
參數類型 : Choice Parameter
Name : base_image
Choices :
base/jre7:7u80
base/jre8:8u112
Description : 項目的docker底包
#第10個參數
參數類型 : Choice Parameter
Name : maven
Choices :
3.6.1
3.2.5
2.2.1
Description : 執行編譯使用maven軟件版本
1.2.3 添加完成效果如下:
1.2.4 添加pipiline代碼
流水線構建所用的pipiline代碼語法比較有專門的生成工具
以下語句的作用大致是分為四步:拉代碼->構建包->移動包-打docker鏡像並推送
pipeline {
agent any
stages {
stage('pull') { //get project code from repo
steps {
sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
}
}
stage('build') { //exec mvn cmd
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
}
}
stage('package') { //move jar file into project_dir
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"
}
}
stage('image') { //build image and push to registry
steps {
writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.zq.com/${params.base_image}
ADD ${params.target_dir}/project_dir /opt/project_dir"""
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.zq.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.zq.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
}
}
}
}
1.3 用流水線完成dubbo-service的構建
記得先在harbor中創建私有倉庫app
1.3.1 選擇參數化構建
進入dubbo-demo
后,選擇的參數化構建build with parameters
,填寫10個構建的參數
參數名 | 參數值 |
---|---|
app_name | dubbo-demo-service |
image_name | app/dubbo-demo-service |
git_repo | https://gitee.com/noah-luo/dubbo-demo-service.git |
git_ver | master |
add_tag | 200509_0800 |
mvn_dir | ./ |
target_dir | ./dubbo-server/target |
mvn_cmd | mvn clean package -Dmaven.test.skip=true |
base_image | base/jre8:8u112 |
maven | 3.6.1 |
1.3.2 填寫完成效果如下
1.3.3 執行構建並檢查
填寫完以后執行bulid
第一次構建需要下載很多依賴包,時間很長,抽根煙,喝杯茶
經過漫長的等待后,已經構建完成了
點擊打開 Blue Ocean
查看構建歷史及過程:
檢查harbor是否已經有這版鏡像:
2 交付dubbo-service到k8s
2.1 准備資源清單
創建清單操作都在7.200
上操作
mkdir /data/k8s-yaml/dubbo-server/
cd /data/k8s-yaml/dubbo-server
2.1.1 創建depeloy清單
cat >dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-service
namespace: app
labels:
name: dubbo-demo-service
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-demo-service
template:
metadata:
labels:
app: dubbo-demo-service
name: dubbo-demo-service
spec:
containers:
- name: dubbo-demo-service
image: harbor.zq.com/app/dubbo-demo-service:master_200509_0800
ports:
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-server.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
需要根據自己構建鏡像的tag來修改image
dubbo的server服務,只向zk注冊並通過zk與dobbo的web交互,不需要對外提供服務
因此不需要service資源和ingress資源
2.2 創建k8s資源
創建K8S資源的操作,在任意node節點上操作即可
2.2.1 創建app名稱空間
業務資源和運維資源等應該通過名稱空間來隔離,因此創建專有名稱空間app
kubectl create namespace app
2.2.2 創建secret資源
我們的業務鏡像是harbor中的私有項目,所以需要創建docker-registry
的secret資源:
kubectl -n app \
create secret docker-registry harbor \
--docker-server=harbor.zq.com \
--docker-username=admin \
--docker-password=Harbor12345
2.2.3 應用資源清單
kubectl apply -f http://k8s-yaml.zq.com/dubbo-server/dp.yaml
3分鍾后檢查啟動情況
# 檢查pod是否創建:
~]# kubectl -n app get pod
NAME READY STATUS RESTARTS AGE
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 24s
# 檢查是否啟動成功:
~]# kubectl -n app logs dubbo-demo-service-79574b6879-cxkls --tail=2
Dubbo server started
Dubbo 服務端已經啟動
到zk服務器檢查是否有服務注冊
sh /opt/zookeeper/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[dubbo, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /dubbo
[com.od.dubbotest.api.HelloService]
3 交付dubbo-monitor監控服務到k8s
dobbo-monitor源碼地址: https://github.com/Jeromefromcn/dubbo-monitor.git
dubbo-monitor是監控zookeeper狀態的一個服務,另外還有dubbo-admin,效果一樣
3.1 制作dobbo-monitor鏡像
制作鏡像在管理機7.200
上操作
3.1.1 下載源碼
cd /opt/src
wget https://github.com/Jeromefromcn/dubbo-monitor/archive/master.zip
yum -y install unzip
unzip master.zip
mv dubbo-monitor-mster /data/dockerfile/dubbo-monitor
cd /data/dockerfile/dubbo-monitor
3.1.2 修改配置文件:
直接覆蓋它原始的配置
其實它原本就沒什么內容,只是修改了addr,端口,目錄等
cat >dubbo-monitor-simple/conf/dubbo_origin.properties <<'EOF'
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
dubbo.registry.address=zookeeper://zk1.zq.com:2181?backup=zk2.zq.com:2181,zk3.zq.com:2181
dubbo.protocol.port=20880
dubbo.jetty.port=8080
dubbo.jetty.directory=/dubbo-monitor-simple/monitor
dubbo.statistics.directory=/dubbo-monitor-simple/statistics
dubbo.charts.directory=/dubbo-monitor-simple/charts
dubbo.log4j.file=logs/dubbo-monitor.log
dubbo.log4j.level=WARN
EOF
3.1.3 優化Dockerfile啟動腳本
# 修改jvm資源限制(非必須)
sed -i '/Xmx2g/ s#128m#16m#g' ./dubbo-monitor-simple/bin/start.sh
sed -i '/Xmx2g/ s#256m#32m#g' ./dubbo-monitor-simple/bin/start.sh
sed -i '/Xmx2g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh
# 修改nohup為exec不能改去掉改行最后的&符號
sed -ri 's#^nohup(.*) &#exec\1#g' ./dubbo-monitor-simple/bin/start.sh
# 刪除exec命令行后面所有行
sed -i '66,$d' ./dubbo-monitor-simple/bin/start.sh
3.1.4 構建並上傳
docker build . -t harbor.zq.com/infra/dubbo-monitor:latest
docker push harbor.zq.com/infra/dubbo-monitor:latest
3.2 創建資源配置清單
3.2.1 准備目錄
mkdir /data/k8s-yaml/dubbo-monitor
cd /data/k8s-yaml/dubbo-monitor
3.2.2 創建deploy資源文件
cat >dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-monitor
namespace: infra
labels:
name: dubbo-monitor
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-monitor
template:
metadata:
labels:
app: dubbo-monitor
name: dubbo-monitor
spec:
containers:
- name: dubbo-monitor
image: harbor.zq.com/infra/dubbo-monitor:latest
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
3.2.3 創建service資源文件
cat >svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: dubbo-monitor
namespace: infra
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: dubbo-monitor
EOF
3.2.4 創建ingress資源文件
cat >ingress.yaml <<EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-monitor
namespace: infra
spec:
rules:
- host: dubbo-monitor.zq.com
http:
paths:
- path: /
backend:
serviceName: dubbo-monitor
servicePort: 8080
EOF
3.3 創建dobbo-miniotr服務
3.3.1 應用資源配置清單
在任意node節點
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/svc.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/ingress.yaml
驗證:
~]# kubectl -n infra get pod
NAME READY STATUS RESTARTS AGE
dubbo-monitor-d9675688c-sctsx 1/1 Running 0 29s
jenkins-7cd8b95d79-6vrbn 1/1 Running 0 3d2h
3.3.2 添加dns解析
這個服務是有web頁面的,創建了ingress和service資源的,所以需要添加dns解析
vi /var/named/zq.com.zone
dobbo-monitor A 10.4.7.10
重啟並驗證
systemctl restart named
dig -t A dubbo-monitor.zq.com @10.4.7.11 +short
3.3.3 訪問monitor的web頁面
訪問dubbo-monitor.zq.com
這里已經可以看到我們之前部署的dubbo-demo-service服務了,啟動了兩個進程來提供服務。
至此,dubbo-monitor監控服務已經部署完成。
4 構建dubbo-consumer服務
4.1 構建docker鏡像
4.1.1 獲取私有倉庫代碼
之前創建的dubbo-service是微服務的提供者,現在創建一個微服務的消費者
使用git@gitee.com:noah-luo/dubbo-demo-web.git
這個私有倉庫中的代碼構建消費者
先從https://gitee.com/sunx66/dubbo-demo-service
這里fork到自己倉庫,在設為私有
並修改zk的配置
4.1.2 配置流水線
之前已經在jenkins配置好了流水線,只需要填寫參數就行了。
參數名 | 參數值 |
---|---|
app_name | dubbo-demo-consumer |
image_name | app/dubbo-demo-consumer |
git_repo | git@gitee.com:noah-luo/dubbo-demo-web.git |
git_ver | master |
add_tag | 200506_1430 |
mvn_dir | ./ |
target_dir | ./dubbo-client/target |
mvn_cmd | mvn clean package -Dmaven.test.skip=true |
base_image | base/jre8:8u112 |
maven | 3.6.1 |
4.1.3 查看構建結果
如果構建不報錯,則應該已經推送到harbor倉庫中了,這時我們直接再給鏡像一個新tag,以便后續模擬更新
docker tag \
harbor.zq.com/app/dubbo-demo-consumer:master_200506_1430 \
harbor.zq.com/app/dubbo-demo-consumer:master_200510_1430
docker push harbor.zq.com/app/dubbo-demo-consumer:master_200510_1430
查看harbor倉庫
4.2 准備資源配置清單:
先准備目錄
mkdir /data/k8s-yaml/dubbo-consumer
cd /data/k8s-yaml/dubbo-consumer
4.2.1 創建deploy資源清單
cat >dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumer
namespace: app
labels:
name: dubbo-demo-consumer
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-demo-consumer
template:
metadata:
labels:
app: dubbo-demo-consumer
name: dubbo-demo-consumer
spec:
containers:
- name: dubbo-demo-consumer
image: harbor.zq.com/app/dubbo-demo-consumer:master_200506_1430
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-client.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
注意修改鏡像的tag
4.2.2 創建service資源清單
cat >svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: dubbo-demo-consumer
EOF
4.2.3 創建ingress資源清單
cat >ingress.yaml <<EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
rules:
- host: dubbo-demo.zq.com
http:
paths:
- path: /
backend:
serviceName: dubbo-demo-consumer
servicePort: 8080
EOF
4.3 創建K8S資源
4.3.1 應用資源配置清單:
kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/dp.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/svc.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/ingress.yaml
# 查看容器啟動成功沒
~]# kubectl get pod -n app
NAME READY STATUS RESTARTS AGE
dubbo-demo-consumer-b8d86bd5b-wbqhs 1/1 Running 0 6s
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h39m
4.3.2 驗證啟動結果
查看log,是否啟動成功:
~]# kubectl -n app logs --tail=2 dubbo-demo-consumer-b8d86bd5b-wbqhs
Dubbo client started
Dubbo 消費者端啟動
檢查dubbo-monitor是否已經注冊成功:
4.3.3 添加dns解析
vi /var/named/zq.com.zone
dubbo-demo A 10.4.7.10
# 重啟服務
systemctl restart named
# 驗證
~]# dig -t A dubbo-demo.zq.com @10.4.7.11 +short
10.4.7.10
瀏覽器訪問http://dubbo-demo.zq.com/hello?name=lg
4.4 模擬版本升級
接下來我們模擬升級發版,之前已經用同一個鏡像打了不同的tag並推送到從庫
當然正常發版的順序是:
- 提交修改過的代碼的代碼塊
- 使用jenkins構建新鏡像
- 上傳到私有harbor倉庫中
- 更新de文件並apply
4.4.1 修改dp.yaml資源配置清單
修改harbor鏡像倉庫中對應的tag版本:
sed -i 's#master_200506_1430#master_200510_1430#g' dp.yaml
4.4.2 應用修改后的資源配置清單
當然也可以在dashboard中進行在線修改:
kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/dp.yaml
~]# kubectl -n app get pod
NAME READY STATUS RESTARTS AGE
dubbo-demo-consumer-84f75b679c-kdwd7 1/1 Running 0 54s
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h58m
4.4.3 使用瀏覽器驗證
使用瀏覽器驗證:http://dubbo-demo.zq.com/hello?name=lg
在短暫的超時后,即可正常訪問
至此,我們一套完成的dubbo服務就已經交付到k8s集群當中了,並且也演示了如何發版。