编辑
2023-06-07
K8S
00
请注意,本文编写于 595 天前,最后修改于 595 天前,其中某些信息可能已经过时。

目录

1.给节点添加标签
2.根据选择节点标签指派 pod 到指定节点[nodeSelector]
3.根据节点名称指派 pod 到指定节点[nodeName]
4.根据 亲和性和反亲和性 指派 pod 到指定节点
5.节点亲和性权重
6. pod 间亲和性和反亲和性及权重

你可以约束一个 Pod 以便 限制 其只能在特定的节点上运行, 或优先在特定的节点上运行。 有几种方法可以实现这点,推荐的方法都是用 标签选择算符来进行选择。 通常这样的约束不是必须的,因为调度器将自动进行合理的放置(比如,将 Pod 分散到节点上, 而不是将 Pod 放置在可用资源不足的节点上等等)。但在某些情况下,你可能需要进一步控制 Pod 被部署到哪个节点。例如,确保 Pod 最终落在连接了 SSD 的机器上, 或者将来自两个不同的服务且有大量通信的 Pods 被放置在同一个可用区。

你可以使用下列方法中的任何一种来选择 Kubernetes 对特定 Pod 的调度:

  • 与节点标签匹配的 nodeSelector 推荐
  • 亲和性与反亲和性 推荐
  • nodeName
  • Pod 拓扑分布约束 推荐

定义: 使用节点亲和性可以把 Kubernetes Pod 分配到特定节点。

1.给节点添加标签

列出集群中的节点及其标签:

js
kubectl get nodes --show-labels

选择一个节点,给它添加一个标签:

js
kubectl label nodes k8s-node1(节点名称) disktype=ssd

验证你所选节点具有 disktype=ssd 标签:

js
kubectl get nodes --show-labels

2.根据选择节点标签指派 pod 到指定节点[nodeSelector]

yml
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: nginx spec: containers: - name: nginx image: nginx:1.19 imagePullPolicy: IfNotPresent nodeSelector: disktype: ssd # 选择节点为标签为 ssd 的节点

3.根据节点名称指派 pod 到指定节点[nodeName]

yml
apiVersion: v1 kind: Pod metadata: name: nginx spec: nodeName: worker1 # 调度 Pod 到特定的节点 containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent

4.根据 亲和性和反亲和性 指派 pod 到指定节点

官网地址: http://kubernetes.p2hp.com/docs/concepts/scheduling-eviction/assign-pod-node.html

说明

nodeSelector 提供了一种最简单的方法来将 Pod 约束到具有特定标签的节点上。 亲和性和反亲和性扩展了你可以定义的约束类型。使用亲和性与反亲和性的一些好处有:

  • 亲和性、反亲和性语言的表达能力更强。nodeSelector 只能选择拥有所有指定标签的节点。 亲和性、反亲和性为你提供对选择逻辑的更强控制能力。
  • 你可以标明某规则是“软需求”或者“偏好”,这样调度器在无法找到匹配节点时仍然调度该 Pod。
  • 你可以使用节点上(或其他拓扑域中)运行的其他 Pod 的标签来实施调度约束, 而不是只能使用节点本身的标签。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。

亲和性功能由两种类型的亲和性组成:

  • 节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。
  • Pod 间亲和性/反亲和性允许你根据其他 Pod 的标签来约束 Pod。

节点亲和性概念上类似于 nodeSelector, 它使你可以根据节点上的标签来约束 Pod 可以调度到哪些节点上。 节点亲和性有两种:

  • requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。
  • preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。

注意:在上述类型中,IgnoredDuringExecution 意味着如果节点标签在 Kubernetes 调度 Pod 后发生了变更,Pod 仍将继续运行。

yml
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: #节点必须包含一个键名为 ssd 的标签, 并且该标签的取值必须为 fast 或 superfast。 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ssd operator: In values: - fast - superfast containers: - name: nginx image: nginx:1.19

注意: 你可以使用 In、NotIn、Exists、DoesNotExist、Gt和 Lt之一作为操作符。NotIn 和 DoesNotExist 可用来实现节点反亲和性行为。

5.节点亲和性权重

你可以为 preferredDuringSchedulingIgnoredDuringExecution 亲和性类型的每个实例设置 weight 字段,其取值范围是 1 到 100。

yml
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: #节点最好具有一个键名为 app 且取值为 fast 的标签。 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 #取值范围是 1 到 100 preference: matchExpressions: - key: ssd operator: In values: - fast - weight: 50 preference: matchExpressions: - key: app operator: In values: - demo containers: - name: nginx image: nginx:1.19

6. pod 间亲和性和反亲和性及权重

与节点亲和性类似,Pod 的亲和性与反亲和性也有两种类型:

  • requiredDuringSchedulingIgnoredDuringExecution
  • preferredDuringSchedulingIgnoredDuringExecution

例如,你可以使用 requiredDuringSchedulingIgnoredDuringExecution 亲和性来告诉调度器, 将两个服务的 Pod 放到同一个云提供商可用区内,因为它们彼此之间通信非常频繁。 类似地,你可以使用 preferredDuringSchedulingIgnoredDuringExecution 反亲和性来将同一服务的多个 Pod 分布到多个云提供商可用区中。

要使用 Pod 间亲和性,可以使用 Pod 规约中的 spec.affinity.podAffinity 字段。 对于 Pod 间反亲和性,可以使用 Pod 规约中的 spec.affinity.podAntiAffinity 字段。

yml
apiVersion: v1 kind: Pod metadata: name: redis labels: app: redis spec: containers: - name: redis image: redis:5.0.10 imagePullPolicy: IfNotPresent restartPolicy: Always affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: #更确切的说,调度器必须将 Pod 调度到具有 cpu 标签的节点上,并且集群中至少有一个位于该可用区的节点上运行着带有 app=nginx 标签的 Pod。 - topologyKey: cpu labelSelector: matchExpressions: - key: app operator: In values: - nginx

pod 间亲和性权重

yml
apiVersion: v1 kind: Pod metadata: name: redis labels: app: redis spec: containers: - name: redis image: redis:5.0.10 imagePullPolicy: IfNotPresent restartPolicy: Always affinity: podAffinity: preferredDuringSchedulingIgnoredDuringExecution: #更确切的说,调度器必须将 Pod 调度到具有 cpu 标签的节点上,并且集群中至少有一个位于该可用区的节点上运行着带有 app=nginx 标签的 Pod。 - podAffinityTerm: topologyKey: cpu labelSelector: matchExpressions: - key: app operator: In values: - nginx weight: 1 - podAffinityTerm: topologyKey: cpu labelSelector: matchExpressions: - key: app operator: In values: - web weight: 30

本文作者:松轩(^U^)

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Document