Deployment的创建、滚动更新、回滚版本、扩容缩容

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Deployment的创建、滚动更新、回滚版本、扩容缩容

一、资源调度

1.1 Labels and Selectors 标签和选择算符

Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label的特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

一些常用的Label 示例如下:

  • 版本标签:“version”:“release”, “version”:“stable”…
  • 环境标签:“environment”:“dev”,“environment”:“test”,“environment”:“pro”
  • 架构标签:“tier”:“frontend”,“tier”:“backend”

标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:

Label用于给某个资源对象定义标识

Label Selector用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector:

  • 基于等式的Label Selector

name = slave: 选择所有包含Label中key="name"且value="slave"的对象

env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象

  • 基于集合的Label Selector

name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象

name not in (frontend): 选择所有包含Label中的key=“name"且value不等于"frontend"的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号”,"进行分隔即可。

例如:

name=slave,env!=production

name not in (frontend),env!=production

1.命令方式
# 为pod资源打标签
[root@master ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled

# 为pod资源更新标签
[root@master ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled

# 查看标签
[root@master ~]# kubectl get pod nginx-pod  -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0

# 筛选标签
[root@master ~]# kubectl get pod -n dev -l version=2.0  --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0
[root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.

#删除标签
[root@master ~]# kubectl label pod nginx-pod -n dev tier-
pod/nginx unlabeled

# 匹配单个值,查找 app=hello 的 pod
kubectl get po -A -l app=hello

# 匹配多个值
kubectl get po -A -l 'k8s-app in (metrics-server, kubernetes-dashboard)'

# 查找 version!=1 and app=nginx 的 pod 信息
kubectl get po -l version!=1,app=nginx

# 不等值 + 语句
kubectl get po -A -l version!=1,'app in (busybox, nginx)'
2.配置方式

配置文件:

在各类资源的 metadata.labels 中进行配置

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0"  #修改lebels中的 version为3.0
    env: "test"
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml

3.作用举例
  1. 组织和分类资源

通过为资源对象添加标签,可以轻松地组织和分类它们,使集群管理更清晰。
对于一组 Pod,可以使用标签来表示它们属于哪个应用、环境或部门。

# Pod定义
metadata:
  labels:
    app: frontend
    environment: production

  1. 选择器用于筛选资源
    选择器用于根据标签条件选择特定的资源对象,实现有目的的资源关联和操作。
    在 Service 中使用选择器,确保只有具有特定标签的 Pod 接收到流量。
# Service定义
spec:
  selector:
    matchLabels:
      app: frontend
  1. 滚动升级和版本管理
    作用: 标签可以用于标识不同版本或阶段的应用程序,有助于管理滚动升级和多版本共存。
    举例: 在 Deployment 中使用标签标识不同版本的应用程序。
# Deployment定义
spec:
  template:
    metadata:
      labels:
        app: myapp
        version: v2
  1. 灵活性和自定义
    作用: 标签的灵活性允许用户根据需求自定义标签,适应不同的业务场景和需求。
    举例: 用户可以根据自己的需要为 Pod 添加自定义的标签,比如标识 Pod 的角色。
# Pod定义
metadata:
  labels:
    role: database
  1. 通信和关联
    作用: 标签可用于建立资源对象之间的关联,特别是在 Service 中,确保与具有特定标签的 Pod 之间建立通信。
    举例: 在 Service 中使用选择器,将流量路由到具有特定标签的 Pod。
# Service定义
spec:
  selector:
    matchLabels:
      app: backend

1.2Pod控制器介绍

Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
  • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
  • StatefulSet:管理有状态应用

1.3Deployment(Deploy) 无状态服务

为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。

Deployment主要功能有下面几个:

  • 支持ReplicaSet的所有功能
  • 支持发布的停止、继续
  • 支持滚动升级和回滚版本
#创建名为 nginx-deploy 的Deployment,并使用Nginx 1.7.9的镜像:
[root@k8s-master deployments]# kubectl create deploy nginx-deploy --image=nginx:1.7.9
deployment.apps/nginx-deploy created
#获取所有Deployments
[root@k8s-master deployments]# kubectl get deployments
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           16s
#获取所有Deployments
[root@k8s-master deployments]# kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           27s
#获取所有ReplicaSets
[root@k8s-master deployments]# kubectl get replicaset
NAME                      DESIRED   CURRENT   READY   AGE
nginx-deploy-78d8bf4fd7   1         1         1       61s
#与这个Deployment关联的ReplicaSet是 nginx-deploy-78d8bf4fd7
#nginx-deploy-78d8bf4fd7: 由 nginx-deploy Deployment创建的ReplicaSet,
#同样负责维护运行Nginx容器的Pod的期望数量。
#每个ReplicaSet都有一个唯一的标识符(在这里是 78d8bf4fd7)。

#kubectl get po
[root@k8s-master deployments]# kubectl get po
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-78d8bf4fd7-xxzv4   1/1     Running   0          80s
#nginx-deploy-78d8bf4fd7-xxzv4: 是由 nginx-deploy-78d8bf4fd7 ReplicaSet创建的Pod的实例。
#每个Pod都有一个唯一的标识符(在这里是 xxzv4)。

#如果需要删除 nginx-deploy 的Deployment:
kubectl delete deployment nginx-deploy

#查看 pod 以及展示标签,可以看到是关联的那个 rs
[root@k8s-master deployments]# kubectl get po,rs,deploy --show-labels
NAME                                READY   STATUS    RESTARTS   AGE    LABELS
pod/nginx-deploy-78d8bf4fd7-xxzv4   1/1     Running   0          44m    app=nginx-deploy,pod-template-hash=78d8bf4fd7

NAME                                      DESIRED   CURRENT   READY   AGE    LABELS
replicaset.apps/nginx-deploy-78d8bf4fd7   1         1         1       44m    app=nginx-deploy,pod-template-hash=78d8bf4fd7
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE    LABELS
deployment.apps/nginx-deploy   1/1     1            1           44m    app=nginx-deploy

ReplicaSet(RS):

  • DESIRED: 表示期望的副本数,这里是 1。
  • CURRENT: 表示当前运行的副本数,这里是 1。
  • READY: 表示就绪的副本数,这里是 1。
  • LABELS: 表示ReplicaSet的标签,这里有两个标签 app=nginx-deploy 和 pod-template-hash=78d8bf4fd7。

Deployment(DEPLOY):

  • READY: 表示就绪的副本数/期望的副本数,这里是 1/1。
  • UP-TO-DATE: 表示Deployment中已部署的最新副本数,这里是 1。
  • AVAILABLE: 表示Deployment中可用的副本数,这里是 1。
  • LABELS: 表示Deployment的标签,这里有一个标签 app=nginx-deploy。

这些资源共同协作,通过Deployment和ReplicaSet确保所需数量的Pod在运行。当进行扩展、滚

动更新或者需要重新启动Pod时,Deployment和ReplicaSet会协同工作以维护系统的期望状态。Pod是最小的可部署单元,它们托管应用程序的实际实例


#获取名为 nginx-deploy 的 Deployment 的详细配置信息,以 YAML 格式输出 Deployment 的配置.

[root@k8s-master deployments]# kubectl get deploy nginx-deploy -o yaml


#以下是可能的输出示例,展示了 nginx-deploy Deployment 的详细配置信息:
4apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2024-01-08T07:30:29Z"
  generation: 1
#以下是可能的输出示例,展示了 nginx-deploy Deployment 的详细配置信息:
4apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2024-01-08T07:30:29Z"
  generation: 1
1.3.1创建deployment与配置文件解析
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型       
metadata: # 元数据
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签
    controller: rs
spec: # 详情描述
  replicas: 3 # 副本数量
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:      # Labels匹配规则
      app: nginx-pod
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [nginx-pod]}
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

[root@k8s-master deployments]# vi nginx-deploy.yaml
apiVersion: apps/v1 # 版本号
kind: Deployment #资源类型为Deployment 
metadata: #原信息
  labels: #标签
    app: nginx-deploy # 具体的ky:value配置行驶
  name: nginx-deploy #deployment的名字
  namespace: default #所在命名空间
spec:
  replicas: 1 # 期望副本数
  revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数
  selector: # 选择器,用于找到匹配的RS
    matchLabels: #按照标签匹配
      app: nginx-deploy # 匹配的标签key /value
  strategy: # 更新策略
    rollingUpdate: #滚动更新配置
      maxSurge: 25%  # 进行滚动更新时,更新的个体数最多可以超过期望副本数的个数/比例
      maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示所在副本数中,最多可以有多少个不更新成功
    type: RollingUpdate # 更新类型,采用滚动更新
  template: #采用pod模版
    metadata:  #pod 的元信息
      labels:   #pod的标签
        app: nginx-deploy
    spec: #pod 期望信息
      containers:  #pod 的容器
      - image: nginx:1.7.9 #镜像
        imagePullPolicy: IfNotPresent #拉取策略
        name: nginx #容器名称
      restartPolicy: Always #重启策略
      terminationGracePeriodSeconds: 30 #删除操作最多宽限多长时间
 
1.3.2 滚动更新

一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。

滚动更新是一种在Kubernetes中更新应用程序的策略,其中旧版本的Pod逐渐被新版本的Pod替代,以确保在整个更新过程中服务的可用性。这种更新策略有助于减小系统的冲击,保持应用程序的连续可用性,同时允许新版本逐步生效。

滚动更新的关键特点和优势:
  1. 逐步替代: 滚动更新通过逐步替代旧版本的Pod来进行,而不是立即替换所有Pod。这有助于减小系统在更新期间的波动,降低潜在的服务中断。
  2. 健康检查: 在替代旧Pod之前,Kubernetes会进行健康检查,确保新Pod已经启动并且处于健康状态。如果新Pod无法成功启动或者健康检查失败,滚动更新将会暂停并回滚到之前的版本。
  3. 自动回滚: 如果在滚动更新期间出现问题,Kubernetes能够自动回滚到之前的版本,确保系统的稳定性。
  4. 版本控制: 通过使用不同的版本号,您可以在Deployment中指定要部署的镜像版本,从而简化更新过程。
  5. 可配置性: 您可以通过调整滚动更新的配置参数,如更新的间隔、最大不可用Pod的数量等,来满足特定应用程序的需求。
#编辑deployments
[root@k8s-master deployments]# kubectl edit deploy nginx-deploy
deployment.apps/nginx-deploy edited
  labels:
    app: nginx-deploy
    test: '123'
[root@k8s-master deployments]# kubectl get deploy --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE    LABELS
nginx-deploy   1/1     1            1           68m    app=nginx-deploy,test=123


[root@k8s-master deployments]#kubectl describe deploy nginx-deploy
Events:          <none>

没有更新过程意味着没有进行滚动更新

先增加副本数 (只有副本数多个才能滚动更新)
#编辑rs的副本数量,修改replicas: 3即可
[root@k8s-master deployments]# kubectl edit deploy nginx-deploy
deployment.apps/nginx-deploy edited

# 查看deployment
# UP-TO-DATE 最新版本的pod的数量
# AVAILABLE  当前可用的pod的数量
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     3            3           78m   app=nginx-deploy,test=123

#查看rs
#发现一个rs管理3个pod
[root@k8s-master deployments]# kubectl get rs --show-labels
NAME                      DESIRED   CURRENT   READY   AGE    LABELS
nginx-deploy-78d8bf4fd7   3         3         3       80m    app=nginx-deploy,pod-template-hash=78d8bf4fd7
# 查看pod
[root@k8s-master deployments]#  kubectl get po --show-labels
NAME                            READY   STATUS    RESTARTS   AGE     LABELS
nginx-deploy-78d8bf4fd7-m2d8g   1/1     Running   0          3m29s   app=nginx-deploy,pod-template-hash=78d8bf4fd7
nginx-deploy-78d8bf4fd7-qr9dd   1/1     Running   0          3m29s   app=nginx-deploy,pod-template-hash=78d8bf4fd7
nginx-deploy-78d8bf4fd7-xxzv4   1/1     Running   0          80m     app=nginx-deploy,pod-template-hash=78d8bf4fd7
滚动更新
# 编辑rs的nginx版本   - image: nginx:1.9.1
[root@k8s-master deployments]# kubectl edit deploy nginx-deploy
# 查看deployment
# UP-TO-DATE 最新版本的pod的数量
# AVAILABLE  当前可用的pod的数量
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     1            3           90m   app=nginx-deploy,test=123
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     1            3           90m   app=nginx-deploy,test=123
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     1            3           90m   app=nginx-deploy,test=123
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     2            3           90m   app=nginx-deploy,test=123
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     3            3           90m   app=nginx-deploy,test=123
[root@k8s-master deployments]# kubectl get deploy nginx-deploy  --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     3            3           90m   app=nginx-deploy,test=123
#多打印几次发现最新版本的pod的数量 前几次是1后面变为2 再到3表示全部更新完成 
#READY数量一直是3没有变化

#通过更新Deployment的镜像版本,Kubernetes将自动启动滚动更新
[root@k8s-master deployments]# kubectl set image deployment/nginx-deploy nginx=nginx:1.7.9
deployment.apps/nginx-deploy image updated

#查看滚动更新的状态
[root@k8s-master deployments]#  kubectl desribe deploy  nginx-deploy
#打印了执行Kubernetes 部署(Deployment)的滚动更新 的过程
#以下显示了在更新过程中进行的缩放活动
# Scaled up replica set nginx-deploy-754898b577 to 1 运行一个新的rs
#Scaled down replica set nginx-deploy-78d8bf4fd7 to 2 将旧的rs 改为 2 就是减掉一个了 
#Scaled up replica set nginx-deploy-754898b577 to 2 新的rs更细成两个 
#Scaled down replica set nginx-deploy-78d8bf4fd7 to 1 将旧的rs 改为1个 
#Scaled up replica set nginx-deploy-754898b577 to 3 最后把 新的更新成3个
#Scaled down replica set nginx-deploy-78d8bf4fd7 to 0 最后把旧的变为0个


Events:
  Type    Reason             Age                  From                   Message
  ----    ------             ----                 ----                   -------
  Normal  ScalingReplicaSet  19m                  deployment-controller  Scaled up replica set nginx-deploy-78d8bf4fd7 to 3
  Normal  ScalingReplicaSet  7m56s                deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 1
  Normal  ScalingReplicaSet  6m44s                deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 2
  Normal  ScalingReplicaSet  6m44s                deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 2
  Normal  ScalingReplicaSet  6m43s                deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 1
  Normal  ScalingReplicaSet  6m43s                deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 3
  Normal  ScalingReplicaSet  6m42s                deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 0
  Normal  ScalingReplicaSet  106s (x2 over 97m)   deployment-controller  Scaled up replica set nginx-deploy-78d8bf4fd7 to 1
  Normal  ScalingReplicaSet  104s                 deployment-controller  Scaled down replica set nginx-deploy-754898b577 to 2
  Normal  ScalingReplicaSet  104s                 deployment-controller  Scaled up replica set nginx-deploy-78d8bf4fd7 to 2
  Normal  ScalingReplicaSet  102s (x3 over 103s)  deployment-controller  (combined from similar events): Scaled down replica set nginx-deploy-754898b57

逐步替代: 滚动更新通过逐步替代旧版本的Pod来进行,而不是立即替换所有Pod。这有助于减小系统在更新期间的波动,降低潜在的服务中断。

多个滚动更新并行

假设当前有 5 个 nginx:1.7.9 版本,你想将版本更新为 1.9.1,当更新成功第三个以后,你马上又将期望更新的版本改为 1.9.2,那么此时会立马删除之前的三个,并且立马开启更新 1.9.2 的任务

更新失败
# 1、镜像更新到1.161
[root@k8s-master deployments]#  kubectl set image deployment/nginx-deploy nginx=nginx:1.161
deployment.apps/nginx-deploy image updated
# 2、更新失败(镜像拉取失败)
[root@k8s-master deployments]# kubectl  get  pod
NAME                            READY   STATUS              RESTARTS   AGE
nginx-deploy-754898b577-7zhq4   1/1     Running             0          15h
nginx-deploy-754898b577-bcqsh   1/1     Running             0          15h
nginx-deploy-754898b577-f2r45   1/1     Running             0          15h
nginx-deploy-7fcf48c86f-xp6rk   0/1     ContainerCreating   0          6s

说明: Deployment 控制器自动停止有问题的上线过程,并停止对新的 ReplicaSet 扩容。 这行为取决于所指定的 rollingUpdate参数具体为 maxUnavailable默认情况下,Kubernetes 将此值设置为 25%。

# 3、查看Deployment详细信息:
[root@k8s-master deployments]# kubectl describe deployment nginx-deploy

# 4、检查 Deployment 修订历史
[root@k8s-master deployments]# kubectl  rollout    history  deployment  nginx-deploy

deployment支持两种更新策略:重建更新和滚动更新,可以通过strategy指定策略类型,支持两个属性:

1.重建更新.

编辑nginx-deploy,在spec节点下添加更新策略

spec:
  strategy: # 指定新的Pod替换旧的Pod的策略, 支持两个属性:
    type: Recreate # 重建更新 在创建出新的Pod之前会先杀掉所有已存在的Pod

2.滚动更新

编辑nginx-deploy,在spec节点下添加更新策略

spec:
  strategy: # 指定新的Pod替换旧的Pod的策略, 支持两个属性:
    type: RollingUpdate # 滚动更新策略 滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
    rollingUpdate:  #当type为RollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性:
      maxSurge: 25%  #用来指定在升级过程中不可用Pod的最大数量,默认为25%。
      maxUnavailable: 25% #用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。

1.3.3 回滚版本

deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看.

kubectl rollout: 版本升级相关功能,支持下面的选项:

  • status 显示当前升级状态
  • history 显示 升级历史记录
  • pause 暂停版本升级过程
  • resume 继续已经暂停的版本升级过程
  • restart 重启版本升级过程
  • undo 回滚到上一级版本(可以使用–to-revision回滚到指定版本)
# 查看当前升级版本的状态
[root@k8s-master deployments]#  kubectl rollout status deploy nginx-deploy
deployment "nginx-deploy" successfully rolled out

# 查看升级历史记录
[root@k8s-master deployments]# kubectl rollout history deploy nginx-deploy
deployment.apps/nginx-deploy 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
# 可以发现有三次版本记录,说明完成过两次升级

# 版本回滚
# 这里直接使用--to-revision=1回滚到了1版本, 如果省略这个选项,就是回退到上个版本,就是2版本
[root@k8s-master deployments]#  kubectl rollout undo deployment nginx-deploy  --to-revision=2
deployment.apps/nginx-deploy rolled back


# 查看发现,通过nginx镜像版本可以发现到了第一版 nginx:1.9.1
[root@k8s-master deployments]#  kubectl get deploy -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES        SELECTOR
nginx-deploy   3/3     3            3           146m   nginx        nginx:1.9.1   app=nginx-deploy


# 查看rs,发现第一个rs中有3个pod运行
# 其实deployment之所以可是实现版本的回滚,就是通过记录下历史rs来实现的,
# 一旦想回滚到哪个版本,只需要将当前版本pod数量降为0,然后将回滚版本的pod提升为目标数量就可以了
[root@k8s-master deployments]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
nginx-deploy-754898b577   3         3         3       57m
nginx-deploy-78d8bf4fd7   0         0         0       147m

#查看pod 都运行起来了
[root@k8s-master deployments]# kubectl  get  pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-754898b577-7zhq4   1/1     Running   0          15h
nginx-deploy-754898b577-bcqsh   1/1     Running   0          15h
nginx-deploy-754898b577-f2r45   1/1     Running   0          15h

# 回滚到之前的修订版本
kubectl  rollout  undo  deployment  nginx-deploy
1.3.3 扩容缩容
# 扩容5个副本
[root@k8s-master deployments]# kubectl scale deploy nginx-deploy --replicas=5  
deployment.apps/nginx-deploy scaled
# 查看deployment 已经扩容为5
[root@k8s-master deployments]#  kubectl get deploy nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   5/5     5            5           18h

# 查看pod
[root@k8s-master deployments]#  kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-754898b577-7zhq4   1/1     Running   0          15h
nginx-deploy-754898b577-94zvp   1/1     Running   0          62s
nginx-deploy-754898b577-bcqsh   1/1     Running   0          15h
nginx-deploy-754898b577-f2r45   1/1     Running   0          15h
nginx-deploy-754898b577-nbhds   1/1     Running   0          62s

#缩容3个副本
[root@k8s-master deployments]# kubectl  scale  deployment  --replicas=3  nginx-deploy
deployment.apps/nginx-deploy scaled

#或者修改配置文件
# 编辑deployment的副本数量,修改spec:replicas: 3即可
[root@k8s-master01 ~]# kubectl edit deploy nginx-deploy 
deployment.apps/nginx-deploy edited

# 查看deployment
[root@k8s-master deployments]#  kubectl get deploy nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           18h
# 查看pod
[root@k8s-master deployments]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-754898b577-7zhq4   1/1     Running   0          15h
nginx-deploy-754898b577-bcqsh   1/1     Running   0          15h
nginx-deploy-754898b577-f2r45   1/1     Running   0          15h


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
消息中间件 Kubernetes NoSQL
有状态软件如何在 k8s 上快速扩容甚至自动扩容
有状态软件如何在 k8s 上快速扩容甚至自动扩容
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
|
3月前
|
Kubernetes 监控 Perl
在K8S中,如何具体实现Pod被删除后,还能被自动拉起功能?
在K8S中,如何具体实现Pod被删除后,还能被自动拉起功能?
|
6月前
|
运维 Kubernetes API
Kubernets中的滚动更新
【5月更文挑战第31天】在 Kubernetes 中,`kubectl scale` 命令常用于Deployment和StatefulSet的应用伸缩。除了伸缩,应用更新和版本回退也是常见运维任务。
|
11月前
|
应用服务中间件 数据安全/隐私保护
请教一个问题,阿里云的edas每次发版,都会有几个版本的deployment的版本存在,怎么设置自动只保留5个版本的啊?
请教一个问题,阿里云的edas每次发版,都会有几个版本的deployment的版本存在,怎么设置自动只保留5个版本的啊?
71 2
|
11月前
|
Kubernetes Perl 容器
OpenKruise中的CloneSet主要用于Pod的自动扩缩容和滚动更新
OpenKruise中的CloneSet主要用于Pod的自动扩缩容和滚动更新
77 1
|
11月前
|
Kubernetes 应用服务中间件 nginx
k8s教程(pod篇)-升级与回滚
k8s教程(pod篇)-升级与回滚
304 1
|
6月前
|
Kubernetes 测试技术 微服务
k8s学习-Deployment(模板、更新、扩缩容、回滚等)
k8s学习-Deployment(模板、更新、扩缩容、回滚等)
156 0
|
6月前
|
存储 Kubernetes 监控
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
139 0
|
Kubernetes 监控 API
【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新(上)
【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新
150 0