YAZONG 我的开源

Kubernetes(八)CICD(8.2/3/4/5)cicd实践(1-4)

  , , ,
0 评论0 浏览

这里完成一个CICI的流程。

从代码提交,到MAVEN编译构建,到打镜像,把镜像推到仓库,利用K8S去部署,最后通过K8S的健康检查,目标:把整个流程通过自动化流程跑起来。

image.png

资源环境


#这里选择的是node-1,此时node-1的内存和磁盘空间充裕。

#硬件资源

[root@node-1 mooc-k8s-demo-docker-8-cicd]# pwd
/root/mooc-k8s-demo-docker-8-cicd
[root@node-1 mooc-k8s-demo-docker-8-cicd]# df -h
/dev/sda2        18G  5.2G   12G  31% /
[root@node-1 mooc-k8s-demo-docker-8-cicd]# free -mh
              total        used        free      shared  buff/cache   available
Mem:           3.4G        995M        1.5G         11M        987M        2.2G
Swap:            0B          0B          0B
#maven安装

[root@node-1 maven]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@node-1 maven]# uname -r
3.10.0-1160.el7.x86_64

[root@node-1 ~]# mkdir -p /data/software/workspace/maven
[root@node-1 ~]# cd /data/software/workspace/maven
[root@node-1 maven]# unzip apache-maven-3.3.9-modify.zip
[root@node-1 maven]# cd apache-maven-3.3.9/bin/
[root@node-1 bin]# chmod +x mvn
[root@node-1 bin]# cd ..
[root@node-1 apache-maven-3.3.9]# pwd
/data/software/workspace/maven/apache-maven-3.3.9
[root@node-1 apache-maven-3.3.9]# ln -s /data/software/workspace/maven/apache-maven-3.3.9 /data/software/install/maven
[root@node-1 apache-maven-3.3.9]# ll /data/software/install/maven
lrwxrwxrwx 1 root root 49 Nov 14 00:45 /data/software/install/maven -> /data/software/workspace/maven/apache-maven-3.3.9
[root@node-1 apache-maven-3.3.9]# cd /data/software/install/
[root@node-1 install]# cd maven/
[root@node-1 install]# mkdir maven_repo
[root@node-1 install]# cd maven
[root@node-1 maven]# ln -s /data/software/install/maven/bin/mvn /usr/bin/mvn
[root@node-1 maven]# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /data/software/install/maven
Java version: 1.8.0_231, vendor: Oracle Corporation
Java home: /data/software/workspace/jdk/jdk1.8.0_231/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
[root@node-1 maven]# pwd
/data/software/install/maven
[root@node-1 maven]# vim conf/settings.xml 
<localRepository>/data/software/install/maven_repo</localRepository>
[root@node-1 ~]# cat /etc/profile
MAVEN_HOME=/data/software/install/maven
PATH=$MAVEN_HOME/bin:$PATH
export MAVEN_HOME
export PATH
#中间件版本

[root@node-1 maven]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

[root@node-1 maven]# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /root/maven/maven
Java version: 1.8.0_231, vendor: Oracle Corporation
Java home: /data/software/workspace/jdk/jdk1.8.0_231/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.49.1.el7.x86_64", arch: "amd64", family: "unix"

[root@node-1 mooc-k8s-demo-docker-8-cicd]# git --version
[root@node-1 mooc-k8s-demo-docker-8-cicd]# git version 1.8.3.1
#上传ssh凭证/公钥到服务器
[root@node-1 mooc-k8s-demo-docker-8-cicd]# git clone https://git.imooc.com/yazong/mooc-k8s-demo-docker.git
[root@node-1 mooc-k8s-demo-docker-8-cicd]# ll mooc-k8s-demo-docker/
#设置只第一次拉取需要输入git的用户名密码,以后就不用输入。
#否则Jenkins拉取报错:
”Authentication failed for 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git”
[root@node-1 web-demo]# git clone https://git.imooc.com/yazong/mooc-k8s-demo-docker.git
[root@node-1 web-demo]# git config --global credential.helper store
[root@node-1 web-demo]# git pull
Username for 'https://git.imooc.com': XX
Password for 'https://imooc@git.imooc.com': 
Already up-to-date.
[root@node-1 web-demo]# git pull
Already up-to-date.
#删除dubbo内容
[root@node-1 mooc-k8s-demo-docker-8-cicd]# cd mooc-k8s-demo-docker/web-demo/
[root@node-1 web-demo]# git push

