如何使用Kubernetes部署执行滚动更新?分步指南

2021年11月20日02:47:41 发表评论 764 次浏览

Kubernetes部署执行滚动更新教程介绍

滚动更新是现代应用程序生命周期的重要组成部分,用户不断期待新功能和零停机时间。虽然 Kubernetes 过去使用复制控制器来启用此功能,但较新的版本建议使用部署。 

Kubernetes如何部署执行滚动更新本教程向你展示如何使用 Kubernetes 部署执行滚动更新。此方法可让你快速更新应用程序并实现零停机时间,同时确保支持回滚。 

先决条件

  • 一个 Kubernetes 集群
  • 访问终端窗口
  • 该kubectl 命令行工具

启用滚动更新

如何使用Kubernetes部署执行滚动更新?Kubernetes 部署充当 ReplicaSet 的包装器,ReplicaSet 是负责 pod 管理的 Kubernetes 控制器。部署为 ReplicaSet 提供了额外的功能——它们执行健康检查、滚动更新和回滚。 

1. 首先,使用文本编辑器创建一个带有部署规范的yaml文件,例如Nano:

nano nginx-test.yaml

下面的示例文件包含 Kubernetes 部署所需的基本声明:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:

    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2

        ports:
        - containerPort: 80

2. 保存并退出文件。

3. 然后,使用你刚刚创建的kubectl create命令和yaml文件创建部署:

kubectl create -f nginx-test.yaml
如何使用Kubernetes部署执行滚动更新?分步指南

4. 检查部署:

kubectl get deployment

输出应确认部署已准备就绪:

如何使用Kubernetes部署执行滚动更新?分步指南

4. 接下来,通过运行以下命令检查 ReplicaSets:

kubectl get rs

示例文件指定了四个副本,它们都显示为就绪:

如何使用Kubernetes部署执行滚动更新?分步指南

5. 最后,检查 Pod 是否已启动:

kubectl get pod

输出显示 Pod 已准备就绪并正在运行:

如何使用Kubernetes部署执行滚动更新?分步指南

确保零停机时间

如何使用Kubernetes部署执行滚动更新?要配置零停机滚动更新,你需要指定更新策略。

1.在部署yaml文件的speccategory下添加如下声明:

minReadySeconds: 5
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 1
  • minReadySeconds告诉 Kubernetes 在创建下一个 Pod 之前应该等待多长时间。此属性可确保所有应用程序 Pod 在更新期间都处于就绪状态。
  • maxSurge指定超过指定副本数的最大 Pod 数(或百分比)。在上面的示例中,由于yaml文件中指定了4 个副本,因此 pod 的最大数量将为5
  • maxUnavailable声明更新期间不可用 Pod 的最大数量(或百分比)。如果maxSurge设置为0,则该字段不能为0

将上述规范添加到部署yaml文件中就足以开始执行 Kubernetes 滚动更新。但是,它并不能保证零停机时间。Kubernetes 无法判断新 Pod 何时准备就绪 - 一旦创建新 Pod,它就会消除旧 Pod。此问题会导致停机,直到新 pod 能够接受请求。

为了解决这个问题,Kubernetes 引入了Readiness Probes的概念。探测器会检查 Pod 的状态,并且仅当 Pod 中的所有容器都准备就绪时才允许进行滚动更新。当就绪探测成功且经过 中指定的时间后,Pod 被视为就绪minReadySeconds

2. 要设置就绪探针,请将以下几行添加到spec.template.spec部署文件的类别中:

readinessProbe:
  httpGet:
    path: /
    port: 8080
    initialDelaySeconds: 5
    periodSeconds: 5
    successThreshold: 1
  • initialDelaySeconds 指定探测器在容器启动后必须等待多长时间才能启动。
  • periodSeconds是两次探测之间的时间。默认值为10秒,最小值为1秒。
  • successThreshold是在一次失败后连续成功探测的最小数量,整个过程被认为是成功的。默认值和最小值都是1

为滚动更新正确配置的整个部署文件应如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:

    matchLabels:
      app: nginx
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.0

        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /
            port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
            successThreshold: 1
        

3. 保存文件并退出。

4. 然后,使用kubectl apply应用更改:

kubectl apply -f nginx-text.yaml --record

--record标志将在回滚过程中发挥作用。

