标签上的Kubernetes反亲和-通过节点标签传播副本
我们有3个ESXi主机,每个主机上有2个Kubernetes工作人员。所有节点都标有“esxhost:esxN”,我希望将副本分布在这些主机上。很容易将副本分布到工作进程上,在一台主机上没有相同的服务,但我希望分布到ESXi主机上,即使有两个工作进程死亡,也有HA,因为ESXi主机死亡 我该怎么办?尝试了一些选择,但没有成功标签上的Kubernetes反亲和-通过节点标签传播副本,kubernetes,high-availability,Kubernetes,High Availability,我们有3个ESXi主机,每个主机上有2个Kubernetes工作人员。所有节点都标有“esxhost:esxN”,我希望将副本分布在这些主机上。很容易将副本分布到工作进程上,在一台主机上没有相同的服务,但我希望分布到ESXi主机上,即使有两个工作进程死亡,也有HA,因为ESXi主机死亡 我该怎么办?尝试了一些选择,但没有成功 apiVersion: apps/v1 kind: Deployment metadata: name: demo namespace: someNS spec:
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....."
您可以定义反亲和性规则。它们用来使豆荚彼此远离。有两种变体:
- 软(首选DuringSchedulingIgnoreDuringExecution)
- 硬(需要定时忽略或定时执行)
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- demo
topologyKey: "kubernetes.io/hostname"
此外,如果您希望在主节点上调度吊舱,则必须删除主节点的默认污点:
kubectl get nodes
kubectl describe node master_node_name
kubectl taint nodes master_node_name key:NoSchedule-
您可以定义反亲和力规则。它们用来使豆荚彼此远离。有两种变体:
- 软(首选DuringSchedulingIgnoreDuringExecution)
- 硬(需要定时忽略或定时执行)
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- demo
topologyKey: "kubernetes.io/hostname"
此外,如果您希望在主节点上调度吊舱,则必须删除主节点的默认污点:
kubectl get nodes
kubectl describe node master_node_name
kubectl taint nodes master_node_name key:NoSchedule-
正如@iliefa所说,您应该使用pod反亲和力,但随后必须定义两个亲和力术语。第一个将阻止(软或硬)在相同节点上分发POD,第二个将阻止(软或硬)在相同可用性区域中分发POD(您称之为ESXi主机)。也许您可以使用,或者更具体地说-
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>
affinity:
抗亲和力:
首选DuringSchedulingIgnoreDuringExecution:
-重量:
podAffinityTerm:
topologyKey:kubernetes.io/hostname
标签选择器:
火柴标签:
-重量:
podAffinityTerm:
topologyKey:failure-domain.beta.kubernetes.io/zone
标签选择器:
火柴标签:
您放置的权重将定义每个反亲和力规则相对于其他规则的重要性。正如@iliefa所说,您应该使用pod反亲和力,但随后必须定义两个亲和力术语。第一个将阻止(软或硬)在相同节点上分发POD,第二个将阻止(软或硬)在相同可用性区域中分发POD(您称之为ESXi主机)。也许您可以使用,或者更具体地说-
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>
affinity:
抗亲和力:
首选DuringSchedulingIgnoreDuringExecution:
-重量:
podAffinityTerm:
topologyKey:kubernetes.io/hostname
标签选择器:
火柴标签:
-重量:
podAffinityTerm:
topologyKey:failure-domain.beta.kubernetes.io/zone
标签选择器:
火柴标签:
您放置的权重将定义每个反亲和性规则相对于其他规则的重要性。谢谢,但如果我没看错的话,这将分布在节点上。但是,我如何管理一个pod没有调度到与另一个pod所在的节点具有相同标签(esxhost:esx1)的节点上呢。esx1:node1/node2 esx2:node3/node4我希望如果一个pod在node1/2上,那么第二个pod在node3或4上调度,规则如下“如果X已经运行一个或多个符合规则Y的pod,则该pod不应在X中运行”。X表示拓扑结构——最简单的形式是节点,但它可以是机架、可用区或其他由每个节点上的标签标记的东西。Y表示标签选择器,就像节点亲和力一样。您可以将一个标签设置为反关联规则,并使用相同的标签标记同一ESXThanks上的节点,但如果我看得正确,这将分布在节点上。但是,我如何管理一个pod没有调度到与另一个pod所在的节点具有相同标签(esxhost:esx1)的节点上呢。esx1:node1/node2 esx2:node3/node4我希望如果一个pod在node1/2上,那么第二个pod在node3或4上调度,规则如下“如果X已经运行一个或多个符合规则Y的pod,则该pod不应在X中运行”。X表示拓扑结构——最简单的形式是节点,但它可以是机架、可用区或其他由每个节点上的标签标记的东西。Y表示标签选择器,就像节点亲和力一样。您可以将标签设置为反关联规则,并使用同一标签标记同一ESX上的节点