Cordon、Drain、污点与容忍度、亲和性与反亲和性
在Kubernetes(K8s)中,Cordon、Drain、污点与容忍度、亲和性与反亲和性都是与资源管理和调度相关的概念。下面是对这些概念的详细解释:
-
Cordon(封锁、警戒):
-
Cordon是一个节点维护操作,用于阻止新的Pods被调度到该节点上。当一个节点被标记为Cordon时,已经在该节点上运行的Pods不会被驱逐,但新的Pods不会被调度到这个节点。
-
这个操作通常用于节点的维护或升级,确保在维护期间不会有新的工作负载被分配到该节点上。
kubectl cordon node1 kubectl get nodes # status会新增SchedulingDisabled kubectl uncordon node1
-
-
Drain(驱逐):
-
Drain操作会驱逐节点上的所有Pods,即将它们从节点上移除并重新调度到其他可用的节点上。
-
在执行Drain操作时,可以指定一些选项,如忽略DaemonSets管理的Pods,或者强制驱逐即使Pods有对应的容忍度。
-
Drain操作会将节点设置为不可调度状态(Cordon),确保在驱逐Pods期间不会有新的Pods被调度到这个节点上。
kubectl drain node1 --ignore-daemonsets=true --force
-
-
污点(Taints):
-
污点是应用于节点上的,用来表示节点存在某种问题或满足特定条件,从而阻止Pods被调度到这个节点上。
-
污点由键(key)、值(value)和效应(effect)组成。效应可以是NoSchedule(不允许调度)、PreferNoSchedule(优先不调度)或NoExecute(不允许运行且驱逐已运行的Pods)。
-
内置的污点包括节点未就绪、不可达、磁盘空间不足、内存压力等,也可以自定义污点。
kubectl taint node node1 wudian:NoSchedule kubectl taint node node1 wudian-
-
-
容忍度(Tolerations):
-
容忍度是应用于Pods上的,允许Pods在存在污点的节点上调度或继续运行。
-
如果Pod有对应的容忍度,它可以被调度到带有相应污点的节点上,或者即使节点上的污点触发了NoExecute效应,Pod也可以继续在该节点上运行。
-
容忍度与污点相互配合,用于实现Pod对节点条件的灵活适应和调度控制。
# 键为key1且值为value1的污点,该污点的效应为NoSchedule。 # 键为key2的任何污点,因为operator是Exists,并且该污点的效应为NoExecute。 apiVersion: v1 kind: Pod metadata: name: my-tolerant-pod spec: containers: - name: my-container image: my-image tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" - key: "key2" operator: "Exists" effect: "NoExecute"
-
-
亲和性(Affinity):
-
亲和性是一种规则,用于定义Pods在集群中的调度偏好。它允许用户根据标签选择器将Pods调度到具有特定标签的节点上。
-
亲和性可以是硬亲和性(必须满足 requiredDuringSchedulingIgnoredDuringExecution)或软亲和性(尽量满足 preferredDuringSchedulingIgnoredDuringExecution)。硬亲和性在调度时必须满足,而软亲和性则是调度器在满足其他约束条件后尽量满足的。
-
通过使用亲和性,可以优化Pod的部署和性能,例如将相互依赖的Pods调度到同一节点上以减少网络延迟。
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1 - node2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: disktype operator: In values: - ssd
apiVersion: v1 kind: Pod metadata: name: my-pod spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - my-app topologyKey: kubernetes.io/hostname containers: - name: my-container image: my-image
-
-
反亲和性(Anti-Affinity):
-
反亲和性是一种规则,用于定义Pods在集群中的调度反偏好。它确保Pods不会被调度到具有特定标签或已存在某些Pods的节点上。
-
反亲和性有助于提高应用程序的可用性和容错性,通过将Pods分散到不同的节点上,可以防止单点故障。
-
反亲和性通常用于确保Pods的高可用性,例如将数据库副本分散到不同的节点上以防止数据丢失。
apiVersion: v1 kind: Pod metadata: name: my-pod spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - my-app topologyKey: kubernetes.io/hostname containers: - name: my-container image: my-image
-
通过合理使用这些功能,可以更好地控制和优化集群中资源的分配和Pod的部署。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/18042437