Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标签上的Kubernetes反亲和-通过节点标签传播副本_Kubernetes_High Availability - Fatal编程技术网

标签上的Kubernetes反亲和-通过节点标签传播副本

标签上的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:

我们有3个ESXi主机,每个主机上有2个Kubernetes工作人员。所有节点都标有“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....."

您可以定义反亲和性规则。它们用来使豆荚彼此远离。有两种变体:

  • 软(首选DuringSchedulingIgnoreDuringExecution)

  • 硬(需要定时忽略或定时执行)

如果指定硬变量,则如果节点上已有一个pod,则不会将pod调度到该节点

如果指定了软变量,则如果某个节点已经在运行标签上有键“app”和值“demo”的pod,则pod不希望被调度到该节点上

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)

  • 硬(需要定时忽略或定时执行)

如果指定硬变量,则如果节点上已有一个pod,则不会将pod调度到该节点

如果指定了软变量,则如果某个节点已经在运行标签上有键“app”和值“demo”的pod,则pod不希望被调度到该节点上

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上的节点