一. 前言

在传统的部署方式中,当需要升级集群中的某个服务时,需要停止该服务相关的Pod,pull最新的docker镜像,然后重新启动。 如果一下把所有Pod都停止,服务在升级的时间内会不可用。因此,Kubernetes提供了滚动升级的功能,一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新,最大好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。

二. 环境准备

1.首先准备4个不同版本的镜像,用于测试(不同版本服务的接口返回对应的版本号)

k8s重启镜像 k8s更新镜像_kubernetes


2. 原始的创建pod的docker-project.yaml文件

apiVersion:  apps/v1  			  #当前格式的版本
kind:  Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                         #当前资源的元数据
  name:  docker-project              #当前资源的名字 是元数据必须的项
spec:
  selector:
    matchLabels:
      app:  web_server                          #是当前Deployment的规格说明
  replicas:  1                      #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                         #定义pod的模板
    metadata:                       #当前pod的元数据
      labels:                       #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server
    spec:                           #当前pod的规格说明
      containers:                   #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: 192.168.214.128:5000/docker-project:v1      #镜像 镜像的名字和版本
         imagePullPolicy: Always 	#拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
         ports:
         - containerPort: 8080
         livenessProbe:  --存活探针:健康检查
           httpGet:
             path: api/heathy
             port: 8080

---

kind: Service
apiVersion: v1
metadata:
  name: docker-project-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 31000
  selector:
    app: web_server

3.使用命令发布服务

kubectl create -f docker-project.yaml

k8s重启镜像 k8s更新镜像_k8s重启镜像_02


4.查看服务

kubectl get services;

k8s重启镜像 k8s更新镜像_kubernetes_03


5.在页面上访问:

k8s重启镜像 k8s更新镜像_Deployment_04

三. 滚动升级的三种方式

方式一. 通过修改配置文件方式

1. 修改配置文件(docker-project:v1修改为docker-project:v2)

apiVersion:  apps/v1  			  #当前格式的版本
kind:  Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                         #当前资源的元数据
  name:  docker-project              #当前资源的名字 是元数据必须的项
spec:
  selector:
    matchLabels:
      app:  web_server                          #是当前Deployment的规格说明
  replicas:  1                      #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                         #定义pod的模板
    metadata:                       #当前pod的元数据
      labels:                       #至少顶一个labels标签,可任意创建一个 key:value
        app:  web_server
    spec:                           #当前pod的规格说明
      containers:                   #容器
      -  name: my-docker-project              #是容器的名字容器名字是必须填写的
         image: 192.168.214.128:5000/docker-project:v2      #镜像 镜像的名字和版本
         imagePullPolicy: Always 	#拉取策略: Always--总是拉取 IfNotPresent--默认值,本地有则使用本地镜像,不拉取 Never--只使用本地镜像,从不拉取
         ports:
         - containerPort: 8080
         livenessProbe:
           httpGet:
             path: api/heathy
             port: 8080

---

kind: Service
apiVersion: v1
metadata:
  name: docker-project-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 31000
  selector:
    app: web_server

2. 命令发布服务

kubectl apply -f docker-project.yaml

3. 页面查看结果

k8s重启镜像 k8s更新镜像_kubernetes_05

方式二: 使用patch命令

1. 查看deployment

k8s重启镜像 k8s更新镜像_Deployment_06

2. 通过patch升级

kubectl patch deployment docker-project --patch '{"spec": {"template": {"spec": {"containers": [{"name": "my-docker-project","image":"192.168.214.128:5000/docker-project:v3"}]}}}}'

k8s重启镜像 k8s更新镜像_k8s重启镜像_07

3. 查看页面

k8s重启镜像 k8s更新镜像_k8s重启镜像_08

方式三: 使用set image命令

1. 通过set image命令升级

kubectl set image deploy docker-project *=192.168.214.128:5000/docker-project:v4

k8s重启镜像 k8s更新镜像_k8s重启镜像_09

2. 查看页面

k8s重启镜像 k8s更新镜像_docker_10


备注:业务量突然增加,我们需要增加副本

kubectl scale deployment/docker-project --replicas=2