Kubernetes 在进行节点维护之前需要对节点执行驱离 kubectl drain xxx-node,驱离时会将节点上的 Pod 进行删除,以便它们漂移到其它节点上,当驱逐完毕之后,节点上的 Pod 都漂移到其它节点了,这时我们就可以放心的对 Node 节点进行操作了。
一、驱逐节点是一种有损操作,节点pod驱离的原理
封锁待驱离节点,节点首先会设为不可调度,避免新的 Pod 调度上来。
将该节点上的 Pod 删除。
ReplicaSet 控制器检测到 Pod 数减少,会重新创建一个 Pod,调度到新的节点上。
插个无关美女图片
二、注意点,以下情况下驱逐会导致服务不可用
1. 服务存在单点故障,所有 Pod 都在同一个节点上,驱离该节点时,就可能造成服务不可用。 对此我们可以使用pod反亲和特性来解决。
例如:
affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: k8s-app operator: In values: - kube-dns topologyKey: kubernetes.io/hostname
2. 服务没有单点故障,但刚好这个服务涉及的 Pod 全部都部署在这一批被驱离的节点上,所以这个服务的所有 Pod 可能会被同时被删,也可能造成服务的不可用。对此节点驱离尽量不要批量处理。
3. 服务没有单点故障,也没有全部部署到这一批被驱逐的节点上,但驱离时造成这个服务的一部分 Pod 短时间内被删,这个时间内服务的处理能力下降,会导致服务过载,部分请求无法处理,这就会降低服务的可用性。我们可以通过配置 PDB (PodDisruptionBudget) 来避免所有 Pod 同时被删除。
例如zookeeper服务pdb:
apiVersion: policy/v1beta1kind: PodDisruptionBudgetmetadata: name: zk-pdbspec: maxUnavailable: 1 selector: matchLabels: app: zookeeper
转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/86399.html