學習完k8s 之后,簡單研究下,基於jenkins、gitlab、docker、k8s 實現自動部署微服務。
1. 機器規划
后來機器扛不住,就將gitlab 鏡像給停掉了,采用了gitee 。不過便於學習,還是學習了下其搭建過程。
2. 組件搭建
1. 安裝gitlab
1.
docker pull gitlab/gitlab-ce mkdir -p /mnt/gitlab/config && mkdir -p /mnt/gitlab/logs && mkdir -p /mnt/gitlab/data sudo docker run --detach \ --publish 443:443 --publish 80:80 --publish 2222:22 \ --name gitlab \ --restart always \ --volume /mnt/gitlab/config:/etc/gitlab \ --volume /mnt/gitlab/logs:/var/log/gitlab \ --volume /mnt/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce
[root@k8smaster01 ~]# docker ps -a | grep git e37f4c46caf6 gitlab/gitlab-ce "/assets/wrapper" About an hour ago Up 23 seconds (health: starting) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:2222->22/tcp gitlab
接下來有的需要修改配置文件, 對應於宿主機 /mnt/gitlab/config/gitlab.rb, 不修改可以訪問git 但是新建倉庫之后的http 地址和ssh 地址不正確:
# 配置http協議所使用的訪問地址,不加端口號默認為80 external_url 'http://192.168.13.107/' # 配置ssh協議所使用的訪問地址和端口 gitlab_rails['gitlab_ssh_host'] = '192.168.13.107' # 此端口是run時22端口映射的222端口 gitlab_rails['gitlab_shell_ssh_port'] = 2222
接下來正常訪問宿主機的80 端口即可訪問到gitlab 服務器。
啟動成功之后,查看初始的賬號和密碼, 被掛載到宿主機的如下目錄: (第一次登錄之后需要修改賬號密碼, 修改為: qwe123123)
[root@k8smaster01 config]# cat /mnt/gitlab/config/initial_root_password # WARNING: This value is valid only in the following conditions # 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run). # 2. Password hasn't been changed manually, either via UI or via command line. # # If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. Password: 7RLbaj2e0NSIcM6UfcQJQJRGW3xJ2J2C6b9MbqXJGVs= # NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
我們進入到容器查看相關的進程,可以看到一個gitlab 服務器安裝的相關進程如下:
root@e37f4c46caf6:/# gitlab-ctl status run: alertmanager: (pid 361) 724s; run: log: (pid 359) 724s run: gitaly: (pid 260) 729s; run: log: (pid 259) 729s run: gitlab-exporter: (pid 355) 724s; run: log: (pid 354) 724s run: gitlab-workhorse: (pid 316) 727s; run: log: (pid 313) 727s run: grafana: (pid 679) 585s; run: log: (pid 674) 586s run: logrotate: (pid 264) 729s; run: log: (pid 263) 729s run: nginx: (pid 336) 726s; run: log: (pid 335) 726s run: postgres-exporter: (pid 362) 724s; run: log: (pid 360) 724s run: postgresql: (pid 314) 727s; run: log: (pid 310) 727s run: prometheus: (pid 364) 724s; run: log: (pid 363) 724s run: puma: (pid 315) 727s; run: log: (pid 312) 727s run: redis: (pid 262) 729s; run: log: (pid 261) 729s run: redis-exporter: (pid 358) 724s; run: log: (pid 357) 724s run: sidekiq: (pid 317) 727s; run: log: (pid 311) 727s run: sshd: (pid 30) 749s; run: log: (pid 29) 749s
docker search jenkins docker pull jenkins/jenkins:lts [root@k8smaster02 ~]# docker images | grep jenk jenkins/jenkins lts 2a4bbe50c40b 2 months ago 441MB [root@k8smaster02 ~]# docker inspect 2a4bbe50c40b # 查看拉取的鏡像版本, 是2.319.1 mkdir -p /mnt/jenkins/ docker run -d --name jenkins -p 8080:8080 -v /mnt/jenkins:/home/jenkins_01 jenkins/jenkins:lts # 啟動后查看日志獲取密碼 [root@k8smaster02 jenkins]# docker logs d0f44023a64d ... Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: e0b480871a42480b876e7e18af6432b7 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 2022-02-18 06:24:29.402+0000 [id=49] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller 2022-02-18 06:24:29.403+0000 [id=49] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1 2022-02-18 06:24:29.406+0000 [id=49] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$1: Finished Download metadata. 401,840 ms
然后我訪問8080 端口即可。第一次登錄需要輸入密碼,密碼是日志窗口提示的日志信息。
登錄之后需要選擇插件安裝,我們選擇手動安裝的插件,然后清掉所有的插件即可。 然后確認后會進入創建默認用戶的界面,創建一個用戶 root/qwe123123
接下來安裝必要的插件:
Jenkins >> Manage Jenkins >> Manage Plugins (插件管理也是在這個選項卡)
這里可以看見已經安裝的plugin以及可以安裝的plugin。這里我們安裝:
Maven項目插件:Maven Integration plugin,這個插件可以讓我們創建一個maven構建任務。
ssh傳輸工具插件:Publish Over SSH 項目打包完成后,使用這個插件,通過ssh的方式傳輸到遠程服務器。
Gitlab插件:允許Jenkins訪問gitlab服務器,拉取代碼
Pipeline: 流水線插件,用於構建流水線任務。基於流水線語法構造任務,也可以基於jenkins 的自由風格的項目進行構建。
一般簡單的項目是基於自由風格,自己編寫; 復雜的項目用pipeline 流水線。
補充: 由於后來發現掛載的目錄缺少了data目錄,jenkins 自動掛載了data 目錄, 這個最好是啟動時候自己掛載下
查看其掛載如下:
"Mounts": [ { "Type": "bind", "Source": "/mnt/jenkins", "Destination": "/home/jenkins_01", "Mode": "", "RW": true, "Propagation": "rprivate" }, { "Type": "volume", "Name": "8d16c47f96e4ad0729f1c713a14d35863efb4bccec1d3799887edd332c4b5410", "Source": "/var/lib/docker/volumes/8d16c47f96e4ad0729f1c713a14d35863efb4bccec1d3799887edd332c4b5410/_data", "Destination": "/var/jenkins_home", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]
0. 容器內部安裝maven以及查看git、java
1. 宿主機下載執行包安裝maven
[root@k8smaster02 jenkins]# curl -O http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 8292k 100 8292k 0 0 3876k 0 0:00:02 0:00:02 --:--:-- 3876k [root@k8smaster02 jenkins]# ll total 8296 -rw-r--r-- 1 root root 8491533 Feb 19 06:15 apache-maven-3.3.9-bin.tar.gz
然后解壓:
tar xvf apache-maven-3.3.9-bin.tar.gz
因為是目錄掛載的關系,我們進入容器內部查看mvn 所在命令如下: (mvn 命令自動掛載到容器內部)
jenkins@d0f44023a64d:/$ /home/jenkins_01/apache-maven-3.3.9/bin/mvn -v Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00) Maven home: /home/jenkins_01/apache-maven-3.3.9 Java version: 11.0.13, vendor: Eclipse Adoptium Java home: /opt/java/openjdk Default locale: en, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-1160.49.1.el7.x86_64", arch: "amd64", family: "unix"
2. 容器內部查看git、java
jenkins@d0f44023a64d:/$ whereis git git: /usr/bin/git /usr/share/man/man1/git.1.gz jenkins@d0f44023a64d:/$ java -version openjdk version "11.0.13" 2021-10-19 OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8) OpenJDK 64-Bit Server VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode) jenkins@d0f44023a64d:/$ whereis java java: /opt/java/openjdk/bin/java
1. 流水線語法測試
如果了解可以跳過這一步。
1. 新建一個流水線項目
2. 編寫流水線腳本
流水線腳本有下面兩種方式:
(1) 自己在webui 界面編寫pileline 腳本。 這種又有幾種腳本模板,如下:
簡單說就是有兩種, 一種是Declarative聲明式; 另一種是 Scripted腳本式, 可以編寫一些groovy腳本語言。
(2) 將pipeline 腳本存放在scm , 常見的就是放在git項目的根目錄下面。
下面先研究第一種的Declarative聲明式,用helloworld 模板修改之后進行測下; 第二種scm 下面的在后面進行測試。
2. pipeline 內容如下:(這個腳本模仿着寫就好了, 生成的時候也有個helloworld 模板。 用stage 代表多個階段。)
pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } } stage('Hello1') { steps { echo 'Hello World1' } } stage('Hello2') { steps { echo 'Hello World2' } } stage('Hello3') { steps { echo 'Hello World3' } } } }
3. 最后保存后點擊build now 運行即可。
補充: pipeline 腳本也可以定義變量,也可以獲取jenkins 一些內置的變量,比如獲取憑據賬號密碼和自定義的版本
pipeline { agent any environment { REDISTRY_ALIYUN = credentials('registry-aliyun') TEST_STR="1.0.0" } stages { stage('Hello') { steps { echo 'Hello World' echo "version:${TEST_STR}" echo "${REDISTRY_ALIYUN_USR}" echo "${REDISTRY_ALIYUN_PSW}" } } } }
注意: pipeline 語法不需要記憶,可以點擊流水線任務左側的流水線語法會到流水線語法幫助界面。 可以用片段生成器或者Declarative 生命式語法,選擇相應的任務然后生成階段的語法。
3. 編寫流水線部署java 項目: jenkins、maven、git
這里實現的效果就是通過git 拉取代碼,拉取完用mvn 打包,打包之后將jar 包傳輸到應用服務器,並調用shell 腳本啟動應用。這里需要理解,針對jenkins 的執行, 其資源的路徑都是在容器內部的路徑,不是宿主機的路徑。
1. jenkins 設置, 如果設置好可以跳過這一步
(1) Manage Jenkins -> Manage Credentials -> jenkins -> 全局憑據 -> Add Credentials 這里實際上相當於管理一些賬號密碼
添加git 的憑據
(2) 配置賬號:Jenkins >> Manage Jenkins >> System Configuration >> Configure System 中設置:
2. 編寫pipeline 腳本: 下面的腳本都是基於流水線語法的片段生成器生成。 如果測試最終的腳本可以點擊項目build now 進行測試
這里需要清楚,相關的腳本是跑在jenkins 容器內部的,所以相關的指令以及最后的產物都是基於容器的路徑進行的。
(1) 編寫拉取代碼的git 腳本:
拷貝到項目后如下:
pipeline { agent any stages { stage('checkout code') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/Qiao-Zhi/bs-school-navigation.git']]]) } } } }
執行一次后到容器內部以及到宿主機查看相關的產物如下:
### 容器內部如下 jenkins@d0f44023a64d:~/workspace$ ls bs-school-devops bs-school-devops@tmp jenkins@d0f44023a64d:~/workspace$ pwd /var/jenkins_home/workspace jenkins@d0f44023a64d:~/workspace$ du -h --max-depth=1 12M ./bs-school-devops 0 ./bs-school-devops@tmp 12M . ###宿主機如下 [root@k8smaster02 workspace]# ls bs-school-devops bs-school-devops@tmp [root@k8smaster02 workspace]# pwd /var/lib/docker/volumes/8d16c47f96e4ad0729f1c713a14d35863efb4bccec1d3799887edd332c4b5410/_data/workspace [root@k8smaster02 workspace]# du -h --max-depth=1 12M ./bs-school-devops 0 ./bs-school-devops@tmp 12M .
(2) 執行mvn 打包
1》 到容器內部執行測試:
jenkins@d0f44023a64d:~/workspace/bs-school-devops$ cd /var/jenkins_home/workspace/bs-school-devops jenkins@d0f44023a64d:~/workspace/bs-school-devops$ /home/jenkins_01/apache-maven-3.3.9/bin/mvn clean package -DskipTests
2》到jenkins 界面的流水線語法-》片段生成器 生成相關語法:
和上面合並之后的腳本如下:
pipeline { agent any stages { stage('checkout code') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/Qiao-Zhi/bs-school-navigation.git']]]) } } stage('mvn package') { steps { sh '''cd /var/jenkins_home/workspace/bs-school-devops /home/jenkins_01/apache-maven-3.3.9/bin/mvn clean package -DskipTests''' } } } }
也可以格式化為:
pipeline { agent any stages { stage('checkout code') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/Qiao-Zhi/bs-school-navigation.git']]]) } } stage('mvn package') { steps { sh ''' cd /var/jenkins_home/workspace/bs-school-devops /home/jenkins_01/apache-maven-3.3.9/bin/mvn clean package -DskipTests ''' } } } }
可以點擊build now 進行測試。
(3) 編寫將package 后的jar 包傳輸到k8snode01 節點並且啟動應用的pipeline 腳本
第一種就是自己配飾jenkins 和 各個主機的ssh 秘鑰,然后用ssh 執行命令、scp 傳輸文件。第二種就是借助於插件。下面研究第二種借助於插件。
安裝Publish Over ssh 插件, 之前版本可以搜索到,但是現在的版本好像從界面搜索不到。需要離線下載。 到 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/ 下載。
搜索到之后下載最新版本的 .hpi 文件, 需要如下三個hpi, publish over ssh 依賴另外兩個:
publish-over-ssh.hpi jsch.hpi publish-over.hpi
下載后放到 /var/lib/docker/volumes/8d16c47f96e4ad0729f1c713a14d35863efb4bccec1d3799887edd332c4b5410/_data/plugins 目錄, 會自動映射到容器內部 /var/jenkins_home/plugins 中,然后重啟jenkins容器即可。
1》 配置SSHserver:Jenkins -》Configure System -》 SSH Servers 點擊add可以添加多個
2》在k8snode1 節點創建目錄 /home/bs-school , 並且該目錄下新建 deploy.sh, 內容如下:
#!/bin/bash #這里可替換為你自己的執行程序,其他代碼無需更改 APP_NAME=$2.jar #使用說明,用來提示輸入參數 usage() { echo "Usage: sh 腳本名.sh [start|stop|restart|status]" exit 1 } #檢查程序是否在運行 is_exist(){ pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #啟動方法 start(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is already running. pid=${pid} ." else nohup java -jar $APP_NAME & echo "${APP_NAME} start success" fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid echo "kill pid ${pid}" else echo "${APP_NAME} is not running" fi } #輸出運行狀態 status(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is running. Pid is ${pid}" else echo "${APP_NAME} is NOT running." fi } #重啟 restart(){ stop start } #根據輸入參數,選擇執行對應方法,不輸入則執行使用說明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac
3》到流水線語法用片段生成器生成,如下:
sshpublisher 用於傳輸文件或者鏈接到遠程主機執行shell 腳本,Transfers中的Transfer Set 可以包含多個。 每個必須包含傳輸文件或者shell 腳本,可以同時有。如果還需要在傳輸文件之前將已經存在的文件進行備份或者其他操作,可以在第一個Transfer set 執行shell 腳本進行備份。第二個transfer set 傳輸文件,然后啟動應用。
上面只是將打包后的jar 包傳輸到109 服務器,然后執行對應的重啟腳本。
關於上面的參數解釋如下:
Source files: 是上傳的文件,可以用通配符的形式。 該路徑是以該項目路徑為開始的相對路徑。
remove prefix:刪除的目錄,如果不填,會在目錄下創建一個target目錄。官方解釋如下: if Source files were target/deployment/images/**/ then you may want Remove prefix to be target/deployment This would create the images folder under the remote directory, and not target/deployment Jenkins environment variables can be used in this path. Remote directory:是上傳的位置(遠程應用服務器位置),是一個相對路徑。相對於上面SSHserver設置的路徑。比如我上面設置的是/opt/jar,並且這個屬性設置為/ssm。則文件上傳后位於/opt/jar/ssm/ 目錄 Exec command: 是上傳后執行的遠程命令。在上面我也是啟動服務,注意默認路徑是當前登錄用戶的根目錄。我是root用戶,所以默認在/root
最終生成的pipeline script 腳本如下:
sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.13.109', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /root/bs-school sh deploy.sh restart springboot-ssm-0.0.1-SNAPSHOT''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/root/bs-school', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
4》 和上面最終合成新的pipeline script 如下:
pipeline { agent any stages { stage('checkout code') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/Qiao-Zhi/bs-school-navigation.git']]]) } } stage('mvn package') { steps { sh ''' /home/jenkins_01/apache-maven-3.3.9/bin/mvn clean package -DskipTests ''' } } stage('ssh transper & start app') { steps { sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.13.109', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: ''' cd /root/bs-school sh deploy.sh restart springboot-ssm-0.0.1-SNAPSHOT ''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/root/bs-school', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } }
5》 保存后點擊build now, 即可以實現, 通過jenkins、git、mvn 實現打包,並通過jar 包的方式啟動應用。
4. 基於jenkins、git、kubernetes、docker 實現基於容器的部署方式
上面3 中編寫的pipeline 實際上是存在jenkins 服務端,有個弊端就是服務端宕機后造成腳本丟失,下面研究腳本存放在項目路徑,然后實現從jenkins 通過git 拉取代碼之后,通過mvn 打包,然后構造成鏡像上傳到鏡像服務器(阿里鏡像服務器),再通過kubectl 開啟應用。
其中:
(1) pipeline 腳本存放在項目根目錄
(2) pipeline 腳本分為如下步驟:
1》拉取代碼
2》mvn 打包
3》傳輸到107 kubernetes 主機(包括jar包、Dockerfile、kubernetes的yaml文件),並且執行docker 打包、傳送到鏡像倉庫、用kubectl 更新deployment
(3) kubernetes 機子登錄docker 鏡像服務器的時候密碼是明文的,如果想密文可以用jenkins的憑據和全局函數獲取。
1. 前期准備:
1. 服務器在jenkins 上面的維護,方法同上面一樣。
2. 108 kubernetes 創建一個dev namespace,用於存放新的任務
kubectl create namespace dev
3.107 kubernetes 服務器新建一個secret , 用於拉取私有鏡像
kubectl create secret docker-registry registry-aliyun --namespace=dev \ --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=username --docker-password=pwd --docker-email=xxx@163.com
4. 107 上面新建目錄
mkdir -p /root/bs-school
2. 搭建環境
1. 新建項目 bs-school, pipeline 選擇from scm
2. 項目主要文件如下:
(1) 目錄結構
(2) Jenkinsfile 內容如下,其實就是pipeline 腳本
pipeline { agent any stages { stage('checkout code') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/devops-test']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/Qiao-Zhi/bs-school-navigation.git']]]) } } stage('mvn package') { steps { sh ''' /home/jenkins_01/apache-maven-3.3.9/bin/mvn clean package -DskipTests ''' } } stage('ssh transper') { steps { sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.13.107', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /root/bs-school docker images | grep bs-school-navigation | awk \'{print $3}\' | xargs docker rmi 2>>./rmi.log docker build -t bs-school-navigation:1.0.0 . docker tag bs-school-navigation:1.0.0 registry.cn-hangzhou.aliyuncs.com/qlq_repository/bs-school-navigation:1.0.0 docker login --username=username -p=pwd registry.cn-hangzhou.aliyuncs.com docker push registry.cn-hangzhou.aliyuncs.com/qlq_repository/bs-school-navigation:1.0.0 kubectl delete -f bs-school-k8s.yaml kubectl apply -f bs-school-k8s.yaml''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/root/bs-school/', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile,bs-school-k8s.yaml,target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } }
(3) Dockerfile 內容如下
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD ./target/bs-school-navigation.jar /bs-school-navigation.jar ENTRYPOINT ["java", "-jar", "/bs-school-navigation.jar", "&"]
(4) bs-school-k8s.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: bs-school-navigation namespace: dev labels: app: bs-school-navigation spec: replicas: 1 selector: matchLabels: app: bs-school-navigation template: metadata: labels: app: bs-school-navigation spec: containers: - name: bs-school-navigation image: registry.cn-hangzhou.aliyuncs.com/qlq_repository/bs-school-navigation:1.0.0 imagePullPolicy: Always ports: - containerPort: 8088 imagePullSecrets: - name: registry-aliyun --- apiVersion: v1 kind: Service metadata: name: bs-school-navigation namespace: dev labels: app: bs-school-navigation spec: type: NodePort ports: - port: 8088 nodePort: 30002 selector: app: bs-school-navigation
3. 保存后進行測試, 然后代碼更新controller 后用jenkins 構建進行測試。 Controller 修改后,可以通過構建將最新的代碼發布到kubernetes 環境中。
4. 上面還有許多可以改進的,比如發布的版本問題,每次構建的時候鏡像什么的版本重新構造; 還有就是登錄鏡像倉庫的時候,密碼可以改為用jenkins的憑據管理;最后在107 服務器執行發布到kubernetes 環境中的一系列命令也可以編寫為shell腳本,以sh腳本的形式進行調用。
至此實現了jenkins流水線,結合git、maven、docker、k8s 實現自動部署。接下來研究在kubesphere 環境中的構建。