Kubernetes pod在节点间的分布

有没有什么办法可以让kubernetes尽可能多地分配豆荚? 我对所有部署和全局请求以及HPA都有“请求”。 所有节点都是一样的。

刚刚有一种情况,我的ASG缩小了一个节点,一个服务变得完全不可用,因为所有4个pod都位于缩小的同一个节点上。

我想保持每个部署必须在至少2个节点上分布容器的情况。


听起来像你想要的是Pod-Pod Affinity和Pod Anti-affinity。

在Kubernetes 1.4中引入了荚间亲和力和抗亲和力。 根据已在节点上运行的Pod上的标签,而不是根据节点上的标签,可以根据Pod上的标签限制pod亲和性和反亲和性来限制您的pod有资格进行调度的节点。 规则的形式是“如果X已经在运行符合规则Y的一个或多个容器,则此容器应该(或者在反亲和的情况下不应该)在X中运行。”Y被表示为LabelSelector与命名空间(或“所有”命名空间)的关联列表; 与节点不同,因为pod是命名空间的(因此pod上的标签隐式命名空间),pod标签上的标签选择器必须指定选择器应适用的命名空间。 从概念上讲,X是一个拓扑结构域,如节点,机架,云提供商区域,云提供商区域等。您可以使用topologyKey表示它,该拓扑结构是系统用于表示此拓扑结构域的节点标签的关键字,例如,请参阅标签上面在“Interlude:内置节点标签”部分列出的键。

可以使用反亲和力来确保您将问题分布在故障域中。 您可以将这些规则陈述为偏好,或者作为硬性规则。 在后一种情况下,如果无法满足约束条件,则吊舱将无法安排。


我在这里利用Anirudh的答案添加示例代码。

我最初的kubernetes yaml看起来像这样:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: say-deployment
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: say
    spec:
      containers:
      - name: say
        image: gcr.io/hazel-champion-200108/say
        ports:
        - containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: say-service
spec:
  selector:
    app: say
  ports:
    - protocol: TCP
      port: 8080
  type: LoadBalancer
  externalIPs:
    - 192.168.0.112

此时,kubernetes调度器以某种方式决定所有6个副本都应该部署在同一个节点上。

然后我添加了requiredDuringSchedulingIgnoredDuringExecution的DuringSchedulingIgnoredDuringExecution,以强制将豆荚部署在不同的节点上:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: say-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: say
    spec:
      containers:
      - name: say
        image: gcr.io/hazel-champion-200108/say
        ports:
        - containerPort: 8080
      affinity:
              podAntiAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: "app"
                          operator: In
                          values:
                          - say
                    topologyKey: "kubernetes.io/hostname"
---
kind: Service
apiVersion: v1
metadata:
  name: say-service
spec:
  selector:
    app: say
  ports:
    - protocol: TCP
      port: 8080
  type: LoadBalancer
  externalIPs:
    - 192.168.0.112

现在所有的豆荚都在不同的节点上运行。 由于我有3个节点和6个豆荚,其他3个豆荚(6减3)不能运行(挂起)。 这是因为我需要它: requiredDuringSchedulingIgnoredDuringExecution

kubectl get pods -o wide 

NAME                              READY     STATUS    RESTARTS   AGE       IP            NODE
say-deployment-8b46845d8-4zdw2   1/1       Running            0          24s       10.244.2.80   night
say-deployment-8b46845d8-699wg   0/1       Pending            0          24s       <none>        <none>
say-deployment-8b46845d8-7nvqp   1/1       Running            0          24s       10.244.1.72   gray
say-deployment-8b46845d8-bzw48   1/1       Running            0          24s       10.244.0.25   np3
say-deployment-8b46845d8-vwn8g   0/1       Pending            0          24s       <none>        <none>
say-deployment-8b46845d8-ws8lr   0/1       Pending            0          24s       <none>        <none>

现在,如果我放松了这个要求,并且preferredDuringSchedulingIgnoredDuringExecution

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: say-deployment
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: say
    spec:
      containers:
      - name: say
        image: gcr.io/hazel-champion-200108/say
        ports:
        - containerPort: 8080
      affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - weight: 100
                    podAffinityTerm:
                      labelSelector:
                        matchExpressions:
                          - key: "app"
                            operator: In
                            values:
                            - say
                      topologyKey: "kubernetes.io/hostname"
---
kind: Service
apiVersion: v1
metadata:
  name: say-service
spec:
  selector:
    app: say
  ports:
    - protocol: TCP
      port: 8080
  type: LoadBalancer
  externalIPs:
    - 192.168.0.112

与前面的情况一样,前3个吊舱部署在3个不同的节点上。 根据kubernetes内部的考虑,其余3个(6个pod减3个节点)部署在各个节点上。

NAME                              READY     STATUS    RESTARTS   AGE       IP            NODE
say-deployment-57cf5fb49b-26nvl   1/1       Running   0          59s       10.244.2.81   night
say-deployment-57cf5fb49b-2wnsc   1/1       Running   0          59s       10.244.0.27   np3
say-deployment-57cf5fb49b-6v24l   1/1       Running   0          59s       10.244.1.73   gray
say-deployment-57cf5fb49b-cxkbz   1/1       Running   0          59s       10.244.0.26   np3
say-deployment-57cf5fb49b-dxpcf   1/1       Running   0          59s       10.244.1.75   gray
say-deployment-57cf5fb49b-vv98p   1/1       Running   0          59s       10.244.1.74   gray
链接地址: http://www.djcxy.com/p/94273.html

上一篇: Kubernetes pod distribution amongst nodes

下一篇: Poltergeist/PhantomJS crashing in Gitlab CI