kubernetes 在同一节点中运行两个pod?

k10s72fa  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(210)

我希望将两个pod紧密耦合在同一个节点上运行,这样即使一个pod被意外删除,它也会被重新调度到另一个应用程序所在的同一个节点上。这对于两个应用程序应该是相同的。假设我有两个pod P1和P2。然后,如果pod P1在节点N1上运行,则pod P2也应该在同一节点N1上运行。我已经使用此清单实现了这一点。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: first-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: first-app
  template:
    metadata:
      labels:
        app: first-app
    spec:
      containers:
      - name: first-app
        imagePullPolicy: IfNotPresent
        image: image1
      nodeSelector:
        nodegroup: etl
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: "app"
                  operator: In
                  values:
                  - first-app

字符串
对于第二个应用程序

apiVersion: apps/v1
kind: Deployment
metadata:
  name: second-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: second-app
  template:
    metadata:
      labels:
        app: second-app
    spec:
      containers:
      - name: second-app
        imagePullPolicy: IfNotPresent
        image: image1
      nodeSelector:
        nodegroup: etl
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: "app"
                  operator: In
                  values:
                  - second-app
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - first-app
              topologyKey: "kubernetes.io/hostname"


通过这种方式,second-app将始终被分配给第一节点正在运行的同一节点。现在,当两个应用程序都在运行时,第一个应用程序意外地从节点中删除并分配给另一个节点,第二个节点也应该从节点中驱逐并分配给第一个应用程序运行的另一个节点。
另一种解决方案可能是,当第一应用从节点中出来时,它被调度到第二应用正在运行的相同节点,反之亦然。
但我不知道如何实现这一点?

8mmmxcuj

8mmmxcuj1#

requiredDuringSchedulingIgnoredDuringExecution将此更改为requiredDuringSchedulingRequiredDuringExecution将在第一个应用从节点中删除时驱逐第二个应用。但这一功能尚未实现。因此,我认为这里的选择是编写一个自定义的调度程序来实现这一点。
https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/

x6yk4ghg

x6yk4ghg2#

从服务的Angular 来看,这是一个奇怪的需求,因此,您可能没有做正确的事情。它违背了面向服务的体系结构的一些基本思想,在面向服务的体系结构中,抽象的层次是服务,下面的“东西”都是自动化的,我们不应该关心它。实际上,您可能希望将两个pod中的所有容器连接到一个新pod中,以显著简化这个问题。不过……
有许多方法可以实现这一点,但最简单的可能是标签。我将把实现留给您,但基本上,您可以在两个pod中使用一个init容器来标记节点,并让两个pod的部署选择具有标签的节点(yaml中的nodeSelector)。当两个pod都死了的时候,移除标签可能会有点复杂,但仍然不是太难,甚至可能不是必要的。
另一种方法是使用一个可变的web钩子(一个准入控制器)来找到另一个pod正在运行的节点,并将nodeName属性注入到pod描述符中。这也很难,但这意味着你不必担心清理标签。
您还可以使用其他技术,例如构建一个简单的操作符,将这些内容放在一起,但这些内容往往会很快变得复杂。我强烈建议你在做任何事情之前再看看你的要求。它可能比你想象的更复杂,因为Pod经常会自动调度到另一个节点或扩展到多个节点,这让整个事情变得很头疼。

相关问题