Kubernetes 中的滚动升级 Deployment 实现方案

在开发中,软件的迭代升级是很常见的需求。而在 Kubernetes 中,滚动升级 Deployment 是一种通过部署新版本的 Pod 并逐步替换旧版本的方式来实现应用程序的无中断升级的方法。

Deployment 的基本概念

在 Kubernetes 中,Deployment 是一个控制器(Controller),用于管理 Pod 的部署和升级。Deployment 中定义了应用程序的期望状态,然后 Kubernetes 根据这个状态来保证应用程序的运行。

Deployment 包含以下几个重要的属性:

  • apiVersion:Deployment 对象所使用的 Kubernetes API 版本;
  • kind:Deployment 的类型,即 Deployment;
  • metadata:Deployment 的元数据,包含 Deployment 的名称、命名空间等信息;
  • spec:Deployment 对象创建时的配置信息,包括 Pod 模板、升级策略等属性;
  • status:Deployment 对象的状态信息,包括当前部署的 Pod 信息、升级状态等。

滚动升级 Deployment 的基本步骤

下面我们将详细介绍 Kubernetes 中如何通过滚动升级 Deployment 来实现应用程序的升级。

1. 创建 Deployment

首先,我们需要创建一个 Deployment 对象,定义新版本应用程序的 Pod 模板、升级策略等属性。

例如,我们创建一个应用程序的 Deployment,使用 nginx 镜像,并将应用程序暴露在 80 端口:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.16
        ports:
        - containerPort: 80

2. 升级 Deployment

接下来,我们需要升级 Deployment。首先,我们可以使用 kubectl edit 命令修改 Deployment,更新 Pod 模板中的镜像版本:

$ kubectl edit deployment my-nginx

spec.template.spec.containers.image 的值修改为新版本镜像的名称。然后保存修改并退出编辑器。

修改 Deployment 后,Kubernetes 会自动创建新版本的 Pod,并开始逐步替换旧版本的 Pod。

3. 监控升级状态

升级过程中,我们可以使用 kubectl rollout status 命令来监控升级状态:

$ kubectl rollout status deployment/my-nginx

当输出结果为 deployment "my-nginx" successfully rolled out 时,表示升级已经完成。

4. 回滚升级

如果升级过程中出现问题,可以使用 kubectl rollout undo 命令回滚升级,恢复到上一个版本:

$ kubectl rollout undo deployment/my-nginx

滚动升级 Deployment 的高级选项

除了基本步骤外,Kubernetes 还提供了一些高级选项来控制滚动升级 Deployment 的行为。

1. 升级策略

Deployment 的 spec.strategy.type 属性可以控制升级策略,默认为 RollingUpdate

除了 RollingUpdate 策略外,还可以设置其他策略,例如 Recreate 策略,在升级时会先删除所有旧版本的 Pod,然后再创建新版本的 Pod。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.17
        ports:
        - containerPort: 80

2. 升级的最大并发数和失败阈值

Deployment 的 spec.strategy.rollingUpdate.maxSurge 属性控制升级期间可以创建的最大多余 Pod 数量,spec.strategy.rollingUpdate.maxUnavailable 属性控制可以被删除的最大 Pod 数量。

如果在升级过程中达到了最大多余 Pod 数量或最大删除 Pod 数量,升级会被暂停。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.17
        ports:
        - containerPort: 80

3. 升级的超时时间

Deployment 的 spec.progressDeadlineSeconds 属性控制升级的超时时间。如果升级过程超过了指定的超时时间,升级会被回滚。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
  progressDeadlineSeconds: 600
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.17
        ports:
        - containerPort: 80

总结

滚动升级 Deployment 是 Kubernetes 中一种非常常用的升级方式,它可以实现应用程序的无中断升级,确保应用程序始终处于可用状态。在实践过程中,我们需要根据实际需求来选择合适的升级策略和调整升级的参数,以确保升级的顺利进行。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659fa88fadd4f0e0ff8325b5


纠错反馈