【问题标题】:Kubernetes keeping old replicasets with running pods after deploymentsKubernetes 在部署后保留旧的副本集和正在运行的 pod
【发布时间】:2019-10-29 19:54:19
【问题描述】:

不知道为什么会发生这种情况,但我们看到旧的副本集在我们的 Kubernetes 集群中运行,尽管它们所附加的部署已被长期删除(最多 82 天)。我们的部署将spec.replicas 设置为最大 2,但是我们在这些部署中看到多达 6/8 个活动 pod。

我们目前正在运行 k8s 版本 1.14.6。下面还有一个示例部署

{
  "kind": "Deployment",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "xxxxxxxxxxxxxxxx",
    "namespace": "default",
    "annotations": {
      "deployment.kubernetes.io/revision": "15",
    }
  },
  "spec": {
    "replicas": 2,
    "selector": {
      "matchLabels": {
        "app": "xxxxxxxx"
      }
    },
    "template": {
      "spec": {
        "containers": [
          {
            "name": "xxxxxxxx",
            "image": "xxxxxxxx",
            "ports": [
              {
                "containerPort": 80,
                "protocol": "TCP"
              }
            ], 
            "resources": {},
            "imagePullPolicy": "Always"
          }
        ],
        "restartPolicy": "Always",
        "terminationGracePeriodSeconds": 30,
        "securityContext": {},
        "schedulerName": "default-scheduler"
      }
    },
    "strategy": {
      "type": "RollingUpdate",
      "rollingUpdate": {
        "maxUnavailable": 1,
        "maxSurge": 1
      }
    },
    "minReadySeconds": 10,
    "revisionHistoryLimit": 2147483647,
    "progressDeadlineSeconds": 2147483647
  },
  "status": {
    "observedGeneration": 15,
    "replicas": 2,
    "updatedReplicas": 2,
    "readyReplicas": 2,
    "availableReplicas": 2,
    "conditions": [
      {
        "type": "Available",
        "status": "True",
        "reason": "MinimumReplicasAvailable",
        "message": "Deployment has minimum availability."
      }
    ]
  }
}

【问题讨论】:

  • 你解决了吗?怎么样?

标签: kubernetes


【解决方案1】:

这可能是标签的问题。您的 pod 规范中没有定义任何标签。

【讨论】:

    【解决方案2】:

    对标签选择器的更改会使现有 pod 超出 ReplicaSet 的范围,因此如果您更改标签和标签选择器,则 pod 不再受 ReplicaSet“控制”。

    如果您运行kubectl get pods <pod_name> -o yaml,其中<pod_name> 是由ReplicaSet 创建的pod,您将看到所有者引用。 但是,如果您更改标签并运行相同的命令,则所有者引用将不再可见,因为它超出了 ReplicaSet 范围。

    另外,如果你创建了裸 pod 并且它们恰好与 ReplicaSet 具有相同的标签,它们将被 ReplicaSet 获取。发生这种情况是因为 RS 不限于由其模板创建的 pod - 它可以获取与其选择器匹配的 pod,并在超出 RS 清单中指定的所需数量时终止它们。

    如果在 RS 之前创建了一个具有相同标签的裸 pod,RS 将统计这个 pod,并仅部署所需数量的 pod,以达到所需的副本数。

    您还可以通过使用 kubectl delete--cascade=false 选项来删除 ReplicaSet 而不会影响其任何 Pod。

    【讨论】:

      【解决方案3】:

      解决这个问题的一种方法是将“revisionHistoryLimit”设置为我们想要保留的旧副本集的最大数量。如果回滚以前的版本,则需要它们,但通常不需要。 例如,我们可以根据下面的 .yaml 配置文件将其设置为 1(甚至 0):

      apiVersion: apps/v1
      kind: Deployment
      # ...
      spec:
        # ...
        revisionHistoryLimit: 1 # Default to 10 if not specified
        # ...
      

      要手动删除已经存在的旧副本集,可以使用以下命令:

      kubectl delete replicaset $(kubectl get replicaset -o jsonpath='{ .items[?(@.spec.replicas==0)].metadata.name }')
      

      这些答案来自这个相关的 StackOverflow 线程:Clean up "Replica Sets" when updating deployments?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 2019-02-28
        • 2017-06-22
        • 2020-12-27
        • 2021-08-11
        • 2018-12-07
        相关资源
        最近更新 更多