在 GCP 中受污染的节点上调度 kube-dns

在 GCP 中受污染的节点上调度 kube-dns

我有一个包含两个节点池的 GKE 集群。其中一个是受污染节点池,供特定 Pod 使用。

添加受污染的节点池后,我意识到 Kubernetes 正尝试在池的节点上安排 kube-dns pod,但无法成功。

据我所知,如果我想让 DNS 解析正常工作,则所有节点都应部署 kube-dns。也许这是一个错误的假设?

由于 kube-dns(以及 kube-system 中的其他内容)由 GKE 管理而不是由我管理,因此我不知道如何:

  • 如果需要,告诉 kube-dns 容忍我的节点池,或者
  • 如果不需要,则告诉 kube-dns 不要在其上进行安排。

答案1

目前使用 1.1.5.12.-gke 您至少应该部署:

  • kube-dns部署
  • kube-dns-autoscaler部署

根据文档kube-dns-自动缩放器

kube-dns 可以扩展以满足集群的 DNS 需求。此扩展由kube-dns-自动缩放器它默认部署在所有 GKE 集群中。kube-dns-autoscaler 根据集群中的节点和核心数量调整 kube-dns 部署中的副本数量。

在集群中调整 kube-dns 的首选方式应为:



    linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16, "preventSinglePointFailure": true}'

在哪里:

“preventSinglePointFailure”:true controller ensures at least 2 replicas if there are more than one node.

对于当前副本,使用此参数将计算如下:

    replicas = max( ceil( cores × 1/coresPerReplica ) , ceil( nodes × 1/nodesPerReplica ) )

  • 手动:
    kubectl scale --replicas=0 deployment/kube-dns-autoscaler --namespace=kube-system
    kubectl scale --replicas=1 deployment/kube-dns --namespace=kube-system

目前您遇到的问题源于默认kube-dns部署配置:

toleration:
    - key: CriticalAddonsOnly
      operator: Exists
    - key: components.gke.io/gke-managed-components
      operator: Exists

此配置可防止在具有自定义污点的节点上调度 pod。

我建议验证一下——为什么你的 pod 无法在默认池中的集群中调度(可能是由于默认池中缺少资源)并且我会考虑调整这个默认池的大小。

另一个解决方案是部署自定义kube-dns or core-dns 配置

答案2

顺便说一下,kube-dns它存在于kube-system命名空间中。污染您的节点,使其可用于在此命名空间中调度 pod,因为它是集群正常工作所必需的。

答案3

显然,某些系统 pod(例如 kube-dns、heapster、kube-dns-autoscaler)不支持自定义容忍度。因为它们由 GKE 管理,并且 GKE 会定期重新确认 pod,丢弃其他人所做的任何更改。

此问题仍未解决,请在此处跟踪https://github.com/kubernetes/kubernetes/issues/57659

相关内容