Jenkins安装

[root@node-1 ~]# mkdir jenkins
[root@node-1 ~]# cd jenkins/
[root@node-1 jenkins]# wget https://github.com/jenkinsci/jenkins/releases/download/jenkins-2.332/jenkins.war
[root@node-1 jenkins]# ll
total 72040
-rw-r--r-- 1 root root 73767731 Jan 25  2022 jenkins.war
[root@node-1 jenkins]# nohup java -jar jenkins.war --httpPort=8080 &
[root@node-1 jenkins]# tailf nohup.out 

XX
#初始化的管理员密码,一定要保管好!
This may also be found at: /root/.jenkins/secrets/initialAdminPassword

#浏览器访问安装Jenkins:"http://10.0.0.21:8080/"

image.png

image.png

image.png

新手入门-自定义Jenkins-安装推荐的插件

也可以在安装完选择自己使用的插件。

初始化时间比较长。

在案例中,主要用到的就是Git、maven、pipeline流水线。

image.png

image.png

image.png

Jenkins重要的概念就是任务和job,所有的工作都是通过job来完成的。

所以要创建CI和CD的流程,首先要创建一个job,这个job就包含了一个应用从拉代码到发布运行起来,这个过程就是一个job。

image.png

构建docker镜像

#创建一个任务

image.png

任务的名字。使用k8s-web-demo,做这个模块的自动化构建和部署。注意这里起名字的规范。

#设置构建策略,这里只保留一个,为节省磁盘空间。

image.png

第一步 : 测试git代码是否能用

image.png

node {
    stage('Preparation') {
        git 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git'
    }
}

image.png

#立即构建成功,核实是否拉取到Jenkins的磁盘工作空间中。
[root@node-1 ~]# ll /root/.jenkins/workspace/k8s-web-demo/
total 36
drwxr-xr-x 2 root root 4096 Nov 14 02:24 configs
drwxr-xr-x 3 root root 4096 Nov 14 02:24 cronjob-demo
drwxr-xr-x 3 root root 4096 Nov 14 02:24 dubbo-demo
drwxr-xr-x 3 root root 4096 Nov 14 02:24 dubbo-demo-api
-rw-r--r-- 1 root root 5201 Nov 14 02:24 pom.xml
-rw-r--r-- 1 root root  247 Nov 14 02:24 README.md
drwxr-xr-x 3 root root 4096 Nov 14 02:24 springboot-web-demo
drwxr-xr-x 4 root root 4096 Nov 14 02:24 web-demo

第二步 :maven构建

image.png

node {
    stage('Preparation') {
        git 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git'
    }
    stage('Maven Build'){
        sh "mvn -pl web-demo -am clean package"
    }
}
#时间可能比较长,会更新本地的仓库。
#构建SUCCESS时,检查maven本地仓库:
[root@node-1 ~]# cd /data/software/install/maven_repo/
[root@node-1 maven_repo]# ll
drwxr-xr-x 3 root root 4096 Nov 14 02:41 com

第三步通过脚本做镜像

#1、登录login仓库
#执行push前,需要在Jenkins部署的机器上执行docker login。否则push会报:"denied:requested access to the resource is denied"。
[root@node-1 ~]# docker login hub.mooc.com
Username: XX
Password: XX
#2、Jenkins的pipeline脚本内容:
#构建镜像位置
[root@node-1 ~]# mkdir ~/build-workspace
#pipeline脚本内容
node {
    env.BUILD_DIR = "/root/build-workspace/"
    env.MODULE = "web-demo"
    stage('Preparation') {
        git 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git'
    }
    stage('Maven Build'){
        sh "mvn -pl web-demo -am clean package"
    }
    stage('Build Image'){
        sh "/root/scripts/build-image-web.sh"
    }
}
#3、在项目目录中修改构建docker镜像所需的Dockerfile

