在暂停部署期间更改副本立即创建/删除 pod,但在 kubernetes 官方文档中未指定

Posted

技术标签:

【中文标题】在暂停部署期间更改副本立即创建/删除 pod,但在 kubernetes 官方文档中未指定【英文标题】:changing replicas create/delete pods immediately during paused deployment, but It is not specified in the kubernetes official docs 【发布时间】:2021-04-30 09:32:55 【问题描述】:

当我从 kubernetes 官方文档中阅读 Pausing and Resuming a Deployment 时,我发现我可以在暂停和恢复之间应用多个修复,而不会触发不必要的推出。 现在,当我只更改部署的映像时它工作正常,但是当我更改部署清单中的副本数并应用它时,即使部署处于暂停状态,也会根据副本数立即创建/删除 pod .

现在,我的问题是,为什么会这样?是否允许在暂停部署期间更改副本?还是只允许更改图像?文档没有具体说明。

另一件事是,如果我更改副本的数量以及映像,那么在暂停部署期间仅应用副本并使用前一个映像而不是当前映像创建 pod。

使用的部署清单文件是:

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

更新问题(提供完整详情)

发生了什么: 当我阅读 kubernetes 官方文档的Pausing and Resuming a Deployment 部分时。我暂停了部署,并在部署期间更改了部署清单文件中的副本数。之后,当我使用 kubectl apply -f deployment.yaml 应用更改时,根据新的副本数量,即使在暂停部署状态下,这些 pod 也会立即创建/删除,这些 pod 带有之前的图像。

首先,我使用命令 kubectl apply -f deployment.yaml 使用此清单创建了部署

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

之后,我打开了两个终端,使用以下命令监控 pod 和副本集:

kubectl get pods -w
kubectl get rs -w

之后我使用kubectl rollout pause deployment/nginx-deployment 命令暂停了部署。

然后我更改清单,如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 5 # <------ here changed the number of replicas
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # <---- here changed the image
        ports:
        - containerPort: 80

在使用 kubectl apply -f deployment.yaml 应用此清单后,我看到的是:使用之前的图像 image: nginx:1.14.1 创建了两个新 pods

我预期会发生什么: 根据暂停的概念,暂停的 Deployment 的 PodTemplateSpec 的任何更改只要暂停就不会触发新的推出。现在为什么在暂停部署期间实施更改副本。

还有别的吗?: 此外,如果我使用 Horizo​​ntalautoscaler,也会发生同样的事情。

环境

Kubernetes 版本(使用kubectl version):
Client Version: v1.20.1
Server Version: v1.19.1

【问题讨论】:

【参考方案1】:

我认为这不是问题。我相信这是预期的行为和 我会试着解释我为什么这么认为。

暂停功能是kubectl rollout 命令的一部分。

kubectl rollout pause ...

它用于暂停滚动更新的特定部署。

但是滚动更新实际上是什么?让我们尝试定义它。 在k8s docs 我们可以阅读:

滚动更新允许部署的更新以零进行 通过使用新实例增量更新 Pod 实例来缩短停机时间

因此,我们可以看到滚动更新被用于以零停机时间应用更改。 这包括对映像版本、容器限制等的更改。基本上与应用程序的运行和行为方式相关的任何内容。

现在,更改副本数量是否会影响正在运行的应用程序?它会改变它的行为方式吗?不!它只添加/删除同一应用程序的副本。用户仍然可以使用暂停部署之前可用的相同版本。未应用任何更改。

恢复部署后,将应用暂停后提交的所有更改。

总而言之,我相信这是预期的行为,因为副本数量的变化不会改变实际的应用程序,同时实际的更新确实暂停了。

如果您仍然不服,我建议您在k8s github repo 上打开一个问题并直接询问开发人员。

【讨论】:

@Matt 谢谢你的回答,我明白了。我开了一个issue,看看他们怎么说! 在此处粘贴指向该问题的链接,以供可能对@SahadatHossain 主题感兴趣的其他人将来参考 Issue-98457

以上是关于在暂停部署期间更改副本立即创建/删除 pod,但在 kubernetes 官方文档中未指定的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes——使用副本机制和控制器部署托管Pod

Kubernetes——使用副本机制和控制器部署托管Pod

Kubernetes——使用副本机制和控制器部署托管Pod

使用 1000 个副本自动创建新的 kubernetes 部署 (kubernetes-cli)

始终运行一个 Kubernetes pod 实例

如何在 kubernetes 中使用 yaml 文件删除和重新创建 pod