我有一个在GCP上运行的集群,目前完全由可预占的节点组成。我们遇到了kube-dns变得不可用的问题(可能是因为某个节点被抢占了)。我们希望通过将kube-dns pods移动到更稳定的节点来提高DNS的弹性。
是否可以在仅包含不可抢占节点的节点池上调度系统集群关键pod,如kube-dns (或kube-system名称空间中的所有pod)?我对使用亲和性或反亲和性或污染很谨慎,因为这些pod是在集群引导时自动创建的,所做的任何更改都可能被Kubernetes版本升级破坏。有没有办法做到这一点,可以在升级过程中持续下去?
发布于 2018-07-11 05:55:59
解决方案是将污染和容忍度与节点亲和性结合使用。我们创建了第二个节点池,并向可抢占池添加了一个污点。
Terraform配置:
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"
}
}
}然后,我们使用toleration和nodeAffinity来允许现有工作负载在受污染的节点池上运行,从而有效地强制集群关键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"https://stackoverflow.com/questions/50934637
复制相似问题