1、CICD

CICD(Continuous Integration,Continuous Delivery & Deployment),持续集成,持续部署,持续发布。 也就是说,在本地开发完代码之后,push到远程仓库,然后代码打包、部署的这个过程完全是自动化完成的。

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图1

但是不要进入一个误区,CICD并不意味着一定就是这一套流程,只要实现了代码提交后自动部署即可,不管是部署在k8s还是Tomcat中,这是由应用规模和使用的工具来决定的。

2、准备k8s环境

3、Jenkins环境准备(选择一台服务器)

1、安装Java(最新版Jenkins只支持jdk11以上)

1)找到jdk资源上传到指定机器

  1. # 解压
  2. tar -zxvf jdk-17_linux-x64_bin.tar.gz

2)配置环境变量

  1. vi /etc/profile
  2. # 在最后添加上
  3. export JAVA_HOME=/root/jenkins/jdk-17.0.7
  4. export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
  5. export PATH=$PATH:${JAVA_HOME}/bin
  6. # 保存后执行
  7. source /etc/profile
  8. # 确保安装完成
  9. java -version

2、安装Maven

1)找到Maven资源上传到指定机器

  1. # 解压
  2. tar -zxvf apache-maven-3.6.2-bin.tar.gz

2)配置环境变量

  1. vi /etc/profile
  2. # 在最后添加
  3. export MAVEN_HOME=/root/jenkins/apache-maven-3.6.2
  4. export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
  5. # 保存后执行
  6. source /etc/profile
  7. # 确保安装完成
  8. mvn -version

3)配置Maven的阿里云镜像

apache-maven-3.6.2/conf/settings.xml中,修改镜像
  1. <mirror>
  2. <id>alimaven</id>
  3. <name>aliyun maven</name>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>

3、安装和配置git(远程仓库使用gitee)

1)安装git

  1. # 下载安装
  2. yum install git
  3. # 配置git
  4. git config --global user.name "cxf"
  5. git config --global user.email "cxf@qq.com"

2)在服务器上生成公钥

  1. # -t key 类型 -C 注释 中间三次enter即可
  2. ssh-keygen -t ed25519 -C "Gitee SSH Key"
  3. # 查看公钥 私钥文件 id_ed25519 公钥文件 id_ed25519.pub
  4. ls ~/.ssh/
复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」,将生成的公钥添加到仓库中。

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图2

3)验证

  1. # 通过 ssh -T 测试时,输出 Anonymous:添加成功后,就可以使用 SSH 协议对仓库进行拉取。
  2. $ ssh -T git@gitee.com
  3. Hi Anonymous! You've successfully authenticated, but GITEE.COM does not provide shell access.

4、准备SpringBoot项目

1)编写SpringBoot项目

  1. @RestController
  2. public class K8SController {
  3. @RequestMapping("/k8s")
  4. public String k8s(){
  5. return "hello K8s <br/>111222 ";
  6. }
  7. }

2)将SpringBoot项目提交到gitee

3)git clone测试

  1. git clone git@gitee.com:xiangno1/springboot-demo.git
拉下来代码,说明服务器配置没问题。

5、安装Jenkins

Jenkins官网:https://jenkins.io/

入门指南:https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/

必须在k8s集群中,因为后面需要在Jenkins的目录下创建文件执行,比如这里选用m1节点。

1)下载Jenkins

  1. wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

2)启动Jenkins(需要Java环境)

  1. # 启动报错,需要先安装字体
  2. # java.lang.NullPointerException: Cannot load from short array because "sun.awt.FontConfiguration.head" is null
  3. yum install fontconfig
  4. fc-cache --force
  5. # 后台启动
  6. nohup java -jar jenkins.war --httpPort=8080 &
  7. tail -f nohup.out
  8. # 启动日志会提示密码
  9. #4c7341496d044ef7849576ccddc20d11
  10. #This may also be found at: /root/.jenkins/secrets/initialAdminPassword

3)Windows访问192.168.56.101:8080

Jenkins启动时会打印一串密码,需要填上 点击【安装推荐的插件】,需要等一段时间自动完成。 下载完插件之后,需要创建第一个 管理员用户 设置为admin/admin。

4)配置Jenkins的Git、Maven、Java

在全局配置,新版的在tools中,配置Maven。默认是使用系统环境变量中的。

5)新建任务测试

新建一个任务(item),输入名称(springboot-demo),选择流水线

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图3

配置springboot-demo的task,修改pipeline内容 ,增加Maven构建,然后“保存和立即构建“,同时可以查看“Console Output” 因为之前安装git的时候已经配置了公钥,所以拉取的时候并不需要用户密码了!
  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'git@gitee.com:xiangno1/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. }
编写完之后保存,然后点击【立即构建】。 /root/.jenkins/workspace 中,会下载springboot-demo,并使用Maven打成一个jar包。

6)设置push之后自动构建

当用户进行git commit/push提交代码到Gitee时,能够通知Jenkins自动构建

