6. k8s + jenkins 實現持續集成(完)


一.  在node節點上安裝軟件. 具體軟件內容如下

1. 下載jdk

下載tar包,上傳到node https://pan.baidu.com/s/18IicPYf7W0j-sHBXvfKyyg

配置環境變量

export JAVA_HOME=/home/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH

 
2. 下載tomcat,  到node的/home目錄下
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
3. 下載jenkins 到/home
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

將jenkins的war放到tomcat的webaap目錄下
mv
jenkins.war /home/tomcat9/webapps

啟動tomcat
 
        
4. 下載git,  直接在node執行命令
apt-get install get
5. 下載maven,  到/home目錄
wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

解壓, mv maven... maven3

配置環境變量

export M2_HOME=/home/maven3
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin



修改maven倉庫, maven3/conf/settings.xml
  <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>*</mirrorOf>
  </mirror>

 

二. jenkins配置

1. 在瀏覽器輸入http://192.168.1.104:8080/jenkins/

然后, 在服務器找到初始密碼, 填入

2. 選擇手動安裝插件

 

 

 

3. 選擇安裝的插件

ssh/publish over ssh
git/git parameter
maven Integration plugin

手動添加maven插件

管理-->插件管理-->搜索maven Integration

 

 4. jenkins全局工具配置中, 配置jdk/git/maven

 進入系統配置-->全局工具配置

 

 配置jdk和git

 

 

 

 

 三. jenkins + k8s發布實例

三個目標:

  • Registry安裝配置和使用
  • jenkins項目創建和配置
  • jenkins項目構建

 1. docker的Registry的安裝和配置

在node節點上, 獲取registry鏡像

docker pull registry

啟動容器

docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d registry

 這里將registry掛載到了本地目錄, 避免docker重啟后, 鏡像丟失

2. registry的使用

修改master機器上的registry容器為所在的宿主機

/etc/docker/daemon.json
{
  "insecure-registries":["192.168.1.104:5000"], //修改為registry所在容器的宿主機 "registry-mirrors": ["https://w52p8twk.mirror.aliyuncs.com"]
}

我的registry在node節點上, node的ip是192.168.1.104

重啟docker

systemctl daemon-reload
systemctl restart docker

 

下載一個nginx並上傳到Registry倉庫 

領取nginx鏡像
docker pull nginx
改名
docker tag nginx 192.168.1.104:5000/nginx:test

嘗試把 192.168.1.104:5000/nginx:test上傳到我們的Registry倉庫

docker push 192.168.1.104:5000/nginx:test

 可以成功push, 說明我們的倉庫是創建成功了.

 下面在node上做同樣的操作. 修改/etc/docker/daemon.json文件

{
  "insecure-registries":["192.168.1.104:5000"],
  "registry-mirrors": ["https://w52p8twk.mirror.aliyuncs.com"]
}

重啟docker

systemctl daemon-reload
systemctl restart docker

 

 3. 在Jenkins上構建項目

構建的整體流程: 1. 設置參數化構建 2. 設置代碼庫的地址 3. 設置maven的構建命令, 執行后會打包出一個jar包, 將jar打包成一個動態鏡像, 並推到鏡像倉庫中 4. 將應用部署的yaml文件拷貝到k8s的master節點上, 然后執行命令, 讓k8s根據yaml文件啟動應用

 

  • 創建一個maven項目 

 

 

 

 

 

  • 勾選丟棄舊的構建,  保持構建的天數為2天, 最大構建個數為2個

 

 

 

  •  勾選參數化構建, 選擇git參數, 名稱填寫branch , 參數類型是分支或標簽

目的是: 可以根據分支進行構建.或者標簽進行構建

https://github.com/solochen84/SpringBootDemo

 

  • 下面開始構建項目

項目地址: https://github.com/solochen84/SpringBootDemo

