5

我有一个在 GCP 上运行的集群,该集群目前完全由可抢占节点组成。我们遇到了 kube-dns 不可用的问题(可能是因为某个节点已被抢占)。我们希望通过将kube-dnspod 移动到更稳定的节点来提高 DNS 的弹性。

是否可以在只有不可抢占节点的节点池上安排系统集群关键 pod kube-dns(或命名空间中的所有 pod )?kube-system我对使用亲和力或反亲和力或污点持谨慎态度,因为这些 pod 是在集群引导时自动创建的,所做的任何更改都可能被 Kubernetes 版本升级破坏。有没有一种方法可以在升级过程中持续存在?

4

1 回答 1

4

解决方案是结合节点亲和性使用污点和容忍度。我们创建了第二个节点池,并向抢占式池添加了一个污点。

地形配置:

resource "google_container_node_pool" "preemptible_worker_pool" {
  node_config {
    ...
    preemptible     = true

    labels {
      preemptible = "true"
      dedicated   = "preemptible-worker-pool"
    }

    taint {
      key    = "dedicated"
      value  = "preemptible-worker-pool"
      effect = "NO_SCHEDULE"
    }
  }
}

然后,我们使用tolerationandnodeAffinity允许我们现有的工作负载在受污染的节点池上运行,从而有效地强制集群关键 pod 在未受污染的(非抢占式)节点池上运行。

Kubernetes 配置:

spec:
  template:
    spec:
      # The affinity + tolerations sections together allow and enforce that the workers are
      # run on dedicated nodes tainted with "dedicated=preemptible-worker-pool:NoSchedule".
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated
                operator: In
                values:
                - preemptible-worker-pool
      tolerations:
      - key: dedicated
        operator: "Equal"
        value: preemptible-worker-pool
        effect: "NoSchedule"
于 2018-07-10T21:55:58.807 回答