[root@node-1 ~]# mkdir mooc-k8s-demo-docker-8-cicd
[root@node-1 ~]# cd mooc-k8s-demo-docker-8-cicd
[root@node-1 mooc-k8s-demo-docker-8-cicd]# cat mooc-k8s-demo-docker/web-demo/Dockerfile 
FROM hub.mooc.com/kubernetes/tomcat:8.0.51-alpine
#ROOT下为项目编译好的代码
COPY ROOT /usr/local/tomcat/webapps/ROOT
#dockerfiles目录为构建Dockerfile依赖的所有文件的目录。start.sh为tomcat启动脚本。
COPY dockerfiles/start.sh /usr/local/tomcat/bin/start.sh
ENTRYPOINT ["sh" , "/usr/local/tomcat/bin/start.sh"]
#4、在项目目录中修改tomcat运行项目的启动脚本start.sh 

[root@node-1 mooc-k8s-demo-docker-8-cicd]# cat mooc-k8s-demo-docker/web-demo/dockerfiles/start.sh 
#!/bin/bash
sh /usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/logs/catalina.out
#5、构建镜像脚本build-image-web.sh
#Jenkins的pipeline运行这个脚本build-image-web.sh的目的是构建一个镜像出来
#执行脚本位置
[root@node-1 ~]# mkdir -p /root/scripts
[root@node-1 scripts]# cd /root/scripts
[root@node-1 scripts]# chmod +x build-image-web.sh
[root@node-1 scripts]# cat build-image-web.sh 
#!/bin/sh

#构建镜像出来,需要一些文件,需要Dockerfile,需要准备一个地方BUILD_DIR去放这些文件。
#得有一个要有一个脚本去运行的基本的base目录(工作目录)BUILD_DIR,这个目录下可以用模块名或Jenkins的job名字做区分。
#BUILD_DIR来源于Jenkins的pipeline脚本:env.BUILD_DIR
if [ "${BUILD_DIR}" == "" ];then
        echo "env 'BUILD_DIR' is not set "
        exit 1
fi

#docker构建的工作目录=基础目录+JOB_NAME(Jenkins自带的环境变量,这里项目指的是k8s-web-demo)
DOCKER_DIR=${BUILD_DIR}/${JOB_NAME}

if [ ! -d ${DOCKER_DIR} ];then
        mkdir -p ${DOCKER_DIR}
fi

echo "docker workspace : ${DOCKER_DIR}"

#把构建镜像的文件组织好来构建镜像。需要从Jenkins构建的结果中取。
#WORKSPACE为Jenkins当前的job的工作空间(代码在这里)
#MODULE模块名在pipeline脚本:env.MODULE
JENKINS_DIR=${WORKSPACE}/${MODULE}

echo "jenkins workspace : ${JENKINS_DIR}"

