【问题标题】:Auto-provisioned node pool is not getting cleaned up自动配置的节点池未清理
【发布时间】:2020-03-16 14:11:55
【问题描述】:

我有一个在 GKE 上启用了自动配置的 Kubernetes 集群。

gcloud beta container clusters create "some-name" --zone "us-central1-a" \
  --no-enable-basic-auth --cluster-version "1.13.11-gke.14" \
  --machine-type "n1-standard-1" --image-type "COS" \
  --disk-type "pd-standard" --disk-size "100" \
  --metadata disable-legacy-endpoints=true \
  --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
  --num-nodes "1" --enable-stackdriver-kubernetes --enable-ip-alias \
  --network "projects/default-project/global/networks/default" \
  --subnetwork "projects/default-project/regions/us-central1/subnetworks/default" \
  --default-max-pods-per-node "110" \
  --enable-autoscaling --min-nodes "0" --max-nodes "8" \
  --addons HorizontalPodAutoscaling,KubernetesDashboard \
  --enable-autoupgrade --enable-autorepair \
  --enable-autoprovisioning --min-cpu 1 --max-cpu 40 --min-memory 1 --max-memory 64

我运行的部署不适合现有节点(具有 1 个 CPU)。

kubectl run say-lol --image ubuntu:18.04 --requests cpu=4 -- bash -c 'echo lolol && sleep 30'

自动配置器正确检测到需要一个新的节点池,它创建了一个新的集群并开始运行新的部署。 但是,它不再需要后无法将其删除。

kubectl delete deployment say-lol

在所有 pod 都消失后,新集群已经闲置了 20 多个小时。

$ kubectl get nodes
NAME                                                  STATUS   ROLES    AGE   VERSION
gke-some-name-default-pool-5003d6ff-pd1p        Ready    <none>   21h   v1.13.11-gke.14
gke-some-name-nap-n1-highcpu-8--585d94be-vbxw   Ready    <none>   21h   v1.13.11-gke.14

$ kubectl get deployments
No resources found in default namespace.

$ kubectl get events
No resources found in default namespace.

为什么不清理昂贵的节点池?

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    除了接受的答案之外,还有一种使用 taints 的方法。如果不可调度的 pod 有任何容忍度,自动配置器将在新的节点池中创建一个具有匹配污点的节点 (see docs)。因为新节点被污染了,其他 pod 将不会在它们上运行并阻止它们缩小。我发现这种方法比 PDB 方法更简单、更容易理解。

    【讨论】:

      【解决方案2】:

      “在缩减时,集群自动扩缩器遵循 10 分钟的正常终止期,以便在强制终止节点之前将节点的 Pod 重新调度到不同的节点上。

      有时,集群自动扩缩器无法完全缩减,缩减后会存在额外的节点。当所需的系统 Pod 被调度到不同的节点上时,可能会发生这种情况,因为这些 Pods to be moved to a different node 中的任何一个都没有触发器。”
      请检查此link “I have a couple of nodes with low utilization, but they are not scaled down. Why?”。 要解决此限制,您可以配置 Pod disruption budget

      【讨论】:

      【解决方案3】:

      我在我的两个集群上进行复制,发现罪魁祸首与 kube-dns pod 高度相关。在集群 1 上,对于扩容节点,没有 kube-dns pod 并且在删除 say-lol 后发生缩减。在集群 2 上,由于 kube-dns pod,辅助节点没有缩减。

      关注这个doc/How to set PDBs to enable CA to move kube-system pods?

      apiVersion: policy/v1beta1
      kind: PodDisruptionBudget
      metadata:
        name: kube-dns-pdb
        namespace: kube-system
      spec:
        maxUnavailable: 1
        selector:
          matchLabels:
            k8s-app: kube-dns
      

      我创建了一个 pdb 以允许 kube-dns pod 中断,从而允许缩减。您可以通过运行检查是否允许中断

      kubectl get pdb -n kube-system
      

      允许的中断应该有一个非零值以使流程正常工作。

      NAME           MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
      kube-dns-pdb   N/A             1                 1                     28m
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2017-12-22
        • 2021-02-24
        • 2020-02-06
        相关资源
        最近更新 更多