maven項目部署流程圖以下:html
操做系統 | ip | 角色 | 版本 |
ubuntu-16.04.4-server-amd64 | 192.168.10.122 | Jenkins+harbor | Jenkins 2.176.2,harbor 1.8.1 |
ubuntu-16.04.4-server-amd64 | 192.168.10.134 | gitlab | gitlab-ce_12.1.4 |
ubuntu-16.04.4-server-amd64 | 192.168.10.130 | k8s master | kubernetes 1.15.2 |
ubuntu-16.04.4-server-amd64 | 192.168.10.131 | k8s node | kubernetes 1.15.2 |
因爲資源緊張,Jenkins+harbor合併爲一臺了。實際上,應該是要單獨部署的。java
k8s安裝,請參考連接:node
http://www.javashuo.com/article/p-blzirujo-hx.htmllinux
gitlab安裝,請參考連接:git
http://www.javashuo.com/article/p-qijwneax-kg.htmlgithub
harbor安裝,請參考連接:web
http://www.javashuo.com/article/p-dexkqkql-kv.htmlspring
Jenkins安裝,請參考連接:docker
http://www.javashuo.com/article/p-clpekofp-ky.htmlshell
注意:Jenkins安裝以後,還須要作如下配置。不然沒法實現本文章的功能!!!
Jenkins基於https的k8s配置,請參考連接:
http://www.javashuo.com/article/p-vovzuddm-me.html
GitLab+Jenkins持續集成,請參考連接:
http://www.javashuo.com/article/p-ysxvlfnw-mp.html
Jenkins配置maven,請參考連接:
http://www.javashuo.com/article/p-sfprzunv-mp.html
首先從github上面,找一個基於maven的項目,地址以下:
https://github.com/solochen84/SpringBootDemo
使用git客戶端,下載此項目代碼
登陸gitlab,建立一個項目springbootdemo
點擊 設置--> 成員
添加2個成員,一個是jenkins用戶,用來拉取代碼的。一個是我,用來提交代碼的。
注意:個人帳號,權限要高一些,能夠直接提交到master分支。
將github下載的代碼,提交到剛剛建立的項目中。效果以下:
登陸到harbor後臺,點擊建立用戶
注意,每一項都填寫一項。尤爲是密碼,必須符合密碼複雜性要求。
點擊新建項目
輸入名字,java。這就是私有項目。
點擊java
點擊成員-->用戶
輸入jenkins,會有提示的。角色選擇 開發人員。
使用jenkins執行shell命令時,可能會出現權限不足的狀況。
cat /etc/default/jenkins
內容以下:
# pulled in from the init script; makes things easier. NAME=jenkins # arguments to pass to java # Allow graphs etc. to work even when an X server is present JAVA_ARGS="-Djava.awt.headless=true" #JAVA_ARGS="-Xmx256m" # make jenkins listen on IPv4 address #JAVA_ARGS="-Djava.net.preferIPv4Stack=true" PIDFILE=/var/run/$NAME/$NAME.pid # user and group to be invoked as (default to jenkins) JENKINS_USER=$NAME JENKINS_GROUP=$NAME
...
能夠發現JENKINS_USER和JENKINS_GROUP變量的值是jenkins
將下面2個變量,修改成root
JENKINS_USER=root
JENKINS_GROUP=root
service jenkins restart
爲何要和k8s master作ssh免密呢?由於jenkins須要登陸到k8s master,作一些pod操做。
登陸到jenkins服務器,生成祕鑰
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
ssh-copy-id 192.168.10.130
測試root免密
ssh 192.168.10.130
若是沒有提示輸入密碼,說明成功了!
修改docker配置文件,添加harbor地址
vim /etc/docker/daemon.json
內容以下:
{"insecure-registries": ["192.168.10.122"]}
從新加載docker配置
/etc/init.d/docker reload
測試登陸
root@ubuntu:~/docker_dir# docker login 192.168.10.122 -u jenkins -p Jenkins@1234 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
若是出現
Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
表示 /etc/docker/daemon.json 文件修改不正確
登陸到jenkins後臺,點擊 新建Item
輸入名稱,選擇構建一個maven項目。注意:任務名稱最好是項目名,由於下面的deploy_docker.sh腳本,會調用這個變量。
丟棄舊的構建,保留2天
輸入倉庫下載地址,選擇用戶root
輸入命令:clean package
mvn clean package依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個階段。
package命令完成了項目編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠程maven私服倉庫
build完成以後,選擇執行shell命令
將下面的內容,貼過去
#!/bin/bash jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar jarFolder=$JOB_NAME harborPro=java projectName=$JOB_NAME docker_path=${WORKSPACE} cp ${WORKSPACE}/target/${jarName} ${docker_path} bash -x /root/docker_dir/deploy_docker.sh ${harborPro} ${projectName} ${docker_path} ${jarName}
內容解釋:
jarName jar包的文件名,名字隨便
jarFolder jar包的文件夾
harborPro harbor裏面的項目,在上面步驟中,建立java私有項目。
projectName 項目名,名字隨便
docker_path docker命令的工做目錄
最後一步,會執行一個shell腳本。下面說到!
效果以下:
登陸到jenkins服務器,建立目錄
mkdir /root/docker_dir
編輯deploy_docker.sh腳本
cd /root/docker_dir/ vim deploy_docker.sh
內容以下:
#!/bin/bash # maven $workspace $jarname # ${harborPro} ${projectName} ${docker_path} ${jarName} set -e harbor_project=$1 projectName=$2 docker_path=$3 appName=$4 # harbor認證用戶 user_name=jenkins password=Jenkins@1234 # harbor地址以及tag tag=$(date +%s) harbor_server=192.168.10.122 server_path=${harbor_server} taget_image=${projectName}:${tag} #${BUILD_NUMBER} echo ${taget_image} # 登陸docker cd ${docker_path} sudo docker login ${harbor_server} -u ${user_name} -p ${password} # 生成鏡像並推送到harbor,最後刪除本地鏡像 sudo docker build --build-arg app=${appName} -t ${taget_image} . sudo docker tag ${taget_image} ${server_path}/${harbor_project}/${projectName} echo "The name of image is ${server_path}/${harbor_project}/${projectName}" sudo docker push ${server_path}/${harbor_project}/${projectName}:latest sudo docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n 1)
添加執行權限
chmod 755 /root/docker_dir/deploy_docker.sh
登陸到k8s master,建立目錄
mkdir kube-conf
刪除gitlab springbootdemo項目中的kube.yaml,新增2個yaml文件。
ph-service.yaml
apiVersion: v1 kind: Service metadata: name: ph-service spec: type: NodePort ports: - name: ph port: 8080 nodePort: 31002 targetPort: 8080 protocol: TCP selector: app: ph
ph-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: ph-rc spec: replicas: 1 template: metadata: labels: app: ph spec: imagePullSecrets: - name: harborsecret containers: - name: ph image: 192.168.10.122/java/ph:latest imagePullPolicy: Always ports: - containerPort: 8080 env: - name: key value: "value"
將2個yaml文件提交到gitlab
k8s 生成imagePullSecrets,請參考如下連接
http://www.javashuo.com/article/p-zjilcjdv-mm.html
注意:使用docker登陸用戶時,指定jenkins
docker login 192.168.10.122 -u jenkins -p Jenkins@1234
登陸到jenkins服務器,新增重啓應用腳本
cd /root/docker_dir vim reboot_app.sh
內容以下:
#!/bin/bash MASTER="192.168.10.130" CONF_DIR="/root/kube-conf" ProJ=${JOB_NAME} scp ${WORKSPACE}/*.yaml ${MASTER}:${CONF_DIR} # Pod running process RUN=$(ssh $MASTER kubectl get po|grep -w ${ProJ}|wc -l) if [ $RUN -eq 0 ];then ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-rc.yaml ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-service.yaml else # Delete pod podname=$(ssh ${MASTER} kubectl get po|grep -w ${ProJ}|awk '{print $1}') ssh ${MASTER} kubectl delete po $podname --grace-period=0 --force ssh ${MASTER} kubectl get po|grep ${ProJ} fi
添加執行權限
chmod 755 /root/docker_dir/reboot_app.sh
添加執行shell命令
將下面的內容,貼過去
#!/bin/bash bash -x /root/docker_dir/reboot_app.sh
效果以下:
點擊Build Now
點擊#1
點擊控制檯輸出
它會本身下載一些組件,須要等待一段時間。
出現spring圖標,表示應用開始啓動構建了。
最後出現錯誤
爲啥呢? 查看springbootdemo 的Dockerfile文件,查看第一行
FROM registry-scu.cloudtogo.cn/ubuntu:jdk
須要把 registry-scu.cloudtogo.cn 添加到 /etc/docker/daemon.json中
登陸到jenkins服務器,修改 /etc/docker/daemon.json
vim /etc/docker/daemon.json
內容以下:
{"insecure-registries": ["192.168.10.122","registry-scu.cloudtogo.cn"]}
從新加載docker
/etc/init.d/docker reload
再次手動構建一次,點擊Build Now
查看構建過程
出現如下提示,說明正在下載鏡像 registry-scu.cloudtogo.cn/ubuntu:jdk
最後提示執行完成
會發現多了一個鏡像,這個鏡像,就是剛剛構建時,提交的。
root@k8s-master:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ph-rc-nj7j2 0/1 ImagePullBackOff 0 5m19s 192.168.36.68 k8s-node1 <none> <none>
發現pod運行在k8s-node1 這臺服務器,狀態是ImagePullBackOff
查看pod詳細信息
kubectl describe po maven-deployment-7bd87867f8-6tlgp
輸出:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m15s default-scheduler Successfully assigned default/maven-deployment-7bd87867f8-6tlgp to k8s-node1 Normal Pulling 5m49s (x4 over 7m14s) kubelet, k8s-node1 Pulling image "192.168.10.122/maven:latest" Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Failed to pull image "192.168.10.122/maven:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Error: ErrImagePull Normal BackOff 5m36s (x6 over 7m13s) kubelet, k8s-node1 Back-off pulling image "192.168.10.122/maven:latest" Warning Failed 2m11s (x20 over 7m13s) kubelet, k8s-node1 Error: ImagePullBackOff
出現
Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
說明,k8s-node1 這臺服務器的 /etc/docker/daemon.json 沒有更改
登陸到k8s-node1 這臺服務器,修改文件
vim /etc/docker/daemon.json
內容以下:
{"insecure-registries": ["192.168.10.122"]}
從新加載docker
/etc/init.d/docker reload
登陸到k8s master服務器,刪除pod,從新應用
root@k8s-master:~# cd /root/kube-conf/ root@k8s-master:~/kube-conf# kubectl delete -f ph-rc.yaml service "maven-service" deleted deployment.extensions "maven-deployment" deleted root@k8s-master:~/kube-conf# kubectl apply -f ph-rc.yaml service/maven-service created deployment.extensions/maven-deployment created
再次查看狀態
root@k8s-master:~/kube-conf# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ph-rc-7bd7475544-q9b6j 1/1 Running 0 27s 192.168.36.77 k8s-node1 <none> <none>
發現處於Running狀態了
查看svc暴露的端口
root@k8s-master:~/kube-conf# kubectl get svc|grep maven ph-service NodePort 10.98.152.31 <none> 8080:31002/TCP 4m
能夠發現,暴露的端口是31002
使用谷歌訪問頁面
http://192.168.10.130:31002/
效果以下:
使用k8s-node1 的ip
http://192.168.10.131:31002/
效果同上!
打開本地的項目springbootdemo,修改文件IndexController.java
路徑以下:
springbootdemo\src\main\java\com\example\demo\web\controller
修改下面2行內容,把數字加1
jsonObject.put("welcome2", "2"); jsonObject.put("welcome7", "7");
從新提交到gitlab,而後從新構建一次,點擊Build Now
等待構建成功後,刷新頁面
發現內容已經更新了!
文本參考連接:
https://linux265.com/news/3465.html