避免kubernetes调度程序在kubernetes集群的单个节点中运行所有pod

Pra*_*ash 10 scheduler kubernetes kubernetes-pod

我有一个kubernetes集群,有4个节点和一个主节点.我试图在所有节点中运行5 nginx pod.目前,调度程序有时在一台机器上运行所有pod,有时在不同的机器上运行.

如果我的节点发生故障并且我的所有pod都在同一节点中运行会发生什么?我们需要避免这种情况.

如何强制调度程序以循环方式在节点上运行pod,这样如果任何节点出现故障,那么至少在一个节点上应该有NGINX pod处于运行模式.

这可能吗?如果可能,我们如何实现这种情况?

Bum*_*Kim 17

使用 Pod 拓扑扩展约束

截至 2021 年(v1.19 及更高版本),您可以默认使用Pod 拓扑扩展约束 ,我发现它比这种情况更适合。topologySpreadConstraintspodAntiAfinity

主要区别在于,反亲和性只能限制每个节点有一个 pod,而 Pod 拓扑扩展约束可以限制每个节点有 N 个 pod。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-example-deployment
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx-example
  template:
    metadata:
      labels:
        app: nginx-example
    spec:
      containers:
      - name: nginx
        image: nginx:latest
      # This sets how evenly spread the pods
      # For example, if there are 3 nodes available,
      # 2 pods are scheduled for each node.
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: nginx-example
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅KEP-895官方博客文章。


mon*_*mon 7

使用podAntiAfinity

参考:Kubernetes实战第16章。高级调度

带有requiredDuringSchedulingIgnoredDuringExecution的podAntiAfinity 可用于防止将同一pod调度到相同的主机名。如果喜欢更宽松的约束,请使用preferredDuringSchedulingIgnoredDuringExecution

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 5
  template:
    metadata:
      labels:                                            
        app: nginx                                   
    spec:
      affinity:
        podAntiAffinity:                                 
          requiredDuringSchedulingIgnoredDuringExecution:   <---- hard requirement not to schedule "nginx" pod if already one scheduled.
          - topologyKey: kubernetes.io/hostname     <---- Anti affinity scope is host     
            labelSelector:                               
              matchLabels:                               
                app: nginx        
      container:
        image: nginx:latest
Run Code Online (Sandbox Code Playgroud)

Kubelet --max-pods

您可以在kubelet配置中指定节点的最大Pod数量,这样在节点关闭的情况下,将防止K8S饱和来自发生故障的节点的Pod的另一个节点。


小智 5

我认为跨Pod的反关联功能会为您提供帮助。容器间抗关联性使您可以基于节点上已经运行的容器上的标签来限制容器有资格在其上调度的节点。这是一个例子。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: nginx-service
  name: nginx-service
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx-service
  template:
    metadata:
      labels:
        service-type: nginx
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: service-type
                operator: In
                values:
                - nginx
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx-service
        image: nginx:latest
Run Code Online (Sandbox Code Playgroud)

注意:我在这里使用preferredDuringSchedulingIgnoredDuringExecution,因为您的Pod比节点多。

有关更多详细信息,您可以参考以下链接的Pod间亲和力和反亲和力(测试版功能)部分:https : //kubernetes.io/docs/concepts/configuration/assign-pod-node/


小智 0

如果您的容器指定了所需的内存和 CPU 量的资源请求,那么调度程序应该分散您的 Pod。请参阅 http://kubernetes.io/docs/user-guide/compute-resources/