如何使用Kubernetes部署执行滚动更新?分步指南

输出显示部署已成功配置。

执行滚动更新

如何使用Kubernetes部署执行滚动更新?共有三种执行滚动更新的方法。

例如,要更改应用程序图像:

选项 1:你可以使用kubectl set在命令行上执行操作:

kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
如何使用Kubernetes部署执行滚动更新?分步指南

选项 2:或者,spec.templates.spec.containersyaml文件部分修改镜像版本。然后,使用kubectl replace来执行更新:

kubectl replace -f nginx-test.yaml
如何使用Kubernetes部署执行滚动更新?分步指南

选项 3:你也可以使用kubectl edit直接编辑部署:

kubectl edit deployment nginx-deployment --record

在打开的编辑器中进行必要的更改:

如何使用Kubernetes部署执行滚动更新?分步指南

关闭编辑器时会应用更改。

检查推出状态

Kubernetes如何部署执行滚动更新?使用以下语法检查部署的推出状态:

kubectl rollout status deployment nginx-deployment

输出确认成功部署:

如何使用Kubernetes部署执行滚动更新?分步指南

Kubernetes部署执行滚动更新教程?暂停和恢复滚动更新

使用相应的kubectl rollout命令暂停和恢复滚动更新。

要暂停更新,请运行:

kubectl rollout pause deployment nginx-deployment
如何使用Kubernetes部署执行滚动更新?分步指南

要恢复更新,请运行:

kubectl rollout resume deployment nginx-deployment
如何使用Kubernetes部署执行滚动更新?分步指南

安排 Pod 进行部署

使用关联性和反关联性属性来控制 Kubernetes 在你的部署中安排特定 pod 的节点。

Pod Affinity

Kubernetes 目前有两种类型的Affinity

  • requiredDuringSchedulingIgnoredDuringExecution 告诉 Kubernetes 仅在满足特定条件(例如特定处理器类型)的节点上运行 pod。
  • preferredDuringSchedulingIgnoredDuringExecution 当且仅当没有节点满足给定条件时,允许 pod 在其他地方运行。

这些属性列在PodSpec文件中。例如,一个 pod 可以指定如下:

apiVersion: v1
kind: Pod
metadata:
  name: affinity-test
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/test-name
            operator: In
            values:
            - test1
            - test2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: example-node-label-key
            operator: In
            values:
            - example-node-label-value
  containers:
  - name: affinity-test
    image: k8s.gcr.io/pause:2.0

上面的文件告诉 Kubernetes 仅在具有标签的节点上运行 pod,该节点的键为kubernetes.io/test-name,其值为test1test2。此外,Kubernetes 会优先选择键为example-node-label-keyexample-node-label-value值为 的节点。

Pod Anti-Affinity

如何使用Kubernetes部署执行滚动更新?如果你不希望所有 Pod 都在同一个节点上运行,则Pod Anti-Affinity很有用。它的功能类似于亲缘关系,具有相同的两种类型 -requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution.

以下示例指定了一个反关联性规则,该规则告诉 Kubernetes 最好避免将“测试”应用程序 Pod 调度到已经拥有“测试”Pod 的节点:

podAntiAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - weight: 100
    podAffinityTerm:
      labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: 
          - test
      topologyKey: Kubernetes.io/hostname

回滚更改

Kubernetes如何部署执行滚动更新?如果更新过程出现问题,你可以回滚更改并恢复到应用程序的先前版本。为此,请使用以下kubectl rollout命令:

kubectl rollout history deployment nginx-deployment

输出列出了通过--record在执行更新时添加标志创建的可用修订:

如何使用Kubernetes部署执行滚动更新?分步指南

选择所需的修订并键入以下命令以回滚更改:

kubectl rollout undo deployment nginx-deployment --to-revision=1

上面的命令回滚到修订版 1 并产生以下输出:

如何使用Kubernetes部署执行滚动更新?分步指南

Kubernetes部署执行滚动更新教程结论

如何使用Kubernetes部署执行滚动更新?阅读本教程后,你应该能够使用 Kubernetes 部署执行零停机滚动更新。 

如果你希望扩展有关 Kubernetes 中部署类型的知识,请阅读如何在 Kubernetes 上进行 Canary 部署。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: