K8S(09)交付實戰-經過流水線構建dubbo服務

k8s交付實戰-流水線構建dubbo服務

1 jenkins流水線準備工做

1.1 參數構建要點

jenkins流水線配置的java項目的十個經常使用參數: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 parameternode

1.2 建立流水線

1.2.1 建立流水線

建立名爲dubbo-demo的流水線(pipeline),並設置Discard old builds 爲以下git

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個參數github

#第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 添加完成效果以下:

mark

1.2.4 添加pipiline代碼

流水線構建所用的pipiline代碼語法比較有專門的生成工具
如下語句的做用大體是分爲四步:拉代碼->構建包->移動包-打docker鏡像並推送web

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}"
        }
      }
    }
}

img

1.3 用流水線完成dubbo-service的構建

記得先在harbor中建立私有倉庫appspring

1.3.1 選擇參數化構建

進入dubbo-demo後,選擇的參數化構建build with parameters ,填寫10個構建的參數docker

參數名 參數值
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 填寫完成效果以下

mark

1.3.3 執行構建並檢查

填寫完之後執行bulid
第一次構建須要下載不少依賴包,時間很長,抽根菸,喝杯茶
通過漫長的等待後,已經構建完成了
點擊打開 Blue Ocean查看構建歷史及過程:api

img

檢查harbor是否已經有這版鏡像:瀏覽器

mark

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

mark

這裏已經能夠看到咱們以前部署的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倉庫

mark

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是否已經註冊成功:

img

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

mark

4.4 模擬版本升級

接下來咱們模擬升級發版,以前已經用同一個鏡像打了不一樣的tag並推送到從庫
固然正常發版的順序是:

  1. 提交修改過的代碼的代碼塊
  2. 使用jenkins構建新鏡像
  3. 上傳到私有harbor倉庫中
  4. 更新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

img

4.4.3 使用瀏覽器驗證

使用瀏覽器驗證:http://dubbo-demo.zq.com/hello?name=lg 在短暫的超時後,便可正常訪問 至此,咱們一套完成的dubbo服務就已經交付到k8s集羣當中了,而且也演示瞭如何發版。

相關文章
相關標籤/搜索