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
建立名爲dubbo-demo
的流水線(pipeline),並設置Discard old builds
爲以下git
Discard old builds選項 | 值 |
---|---|
Days to keep builds | 3 |
Max # of builds to keep | 30 |
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軟件版本
流水線構建所用的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}" } } } }
記得先在harbor中建立私有倉庫app
spring
進入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 |
填寫完之後執行bulid
第一次構建須要下載不少依賴包,時間很長,抽根菸,喝杯茶
通過漫長的等待後,已經構建完成了
點擊打開 Blue Ocean
查看構建歷史及過程:api
檢查harbor是否已經有這版鏡像:瀏覽器
建立清單操做都在7.200
上操做服務器
mkdir /data/k8s-yaml/dubbo-server/ cd /data/k8s-yaml/dubbo-server
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資源
建立K8S資源的操做,在任意node節點上操做便可
業務資源和運維資源等應該經過名稱空間來隔離,所以建立專有名稱空間app
kubectl create namespace app
咱們的業務鏡像是harbor中的私有項目,因此須要建立docker-registry
的secret資源:
kubectl -n app \ create secret docker-registry harbor \ --docker-server=harbor.zq.com \ --docker-username=admin \ --docker-password=Harbor12345
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]
dobbo-monitor源碼地址: https://github.com/Jeromefromcn/dubbo-monitor.git
dubbo-monitor是監控zookeeper狀態的一個服務,另外還有dubbo-admin,效果同樣
製做鏡像在管理機7.200
上操做
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
直接覆蓋它原始的配置
其實它本來就沒什麼內容,只是修改了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
# 修改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
docker build . -t harbor.zq.com/infra/dubbo-monitor:latest docker push harbor.zq.com/infra/dubbo-monitor:latest
mkdir /data/k8s-yaml/dubbo-monitor cd /data/k8s-yaml/dubbo-monitor
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
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
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
在任意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
這個服務是有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
訪問dubbo-monitor.zq.com
這裏已經能夠看到咱們以前部署的dubbo-demo-service服務了,啓動了兩個進程來提供服務。
至此,dubbo-monitor監控服務已經部署完成。
以前建立的dubbo-service是微服務的提供者,如今建立一個微服務的消費者
使用git@gitee.com:noah-luo/dubbo-demo-web.git
這個私有倉庫中的代碼構建消費者
先從https://gitee.com/sunx66/dubbo-demo-service
這裏fork到本身倉庫,在設爲私有
並修改zk的配置
以前已經在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 |
若是構建不報錯,則應該已經推送到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倉庫
先準備目錄
mkdir /data/k8s-yaml/dubbo-consumer cd /data/k8s-yaml/dubbo-consumer
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
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
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
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
查看log,是否啓動成功:
~]# kubectl -n app logs --tail=2 dubbo-demo-consumer-b8d86bd5b-wbqhs Dubbo client started Dubbo 消費者端啓動
檢查dubbo-monitor是否已經註冊成功:
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
接下來咱們模擬升級發版,以前已經用同一個鏡像打了不一樣的tag並推送到從庫
固然正常發版的順序是:
修改harbor鏡像倉庫中對應的tag版本:
sed -i 's#master_200506_1430#master_200510_1430#g' dp.yaml
固然也能夠在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
使用瀏覽器驗證:http://dubbo-demo.zq.com/hello?name=lg 在短暫的超時後,便可正常訪問 至此,咱們一套完成的dubbo服務就已經交付到k8s集羣當中了,而且也演示瞭如何發版。