我有一个包含两个节点池的 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 的首选方式应为:
- 通过配置 kube-dns-autoscaler配置图
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