Kubernetes 在同一节点上运行两个pod?
我想将两个pod紧密耦合在同一个节点上运行,这样即使一个pod被意外删除,它也会被重新调度到另一个应用所在的同一个节点上。这两个应用程序应该是相同的。 假设我有两个豆荚P1和P2。然后,如果pod P1在节点N1上运行,则pod P2也应在同一节点N1上运行。 我已经用这个清单实现了这个Kubernetes 在同一节点上运行两个pod?,kubernetes,Kubernetes,我想将两个pod紧密耦合在同一个节点上运行,这样即使一个pod被意外删除,它也会被重新调度到另一个应用所在的同一个节点上。这两个应用程序应该是相同的。 假设我有两个豆荚P1和P2。然后,如果pod P1在节点N1上运行,则pod P2也应在同一节点N1上运行。 我已经用这个清单实现了这个 apiVersion: apps/v1 kind: Deployment metadata: name: first-app spec: replicas: 1 selector: matc
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"
这样,第二个应用程序将始终分配给第一个节点运行的同一个节点。现在,当两个应用程序都在运行时,第一个应用程序会意外地从节点中删除并分配给另一个节点,第二个节点也应该从节点中退出并分配给第一个应用程序运行的另一个节点
另一种解决方案可能是,当第一个应用程序从该节点退出时,它将被调度到第二个应用程序运行的同一节点,反之亦然
但我不知道如何实现这一点?
requiredDuringSchedulingIgnoredDuringExecution
将此更改为requiredDuringSchedulingRequiredDuringExecution
将在从节点删除第一个应用时退出第二个应用。但这一功能尚未实现。因此,我认为这里的选项是编写一个实现此功能的自定义调度程序
requiredDuringSchedulingIgnoredDuringExecution
将此更改为requiredDuringSchedulingRequiredDuringExecution
将在从节点删除第一个应用时退出第二个应用。但这一功能尚未实现。因此,我认为这里的选项是编写一个实现此功能的自定义调度程序
这是一个奇怪的要求,因此,您可能没有做正确的事情。它违背了面向服务体系结构的一些基本思想,在这种体系结构中,抽象级别是服务,而底层的“东西”都是自动化的,我们不应该关心它。实际上,您可能希望将两个吊舱中的所有容器连接到一个新吊舱中,以显著简化此问题。然而 实现这一点的方法有很多,但最简单的方法可能是使用标签。我将把实现留给您,但基本上您可以在两个pod中都有一个init容器来标记节点,并让两个pod的部署使用标签选择节点(
nodeSelector
)。当两个豆荚都死亡时,移除标签可能会稍微复杂一些,但仍然不是太难,甚至可能没有必要
另一种方法是使用变异web钩子(准入控制器)查找另一个pod运行的节点,并将nodeName
属性注入pod描述符。这也很难,但这意味着你不必担心清理标签
您还可以使用其他技术,例如构建一个简单的操作符来将这些内容保持在一起,但这些内容往往会很快变得复杂。我强烈建议你在做任何事情之前再看看你的要求。这可能比你想象的要复杂,因为POD通常会自动调度到另一个节点或扩展到多个节点,这使整个事情变得令人头痛。这是一个奇怪的要求,因此,你可能没有做正确的事情。它违背了面向服务体系结构的一些基本思想,在这种体系结构中,抽象级别是服务,而底层的“东西”都是自动化的,我们不应该关心它。实际上,您可能希望将两个吊舱中的所有容器连接到一个新吊舱中,以显著简化此问题。然而 实现这一点的方法有很多,但最简单的方法可能是使用标签。我将把实现留给您,但基本上您可以在两个pod中都有一个init容器来标记节点,并让两个pod的部署使用标签选择节点(
nodeSelector
)。当两个豆荚都死亡时,移除标签可能会稍微复杂一些,但仍然不是太难,甚至可能没有必要
另一种方法是使用变异web钩子(准入控制器)查找另一个pod运行的节点,并将nodeName
属性注入pod描述符。这也很难,但这意味着你不必担心清理标签
您还可以使用其他技术,例如构建一个简单的操作符来将这些内容保持在一起,但这些内容往往会很快变得复杂。我强烈建议你在做任何事情之前再看看你的要求。这可能比你想象的要复杂,因为POD通常会自动调度到另一个节点或扩展到多个节点,这使整个事情变得令人头痛。但我认为kuberentes还不支持这一点。你是对的…编写一个自定义计划程序来实现这一点这就是为什么选项名如此长,所以你100%必须键入并查看
ignoreduringexecution
部分。但我认为kuberentes还不支持这一点。你是对的…编写一个实现这一点的自定义计划程序这就是为什么选项名称如此之长,所以你100%必须键入并查看ignoreduringexecution
部分。虽然我在下面回应软件工程师,这是一个不好的要求,并且表明你的软件已经被设计破坏了,您可能希望将运行视为单个pod中的两个容器。虽然我在下面回应了软件工程师的观点,即这是一个不好的要求,表明您的软件已经被设计破坏,但您可能希望将运行视为单个pod中的两个容器。