一、什么是CICD
CIDI(Continuous Integration,Continuous Delivery & Deployment),持續(xù)集成,持續(xù)部署,持續(xù)發(fā)布。
也就是說,在本地開發(fā)完代碼之后,push到遠(yuǎn)程倉庫,然后代碼打包、部署的這個(gè)過程完全是自動(dòng)化完成的。
但是我們不要進(jìn)入一個(gè)誤區(qū),CICD并不意味著一定就是這一套流程,只要實(shí)現(xiàn)了代碼提交后自動(dòng)部署即可,不管是部署在k8s還是tomcat中,這是由應(yīng)用規(guī)模和使用的工具來決定的。
二、準(zhǔn)備k8s環(huán)境
Kubernetes(k8s)集群搭建,完整無坑,不需要科學(xué)上網(wǎng)~
三、jenkins環(huán)境準(zhǔn)備(選擇一臺(tái)服務(wù)器)
1、安裝java(最新版jenkins只支持jdk11以上)
(1)找到j(luò)dk資源上傳到指定機(jī)器
# 解壓
tar -zxvf jdk-17_linux-x64_bin.tar.gz
(2)配置環(huán)境變量
vi /etc/profile
# 在最后添加上
export JAVA_HOME=/root/jenkins/jdk-17.0.7
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
# 保存后執(zhí)行
source /etc/profile
# 確保安裝完成
java -version
2、安裝maven
(1)找到maven資源上傳到指定機(jī)器
# 解壓
tar -zxvf apache-maven-3.6.2-bin.tar.gz
(2)配置環(huán)境變量
vi /etc/profile
# 在最后添加
export MAVEN_HOME=/root/jenkins/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
# 保存后執(zhí)行
source /etc/profile
# 確保安裝完成
mvn -version
(3)配置maven的阿里云鏡像
apache-maven-3.6.2/conf/settings.xml中,修改鏡像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3、安裝和配置git(使用gitee)
(1)安裝git
# 下載安裝
yum install git
# 配置git
git config --global user.name "cxf"
git config --global user.email "cxf@qq.com"
(2)在服務(wù)器上生成公鑰
# -t key 類型 -C 注釋 中間三次enter即可
ssh-keygen -t ed25519 -C "Gitee SSH Key"
# 查看公鑰 私鑰文件 id_ed25519 公鑰文件 id_ed25519.pub
ls ~/.ssh/
復(fù)制生成后的 ssh key,通過倉庫主頁 「管理」->「部署公鑰管理」->「添加部署公鑰」 ,將生成的公鑰添加到倉庫中。
(3)驗(yàn)證
# 通過 ssh -T 測(cè)試時(shí),輸出 Anonymous:添加成功后,就可以使用 SSH 協(xié)議對(duì)倉庫進(jìn)行拉取。
$ ssh -T git@gitee.com
Hi Anonymous! You've successfully authenticated, but GITEE.COM does not provide shell access.
4、準(zhǔn)備springboot項(xiàng)目
(1)編寫springboot項(xiàng)目
@RestController
public class K8SController {
@RequestMapping("/k8s")
public String k8s(){
return "hello K8s <br/>111222 ";
}
}
(2)將springboot項(xiàng)目提交到gitee
(3)git clone測(cè)試
git clone git@gitee.com:xiangno1/springboot-demo.git
拉下來代碼,說明服務(wù)器配置沒問題。
5、安裝jenkins
jenkins官網(wǎng):https://jenkins.io/
入門指南:https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/
必須在k8s集群中,因?yàn)楹竺嫘枰趈enkins的目錄下創(chuàng)建文件執(zhí)行,比如這里選用m1節(jié)點(diǎn)。
(1)下載jenkinx
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
(2)啟動(dòng)jenkins(需要java環(huán)境)
# 啟動(dòng)報(bào)錯(cuò),需要先安裝字體
# java.lang.NullPointerException: Cannot load from short array because "sun.awt.FontConfiguration.head" is null
yum install fontconfig
fc-cache --force
# 后臺(tái)啟動(dòng)
nohup java -jar jenkins.war --httpPort=8080 &
tail -f nohup.out
# 啟動(dòng)日志會(huì)提示密碼
#4c7341496d044ef7849576ccddc20d11
#This may also be found at: /root/.jenkins/secrets/initialAdminPassword
(3)windows訪問192.168.56.101:8080
jenkins啟動(dòng)時(shí)會(huì)打印一串密碼,需要填上
點(diǎn)擊【安裝推薦的插件】,需要等一段時(shí)間自動(dòng)完成。
下載完插件之后,需要?jiǎng)?chuàng)建第一個(gè) 管理員用戶 我們?cè)O(shè)置為admin/admin。
(4)配置jenkins的get、maven、java
在全局配置,新版的在tools中,配置maven。默認(rèn)是使用系統(tǒng)環(huán)境變量中的。
(5)新建任務(wù)測(cè)試
新建一個(gè)任務(wù)(item),輸入名稱(springboot-demo),選擇流水線
配置springboot-demo的task,修改pipeline內(nèi)容 ,增加maven構(gòu)建,然后“保存和立即構(gòu)建“,同時(shí)可以查看“Console Output”
因?yàn)槲覀冎鞍惭bgit的時(shí)候已經(jīng)配置了公鑰,所以拉取的時(shí)候并不需要用戶密碼了!
node {
def mvnHome
stage('Preparation') {
git 'git@gitee.com:xiangno1/springboot-demo.git'
}
stage('Maven Build') {
sh "mvn clean package"
}
}
編寫完之后保存,然后點(diǎn)擊【立即構(gòu)建】。
在/root/.jenkins/workspace 中,會(huì)下載springboot-demo,并使用maven打成一個(gè)jar包。
(6)設(shè)置push之后自動(dòng)構(gòu)建
當(dāng)用戶進(jìn)行g(shù)it commit/push提交代碼到github時(shí),能夠通知jenkins自動(dòng)構(gòu)建
注意:jenkins的ip一定要是github能夠訪問到的地址
在gitee上配置jenkins的webhook地址:http://192.168.56.101:8080/springboot-demo (需要外網(wǎng)訪問)
生成Personal access tokens
Jenkins訪問github需要授權(quán),所以在github上生成token交給jenkins使用,即Personal access tokens
github的Settings[個(gè)人信息右上角]–>Developer settings–>Personal access tokens–>Generate new token
最后保存好該token,比如:**72f048b514e95d6fe36f86d84374f2dcce402b43
jenkins安裝插件
01 安裝github plugin插件:[系統(tǒng)管理]->[插件管理]->[可選插件]
02 安裝gitlab插件和gitlab hook插件:[系統(tǒng)管理]->[插件管理]->[可選插件]
配置GitHub Server
[系統(tǒng)管理]->[系統(tǒng)配置]->[找到github服務(wù)器]->[添加github服務(wù)器]
在流水線觸發(fā)器勾選GitHub hook trigger for GITScm polling
6、dockerhub準(zhǔn)備(阿里云)
(1)創(chuàng)建一個(gè)springboot-demo 的鏡像倉庫
docker鏡像深入學(xué)習(xí),docker鏡像發(fā)布公有云與私有云
# 登錄 ,需要輸入密碼
docker login --username=沙里溝第二小學(xué)扛把子 registry.cn-hangzhou.aliyuncs.com
# 私有云的話,需要在k8s添加憑證
kubectl create secret docker-registry <secret-name> \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<email> \
--docker-server=<registry>
<secret-name> 是您為 secret 指定的名稱,例如 my-registry-secret。
<username> 是您在鏡像倉庫的用戶名。
<password> 是您在鏡像倉庫的密碼。
<email> 是與您在鏡像倉庫的賬號(hào)相關(guān)聯(lián)的電子郵件。
<registry> 是您的鏡像倉庫地址。
接下來,您需要在使用該憑證的部署(deployment)或其他相關(guān)資源中引用該 secret??梢栽谙嚓P(guān)資源的定義文件中添加以下部分
spec:
template:
spec:
imagePullSecrets:
- name: <secret-name>
(2)準(zhǔn)備shell腳本實(shí)現(xiàn)docker push
# mkdir /root/.jenkins/workspace/scripts/
# vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
# 記得chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
# 腳本開始
# 進(jìn)入到springboot-demo目錄
cd ../springboot-demo
# 編寫Dockerfile文件
cat <<EOF > Dockerfile
FROM openjdk:8-jre-alpine
COPY target/springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
EOF
echo "Dockerfile created successfully!"
# 基于指定目錄下的Dockerfile構(gòu)建鏡像
docker build -t registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0 .
# push鏡像,這邊需要阿里云鏡像倉庫登錄,在w1上登錄
docker push registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0
(3)jenkins的pipeline增加步驟
node {
def mvnHome
stage('Preparation') {
git 'git@gitee.com:xiangno1/springboot-demo.git'
}
stage('Maven Build') {
sh "mvn clean package"
}
stage('Build Image') {
sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
}
}
(4)再次執(zhí)行jenkins的構(gòu)建
構(gòu)建成功!并且上傳阿里云docker鏡像成功!
四、Kubernetes拉取鏡像運(yùn)行
1、準(zhǔn)備springboot-demo.yaml文件
在/root/.jenkins/workspace/scripts/目錄下創(chuàng)建springboot-demo.yaml文章來源:http://www.zghlxwxcb.cn/news/detail-528486.html
# 以Deployment部署Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo
spec:
selector:
matchLabels:
app: springboot-demo
replicas: 1
template:
metadata:
labels:
app: springboot-demo
spec:
imagePullSecrets: # 私有云憑證
- name: springboot-demo
containers:
- name: springboot-demo
image: registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0
ports:
- containerPort: 8080
---
# 創(chuàng)建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: springboot-demo
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: springboot-demo
---
# 創(chuàng)建Ingress,定義訪問規(guī)則
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: springboot-demo
spec:
rules:
- host: springboot.cxf.com
http:
paths:
- path: /
backend:
serviceName: springboot-demo
servicePort: 80
2、準(zhǔn)備shell文件,用于k8s自動(dòng)拉取鏡像部署
編寫k8s-deploy-springboot-demo.sh文件文章來源地址http://www.zghlxwxcb.cn/news/detail-528486.html
# vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
# chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
kubectl delete -f springboot-demo.yaml
kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
echo "k8s deploy success!"
3、修改jenkins的pipeline
node {
def mvnHome
stage('Preparation') {
git 'git@gitee.com:xiangno1/springboot-demo.git'
}
stage('Maven Build') {
sh "mvn clean package"
}
stage('Build Image') {
sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
}
stage('K8S Deploy') {
sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
}
}
4、w1執(zhí)行不了kubectl 命令
切換到master上,cd ~ ---> cat ~/.kube/config --->復(fù)制內(nèi)容
切換到worker02上 cd ~ ---> mkdir ~/.kube vi ~/.kube/config --->粘貼內(nèi)容
5、大功告成 !
到了這里,關(guān)于Kubernetes(k8s)實(shí)戰(zhàn):使用k8s+jenkins實(shí)現(xiàn)CICD的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!