:::danger 注意:Jenkins的ip一定要是Gitee能够访问到的地址

:::

在Gitee上配置Jenkins的webhook地址:http://192.168.56.101:8080/springboot-demo

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图4

生成Personal access tokens

Jenkins访问Gitee需要授权,所以在Gitee上生成token交给Jenkins使用,即Personal access tokens Gitee的Settings[个人信息右上角]–>Developer settings–>Personal access tokens–>Generate new token 最后保存好该token,比如:72f048b514e95d6fe36f86d84374f2dcce402b43

Jenkins安装插件

  • 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]
  • 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]

配置GitHub Server

[系统管理]->[系统配置]->[找到github服务器]->[添加github服务器] 在流水线触发器勾选GitHub hook trigger for GITScm polling

6、DockerHub准备(阿里云)

1)创建一个springboot-demo 的镜像仓库

  1. # 登录 ,需要输入密码
  2. docker login --username=沙里沟第二小学扛把子 registry.cn-hangzhou.aliyuncs.com
  3. # 私有云的话,需要在k8s添加凭证
  4. kubectl create secret docker-registry <secret-name> \
  5. --docker-username=<username> \
  6. --docker-password=<password> \
  7. --docker-email=<email> \
  8. --docker-server=<registry>
  9. <secret-name> 是您为 secret 指定的名称,例如 my-registry-secret
  10. <username> 是您在镜像仓库的用户名。
  11. <password> 是您在镜像仓库的密码。
  12. <email> 是与您在镜像仓库的账号相关联的电子邮件。
  13. <registry> 是您的镜像仓库地址。
  14. 接下来,您需要在使用该凭证的部署(deployment)或其他相关资源中引用该 secret。可以在相关资源的定义文件中添加以下部分
  15. spec:
  16. template:
  17. spec:
  18. imagePullSecrets:
  19. - name: <secret-name>

2)准备shell脚本实现docker push

  1. # mkdir /root/.jenkins/workspace/scripts/
  2. # vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
  3. # 记得chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
  4. # 脚本开始
  5. # 进入到springboot-demo目录
  6. cd ../springboot-demo
  7. # 编写Dockerfile文件
  8. cat <<EOF > Dockerfile
  9. FROM openjdk:8-jre-alpine
  10. COPY target/springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
  11. ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
  12. EOF
  13. echo "Dockerfile created successfully!"
  14. # 基于指定目录下的Dockerfile构建镜像
  15. docker build -t registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0 .
  16. # push镜像,这边需要阿里云镜像仓库登录,在w1上登录
  17. docker push registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0

3)Jenkins的pipeline增加步骤

  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'git@gitee.com:xiangno1/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. stage('Build Image') {
  10. sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
  11. }
  12. }

4)再次执行Jenkins的构建

构建成功!并且上传阿里云Docker镜像仓库成功!

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图5

Kubernetes 实战:使用 k8s+jenkins 实现 CICD - 图6

4、Kubernetes拉取镜像运行

1、准备springboot-demo.yaml文件

/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml
  1. # 以Deployment部署Pod
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: springboot-demo
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: springboot-demo
  10. replicas: 1
  11. template:
  12. metadata:
  13. labels:
  14. app: springboot-demo
  15. spec:
  16. imagePullSecrets: # 私有云凭证
  17. - name: springboot-demo
  18. containers:
  19. - name: springboot-demo
  20. image: registry.cn-hangzhou.aliyuncs.com/cxf01/springboot-demo:v1.0
  21. ports:
  22. - containerPort: 8080
  23. ---
  24. # 创建Pod的Service
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28. name: springboot-demo
  29. spec:
  30. ports:
  31. - port: 80
  32. protocol: TCP
  33. targetPort: 8080
  34. selector:
  35. app: springboot-demo
  36. ---
  37. # 创建Ingress,定义访问规则
  38. apiVersion: extensions/v1beta1
  39. kind: Ingress
  40. metadata:
  41. name: springboot-demo
  42. spec:
  43. rules:
  44. - host: springboot.cxf.com
  45. http:
  46. paths:
  47. - path: /
  48. backend:
  49. serviceName: springboot-demo
  50. servicePort: 80

2、准备shell文件,用于k8s自动拉取镜像部署

编写k8s-deploy-springboot-demo.sh文件
  1. # vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
  2. # chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
  3. kubectl delete -f springboot-demo.yaml
  4. kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
  5. echo "k8s deploy success!"

3、修改Jenkins的pipeline

  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'git@gitee.com:xiangno1/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. stage('Build Image') {
  10. sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
  11. }
  12. stage('K8S Deploy') {
  13. sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
  14. }
  15. }

4、w1执行不了kubectl 命令

  1. 切换到master上,cd ~ ---> cat ~/.kube/config --->复制内容
  2. 切换到worker02 cd ~ ---> mkdir ~/.kube vi ~/.kube/config --->粘贴内容