使用节点选择器确保每个节点中的Pod数量最少

时间:2019-11-30 05:31:05

标签: kubernetes microservices google-kubernetes-engine

使用node_selector,我们可以将特定的部署副本调度到某个节点池。但是如何确保每个节点中至少有一个Pod正在运行(例如,节点池的大小大于1)

我需要这样做,以确保我的Pod分散在整个节点池中,这样,如果特定节点遇到问题(例如与集群断开连接),我的应用程序仍将运行。

2 个答案:

答案 0 :(得分:3)

使用nodeSelector,您可以将Pod直接绑定到节点,但是它没有提供任何在节点上分布部署Pod的方法。

要在各个节点上分布Pod,可以使用Pod anti-affinity

例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - my-app
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: my-app
        image: my-app:1.0.0

这会安排Pod的位置,以便在可能的情况下,部署中的两个Pod都不会位于同一节点上。

例如,如果在部署中有5个节点和3个副本,则应将每个Pod安排到一个不同的节点。如果您有5个节点和6个副本,则应该将前5个Pod分别调度到一个不同的节点,将第6个Pod调度到一个已经具有Pod的节点(因为没有其他可能性)。

Kubernetes documentation中查看更多示例。

答案 1 :(得分:0)

Kubernetes具有专用的资源类型,称为daemonset。这将确保您的pod在每个节点上运行

kind: DaemonSet
metadata:
  name: ssd-monitor
spec:
  selector:
    matchLabels:
      app: ssd-monitor
  template:
    metadata:
      labels:
        app: ssd-monitor
    spec:
      containers:
      - name: main
        image: luksa/ssd-monitor

您可以看到在2个节点上运行的2个容器

[root@master ~]# kubectl get po -o wide
NAME                         READY   STATUS                       RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
ssd-monitor-24qd7            1/1     Running                      0          2m17s   10.36.0.7    node2.k8s   <none>           <none>
ssd-monitor-w7nxr            1/1     Running                      0          2m17s   10.44.0.12   node1.k8s   <none>           <none>