if [ ! -f ${JENKINS_DIR}/target/*.war ];then
        echo "target war file not found  ${JENKINS_DIR}/target/*.war "
        exit 1
fi

cd ${DOCKER_DIR}
rm -rf *
#解压到当前工作目录的ROOT目录下
unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT
#Dockerfile是所需依赖的文件
mv ${JENKINS_DIR}/Dockerfile .
if [ -d ${JENKINS_DIR}/dockerfiles ];then
		#把Dockerfile需要依赖的所有文件都挪过来
        mv ${JENKINS_DIR}/dockerfiles .
fi

#镜像版本变量,这个还是提出来比较好。
VERSION=$(date +%Y%m%d%H%M%S)

#执行push前先在harbor把原有相同的镜像删除。前缀最好也提出来变量。
IMAGE_NAME=hub.mooc.com/kubernetes/${JOB_NAME}:${VERSION}

echo "building image : ${IMAGE_NAME}"
#最后的"."当前目录要写,否则构建时会报镜像不存在。
docker build -t ${IMAGE_NAME} .
#执行push前,需要在Jenkins部署的机器上执行docker login。否则会报:"denied:requested access to the resource is denied"。
docker push ${IMAGE_NAME}

第四步:构建

image.png

node {
    env.BUILD_DIR = "/root/build-workspace/"
    env.MODULE = "web-demo"
    stage('Preparation') {
        git 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git'
    }
    stage('Maven Build'){
        sh "mvn -pl web-demo -am clean package"
    }
    stage('Build Image'){
        sh "/root/scripts/build-image-web.sh"
    }
}

image.png

调用K8S发布

第一步:通过脚本构建镜像

[root@node-1 scripts]# cat build-image-web.sh 
#!/bin/sh

#构建镜像出来,需要一些文件,需要Dockerfile,需要准备一个地方BUILD_DIR去放这些文件。
#得有一个要有一个脚本去运行的基本的base目录(工作目录)BUILD_DIR,这个目录下可以用模块名或Jenkins的job名字做区分。
#BUILD_DIR来源于Jenkins的pipeline脚本:env.BUILD_DIR
if [ "${BUILD_DIR}" == "" ];then
        echo "env 'BUILD_DIR' is not set "
        exit 1
fi

#docker构建的工作目录=基础目录+JOB_NAME(Jenkins自带的环境变量,这里项目指的是k8s-web-demo)
DOCKER_DIR=${BUILD_DIR}/${JOB_NAME}

if [ ! -d ${DOCKER_DIR} ];then
        mkdir -p ${DOCKER_DIR}
fi

echo "docker workspace : ${DOCKER_DIR}"

#把构建镜像的文件组织好来构建镜像。需要从Jenkins构建的结果中取。
#WORKSPACE为Jenkins当前的job的工作空间(代码在这里)
#MODULE模块名在pipeline脚本:env.MODULE
JENKINS_DIR=${WORKSPACE}/${MODULE}

echo "jenkins workspace : ${JENKINS_DIR}"

if [ ! -f ${JENKINS_DIR}/target/*.war ];then
        echo "target war file not found  ${JENKINS_DIR}/target/*.war "
        exit 1
fi

cd ${DOCKER_DIR}
rm -rf *
#解压到当前工作目录的ROOT目录下
unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT
#Dockerfile是所需依赖的文件
mv ${JENKINS_DIR}/Dockerfile .
if [ -d ${JENKINS_DIR}/dockerfiles ];then
		#把Dockerfile需要依赖的所有文件都挪过来
        mv ${JENKINS_DIR}/dockerfiles .
fi

#镜像版本变量,这个还是提出来比较好。
VERSION=$(date +%Y%m%d%H%M%S)

#执行push前先在harbor把原有相同的镜像删除。前缀最好也提出来变量。
IMAGE_NAME=hub.mooc.com/kubernetes/${JOB_NAME}:${VERSION}

#只有这行是在”构建docker镜像”章节之中新加的!
#把镜像文件名写到本地文件中,通过本地文件的方式进行通讯。在deploy.sh脚本中取出来。
echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE

echo "building image : ${IMAGE_NAME}"
#最后的"."当前目录要写,否则构建时会报镜像不存在。
docker build -t ${IMAGE_NAME} .
#执行push前,需要在Jenkins部署的机器上执行docker login。否则会报:"denied:requested access to the resource is denied"。
docker push ${IMAGE_NAME}

第二步:配置K8S调度模板

用什么方式来更新服务呢?这个服务使用命令行,kubectl apply/create的配置文件创建,更新的时候也可以通过配置文件来更新呢?

如果这个应用都是tomcat的,都是一样的服务发现,没有什么不一样的,就可以使用这种方式来更新,需要一个配置文件更新的模板,把每个应用不同的地方抽取出来作为一个变量,把这些变量填进去,每次更新之前都先填进去,就可以实现自动化的生成配置文件,更新上去。这里来制作配置文件。

#创建配置文件存放的模板目录
[root@node-1 scripts]# mkdir template
[root@node-1 scripts]# cd template 

[root@node-1 scripts]# cat template/web.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  #服务名字作为变量提取出来
  name: {{name}}
spec:
  selector:
    matchLabels:
      app: {{name}}
  replicas: 1
  template:
    metadata:
      labels:
        app: {{name}}
    spec:
	  #指定部署节点
      nodeName: node-2
      containers:
      - name: {{name}}
	    #镜像名字作为变量提取出来
        image: {{image}} 
        ports:
		#每个应用的端口都是8080,可以不变。
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: {{name}}
spec:
  ports:
  #service的端口80,可以不变。
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: {{name}}
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{name}}
spec:
  rules:
  #ingress的域名是一个变量
  - host: {{host}}
    http:
      paths:
      - path: /
        backend:
          serviceName: {{name}}
          servicePort: 80

第三步: 配置K8S调度脚本

[root@node-1 scripts]# touch deploy.sh  
[root@node-1 scripts]# chmod +x deploy.sh
#第一步:要把替换的配置文件的变量都找出来,找到所有对应的值,替换到配置文件中去。
[root@node-1 scripts]# cat deploy.sh 
#!/bin/sh

#web-demo,使用Jenkins内置的环境变量JOB_NAME
name=${JOB_NAME}
#镜像,上次构建出来的并没有告诉别人,暂时并拿不到
#把镜像的名字从本地文件里取出来。对应脚本build-image-web.sh。
image=$(cat ${WORKSPACE}/IMAGE)
host=${HOST}

echo "deploying ... name : ${name} , image : ${image} , host : ${host}"

#当前目录/root/scripts存在先删除
rm -f web.yaml

#模板的原始文件不能动,这里拷贝过来。
#模板的原始文件跟现在的脚本是同一个目录,可以直接通过`dirname "${BASH_SOURCE[0]}"`取到当前脚本所在的目录。
cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml .

echo "copy success"

#把前面的变量替换成后面的值
sed -i "s#{{name}}#${name}#g" web.yaml
sed -i "s#{{image}}#${image}#g" web.yaml
sed -i "s#{{host}}#${host}#g" web.yaml

echo "ready to apply"

kubectl apply -f web.yaml

echo "apply ok"

#打印到Jenkins的输出中来检查生成的web.yaml脚本是否正确
cat web.yaml

#到这里流程脚本上跑通了。这里只保证了apply成功了,但并不能保证新的服务可以正常对外提供服务(健康检查还没做)。

#健康检查health check过程
#是否成功失败标记
success=0
#循环的次数。每2s做一次健康检查,最多检查60次,最多就超时了。
count=60
#在变成数组的时候,加IFS=”,”加变成数组的分割值。
IFS=","
#比如这里加个5S,保证已经执行了apply,这个deploy的数据已经发生变化了才开始检查,这是一种方式。
sleep 5
#当count>0的时候做这些健康检查的事情
while [ ${count} -gt 0 ]
do
		#用这些命令的返回值,比如1,1,1,1
        replicas=$(kubectl get deploy ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}')
        echo "replicas : ${replicas}"
        #变成数组
		arr=(${replicas})
		#比较互相相等
        if [ "${arr[0]}" == "${arr[1]}" -a "${arr[1]}" == "${arr[2]}" -a "${arr[2]}" == "${arr[3]}"  ];then
                echo "health check success!"
                success=1
                break
        fi
        ((count--))
		#每2s做一次健康检查,最多检查60次,最多就超时了。
        sleep 2
done

if [ ${success} -ne 1 ];then
        echo "health check failed!"
        exit 1
fi

第四步:构建

image.png

node {
    env.BUILD_DIR = "/root/build-workspace/"
    env.MODULE = "web-demo"
    stage('Preparation') {
        git 'https://git.imooc.com/yazong/mooc-k8s-demo-docker.git'
    }
    stage('Maven Build'){
        sh "mvn -pl web-demo -am clean package"
    }
    stage('Build Image'){
        sh "/root/scripts/build-image-web.sh"
    }
    stage('Deploy'){
        sh "/root/scripts/deploy.sh"
    }
}

第五步:访问测试

image.png

#编辑win10的 C:\Windows\System32\drivers\etc\hosts 文件加入。执行ipconfig /flushdns。
10.0.0.22   k8s-web.mooc.com
#三个节点也加入
[root@node-1/2/3 nginx]# cat /etc/hosts
10.0.0.22   k8s-web.mooc.com

#访问测试:”https://k8s-web.mooc.com/hello?name=testnameval2”

image.png

六步:验证镜像

[root@node-1 configs]# docker images

image.png

[root@node-1 configs]# kubectl get all -o wide

image.png

[root@node-2 ~]# crictl ps

image.png

[root@node-1 scripts]# kubectl get deploy k8s-web-demo -o yaml

image.png

image.png

image.png

健康检查的方法

第一种:status状态

image.png

1、1四个replicas属性。

判断一个应用是否是正常的状态,几个实例数,指定的replicas相关属性,这里都是1,还有就是updetiesreplicas,还有一个readyreplicas,还有一个availablereplicas,当这些所有属性(可能拼错了,以下面的截图为准)的数据值都是一致的时候,才可以认为这些应用当前是一个健康正常的状态,那么就要拿到这些应用的这些状态值。

[root@node-1 scripts]# kubectl get deploy k8s-web-demo -o yaml

image.png

这些属性的值都在status中,可以通过kubernetes的go-template取出来,拿到各种replicas的值,来逐一的做判断。

[root@node-1 scripts]# kubectl get deploy k8s-web-demo -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}'

1,1,1,1

需要一个循环,需要不断的去检查,更新是有一个时间的。比如半分钟或1分钟。健康检查通过的时候,才会真正的去把这些属性更新成相同的值。

在”[root@node-1 scripts]# cat deploy.sh ”这个脚本里,

在这个脚本里,这个健康检查是在apply之后立即去执行的,当apply指令刚刚传给APISERVER的时候,去取deploy的信息,这个时候取出来有可能是还没有apply之前的信息,直接取到这些值就走了,也就是说这个部署还没开始,就认为它已经结束了,并且已经通过健康检查了,这样是有一些问题的。

1、2继续在”[root@node-1 scripts]# cat deploy.sh ”这个脚本里。

比如可以设置循环的次数。每2s做一次健康检查,最多检查60次,最多就超时了。

count=60
while [ ${count} -gt 0 ]
do
......
((count--))
        sleep 2
done

1、3继续在”[root@node-1 scripts]# cat deploy.sh ”这个脚本里。

再比如这里加个5S,保证已经执行了apply,这个deploy的数据已经发生变化了才开始检查,这是一种方式。

sleep 5

第二种:版本信息

2、1除此之外更靠谱的方式,除了status以外,版本信息,这个版本每进行一次更新的时候,每次+1,那么可以通过go-template的方式取到这个值,在开始之前取到,在部署之后,再取一次这个值,前后做一次对比,就可以确保这个服务是已经更新过了,在这个值发生变化之后,再进行健康检查,是万无一失的方法。

可以通过这个方法做一个更靠谱的健康检查。

[root@node-1 scripts]# kubectl get deploy k8s-web-demo -o yaml

image.png

[root@node-1 configs]# kubectl get deploy k8s-web-demo -o go-template='{{index .metadata.annotations "deployment.kubernetes.io/revision"}}'
2

#再次构建

image.png

[root@node-1 configs]# kubectl get deploy k8s-web-demo -o go-template='{{index .metadata.annotations "deployment.kubernetes.io/reviion"}}'
3

停止服务(可选)

#为节省资源,这里暂时停掉Jenkins和k8s-web-demo应用。

#检查服务运行情况

image.png

image.png

image.png

#先找到Jenkins最后一次构建的服务的输出结果页面

image.png

image.png

#对比镜像ID值如果一样的话,那么复制这两张图中的蓝色内容到web.yaml中


[root@node-1 build-workspace]# pwd
/root/build-workspace
[root@node-1 build-workspace]# cat web.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-web-demo
spec:
  selector:
    matchLabels:
      app: k8s-web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: k8s-web-demo
    spec:
      nodeName: node-2
      containers:
      - name: k8s-web-demo
        image: hub.mooc.com/kubernetes/k8s-web-demo:20221114064526 
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: k8s-web-demo
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: k8s-web-demo
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: k8s-web-demo
spec:
  rules:
  - host: 
    http:
      paths:
      - path: /
        backend:
          serviceName: k8s-web-demo
          servicePort: 80
#删除K8S构建的web.yaml
[root@node-1 build-workspace]# kubectl delete -f web.yaml 
deployment.apps "k8s-web-demo" deleted
service "k8s-web-demo" deleted
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions "k8s-web-demo" deleted
#再次检查服务运行情况
[root@node-1 ~]# kubectl get all
[root@node-2 ~]# crictl ps
#删除镜像
[root@node-1 ~]# docker rmi hub.mooc.com/kubernetes/k8s-web-demo:20221114064526

image.png

#停止Jenkins
[root@node-1 ~]# ps -ef|grep jenkins
root       2991   2109  0 00:56 pts/1    00:02:58 java -jar jenkins.war --httpPort=8080
root      20690   5837  0 07:30 pts/4    00:00:00 grep --color=auto jenkins
[root@node-1 ~]# kill 2991

标题:Kubernetes(八)CICD(8.2/3/4/5)cicd实践(1-4)
作者:yazong
地址:https://blog.llyweb.com/articles/2022/11/14/1668380672786.html