Jenkins+harbor+gitlab+k8s 部署maven項目

1、概述

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

 

2、gitlab建立maven項目

 首先從github上面,找一個基於maven的項目,地址以下:

https://github.com/solochen84/SpringBootDemo

使用git客戶端,下載此項目代碼

 

建立項目

登陸gitlab,建立一個項目springbootdemo

 

 

點擊 設置--> 成員

 

 

添加2個成員,一個是jenkins用戶,用來拉取代碼的。一個是我,用來提交代碼的。

注意:個人帳號,權限要高一些,能夠直接提交到master分支。

 

 

將github下載的代碼,提交到剛剛建立的項目中。效果以下:

 

 

3、harbor 建立用戶和項目

建立jenkins用戶

登陸到harbor後臺,點擊建立用戶

 

 

注意,每一項都填寫一項。尤爲是密碼,必須符合密碼複雜性要求。

 

建立項目

點擊新建項目

 

 

輸入名字,java。這就是私有項目。

 

 點擊java

 

 

點擊成員-->用戶

 

 

輸入jenkins,會有提示的。角色選擇 開發人員

 

4、jenkins修改默認用戶

使用jenkins執行shell命令時,可能會出現權限不足的狀況。

查看jenkins默認用戶

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_USERJENKINS_GROUP變量的值是jenkins

 

修改默認用戶爲root

將下面2個變量,修改成root

JENKINS_USER=root
JENKINS_GROUP=root

 

重啓jenkins服務

service jenkins restart

 

5、jenkins和k8s master作ssh免密

爲何要和k8s master作ssh免密呢?由於jenkins須要登陸到k8s master,作一些pod操做。

生成祕鑰

登陸到jenkins服務器,生成祕鑰

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

 

copy祕鑰

ssh-copy-id 192.168.10.130

 

測試root免密

ssh 192.168.10.130

若是沒有提示輸入密碼,說明成功了!

 

6、jenkins登陸harbor

修改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 文件修改不正確

 

7、jenkins建立maven項目

新建任務

登陸到jenkins後臺,點擊 新建Item

輸入名稱,選擇構建一個maven項目。注意:任務名稱最好是項目名,由於下面的deploy_docker.sh腳本,會調用這個變量。

 

 

 

 

設置參數化構建

丟棄舊的構建,保留2天

 

 

設置源代碼

輸入倉庫下載地址,選擇用戶root

 

 

設置maven構建命令

輸入命令:clean package

 

mvn clean package依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個階段。

package命令完成了項目編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠程maven私服倉庫

 

jar包打包成docker鏡像並推送

執行shell命令

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腳本。下面說到!

 

效果以下:

 

 

 

定義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

 

yaml文件拷貝到k8s master上並運用應用

k8s master 操做

登陸到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操做

登陸到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圖標,表示應用開始啓動構建了。

 

最後出現錯誤

 

爲啥呢? 查看springbootdemoDockerfile文件,查看第一行

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 

 

最後提示執行完成

 

 

查看harbor倉庫

會發現多了一個鏡像,這個鏡像,就是剛剛構建時,提交的。

 

8、訪問k8s 應用

查看Pod狀態

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

 

從新加載pod

登陸到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/

效果同上!

 

9、更新應用代碼

打開本地的項目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

http://www.javashuo.com/article/p-apvunerx-mk.html

https://juejin.im/post/5c07b1126fb9a049e82b4cfe

相關文章
相關標籤/搜索