一. 在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