部署后Kubernetes使用运行中的Pod保留旧的副本集

时间:2019-10-29 19:54:19

标签: kubernetes

不确定为什么会发生这种情况,但尽管Kubernetes集群中附加的部署已被删除了很长时间(长达82天),但我们仍在Kubernetes集群中看到带有活动Pod的旧副本集。我们的部署中spec.replicas的最大值设置为2,但是在这些部署中我们看到多达6/8个活动吊舱。

我们当前正在运行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."
      }
    ]
  }
}

2 个答案:

答案 0 :(得分:0)

标签可能有问题。您的广告连播规范中未定义标签。

答案 1 :(得分:0)

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

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

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

如果在RS之前用相同的标签创建一个裸容器,RS将对该容器进行计数,并仅部署所需数量的容器以实现所需的副本数。

通过将kubectl delete--cascade=false选项一起使用,您也可以删除ReplicaSet而不影响其任何Pod。