Kubernetes AntiAffinity over Labels - 通过节点标签传播副本
Kubernetes AntiAffinity over Labels - Spread Replicas via Node-Labels
我们有 3 台 ESXi 主机,每台主机上有 2 个 Kubernetes worker。所有节点都标有 "esxhost: esxN",我想在这些主机上传播副本。将副本分布在工作人员上很容易,在一台主机上没有相同的服务,但我想分布在 ESXi 主机上,以获得 HA,即使两个工作人员死亡,因为 ESXi 主机死亡。
我该如何处理?尝试了一些选择,但没有成功。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: someNS
spec:
replicas: 2
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo-mos-node
image: registry.docker.dev...../demo:2.1.2
ports:
- containerPort: 80
env:
- name: CONFIG
value: "https://config.git.dev....."
您可以定义反关联规则。这些用于使 pods 彼此远离。有 2 种变体:
软(preferredDuringSchedulingIgnoredDuringExecution)
困难(requiredDuringSchedulingIgnoredDuringExecution)
如果指定硬变体,如果该节点上已经有一个 pod,则不会将 pod 调度到该节点
如果您指定软变体,如果该节点已经是 运行 标签具有键“app”和值“demo”的 pod
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- demo
topologyKey: "kubernetes.io/hostname"
此外,如果你想在主节点上调度pods,你必须删除主节点的默认污点:
kubectl get nodes
kubectl describe node master_node_name
kubectl taint nodes master_node_name key:NoSchedule-
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
正如@iliefa 所说,您应该使用 pod 反亲和力,但您必须定义 2 个亲和力术语。第一个将阻止(软或硬)pods 在相同节点上的分布,第二个将阻止(软或硬)pods 在相同可用区(如您称它们为 ESXi 主机)。也许您可以使用 built in labes,或者更具体地说 - failure-domain.beta.kubernetes.io/zone
。另一种选择是根据可用区标记您的节点。这是我的意思的一个例子:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: <define-importance-here>
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
<insert-your-pod-labels-here>
- weight: <define-importance-here>
podAffinityTerm:
topologyKey: failure-domain.beta.kubernetes.io/zone
labelSelector:
matchLabels:
<insert-your-pod-labels-here>
您设置的权重将定义每个反亲和性规则与其他规则相比的重要性。
我们有 3 台 ESXi 主机,每台主机上有 2 个 Kubernetes worker。所有节点都标有 "esxhost: esxN",我想在这些主机上传播副本。将副本分布在工作人员上很容易,在一台主机上没有相同的服务,但我想分布在 ESXi 主机上,以获得 HA,即使两个工作人员死亡,因为 ESXi 主机死亡。
我该如何处理?尝试了一些选择,但没有成功。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: someNS
spec:
replicas: 2
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo-mos-node
image: registry.docker.dev...../demo:2.1.2
ports:
- containerPort: 80
env:
- name: CONFIG
value: "https://config.git.dev....."
您可以定义反关联规则。这些用于使 pods 彼此远离。有 2 种变体:
软(preferredDuringSchedulingIgnoredDuringExecution)
困难(requiredDuringSchedulingIgnoredDuringExecution)
如果指定硬变体,如果该节点上已经有一个 pod,则不会将 pod 调度到该节点
如果您指定软变体,如果该节点已经是 运行 标签具有键“app”和值“demo”的 pod
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- demo
topologyKey: "kubernetes.io/hostname"
此外,如果你想在主节点上调度pods,你必须删除主节点的默认污点:
kubectl get nodes
kubectl describe node master_node_name
kubectl taint nodes master_node_name key:NoSchedule-
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
正如@iliefa 所说,您应该使用 pod 反亲和力,但您必须定义 2 个亲和力术语。第一个将阻止(软或硬)pods 在相同节点上的分布,第二个将阻止(软或硬)pods 在相同可用区(如您称它们为 ESXi 主机)。也许您可以使用 built in labes,或者更具体地说 - failure-domain.beta.kubernetes.io/zone
。另一种选择是根据可用区标记您的节点。这是我的意思的一个例子:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: <define-importance-here>
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
<insert-your-pod-labels-here>
- weight: <define-importance-here>
podAffinityTerm:
topologyKey: failure-domain.beta.kubernetes.io/zone
labelSelector:
matchLabels:
<insert-your-pod-labels-here>
您设置的权重将定义每个反亲和性规则与其他规则相比的重要性。