git項目地址: https://github.com/solochen84/SpringBootDemo.git

 

 

 這個項目是public的, 所以, 不需要配置Credentials

  • 添加maven構建

 

 

 

  • 設置構建后, 將jar包打包成docker鏡像, 並推送到Registry

設置構建完之后執行的動作

 

 

 

  

 腳本內容

#!/bin/sh

jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
jarFolder=ph
projectName=ph

docker_path=${WORKSPACE}
cp ${WORKSPACE}/target/${jarName} ${docker_path}
sh /root/docker_dir/deploy_docker.sh ${projectName} ${docker_path} ${jarName}
創建deploy_docker文件. 目錄: /root/docker_dir/deploy_docker.sh. 文件內容如下

設置文件的可執行權限
chmod 775 deploy_docker.sh

 

deploy_docker.sh文件內容

#!/bin/sh
# maven01 $workspace $jarname
# ${projectName} ${docker_path} ${jarName}

set -e
projectName=$1
docker_path=$2
appName=$3

#user_name=
#password=

tag=$(date +%s)
server_path=192.168.1.104:5000
target_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${target_image}

cd ${docker_path}

docker build --build-arg app=${appName} -t ${target_image} .

docker tag ${target_image} ${server_path}/${projectName}
echo The name of image is "${server_path}\/${target_image}"
  • 設置jenkins服務器到k8s master ssh免密登錄

設置了免密登錄, jenkins就可以到k8s上運行腳本, 執行命令

    • 在jenkins所在服務器上執行
生成秘鑰
ssh-keygen -t rsa 

拷貝公鑰
ssh-copy-id -i  ~/.ssh/id_rsa.pub root@192.168.1.106
    • 測試免密登錄

ssh root@192.168.1.106

 

  • 設置構建后操作, 將yaml文件拷貝到k8s master 上並運行應用 

yaml文件的位置, 是在項目里面的.  

 

 

  

set -e
echo ok
echo ${WORKSPACE}
docker_path=${WORKSPACE}
scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml'
ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'

這里的ip地址填master的ip地址

  • Jenkins項目構建

 

構建的過程中, 會出現各種各樣的問題

1. no matches for kind "Deployment" in version "extensions/v1beta1"

 

 

 參考文章: https://www.cnblogs.com/nnylee/p/11779653.html

 

修改對應的shell腳本

 

 

 

set -e
echo ok
echo ${WORKSPACE}
docker_path=${WORKSPACE}
scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
ssh 192.168.1.106 'sed -i "s|extensions/v1beta1|apps/v1|" /root/kube.yaml' ssh 192.168.1.106 'sed -i "s|192.168.0.108|192.168.1.104|" /root/kube.yaml'
ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml --validate=false' 
ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'

2. spec.template.metadata.labels: Invalid value: map[string]string{"app":"maven"}: `selector` does not match template `labels`.

  Build step 'Execute shell' marked build as failure

參考的是這篇文章: https://www.cnblogs.com/robinunix/p/11155860.html

 

 

 我修改后的配置

 

apiVersion: v1
kind: Service
metadata:
  name: maven-service
spec:
  type: NodePort
  ports:
  - name: maven
    port: 8080
    nodePort: 31002
    targetPort: 8080
    protocol: TCP
  selector:
    app: maven
---
apiVersion: apps/v1
kind: Deployment
metadata:
  #name: maven-deployment name: maven
spec:
  selector: matchLabels: app: maven
  replicas: 1
  template:
    metadata:
      labels:
        app: maven
    spec:
      containers:
        - name: maven
          image: 192.168.1.104:5000/maven:latest
          ports:
          - containerPort: 8080
          env:
            - name: key
              value: "value"

然后重新啟動, 成功!

kubectl get deployments --all-namespaces

 

發現,name為maven的deployment的Ready狀態是0個

查看pod

kubectl get pod --all-namespaces

 

 發現有一個pending狀態

查看pod的日志

 kubectl describe pod maven-7589958577-5ms68 -n default


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM