【问题标题】:Horizontal Pod Autoscaler replicas based on the amount of the nodes in the cluster基于集群中节点数量的水平 Pod Autoscaler 副本
【发布时间】:2020-05-07 21:08:29
【问题描述】:

我正在寻找能够在节点加入集群时自动扩展 Pod 并在删除节点时缩回的解决方案。 我们在节点上运行 WebApp,当节点被安排断开连接时,这需要优雅的 pod 驱逐/终止。 我正在检查使用 DaemonSet 的选项,但由于我们使用 Kops 进行集群滚动更新,它忽略了 DaemonSets 驱逐(不支持标志“--ignore-daemionset”)。 结果,WebApp 与我们的应用程序不可接受的节点一起“死亡”。 Horizo​​ntalPodAutoscaler 覆盖部署 yaml 中设置的副本数量的能力可以解决这个问题。 我想找到根据集群中节点数量动态更改 Horizo​​ntalPodAutoscaler yaml 中的 min/maxReplicas 的方法。

spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: MyWebApp
  minReplicas: "Num of nodes in the cluster"
  maxReplicas: "Num of nodes in the cluster"

任何想法如何获取节点数量并相应地更新集群中的 Horizo​​ntalPodAutoscaler yaml?或者任何其他解决问题的方法?

【问题讨论】:

    标签: kubernetes autoscaling kubernetes-pod kops horizontal-pod-autoscaling


    【解决方案1】:

    您是否尝试过在 daemonset yaml 中使用 nodeSelector 规范。 因此,如果您在 yaml 中设置了节点选择器,并且如果您从节点中删除节点选择器标签值,则在耗尽之前,守护程序集应该优雅地缩小当您将新节点添加到集群标签具有自定义值的节点时也是如此并且 deamonset 将扩大规模。

    这对我有用,所以你可以试试这个并与 Kops 确认

    首先:使用集群上始终拥有的自定义标签标记所有节点

    例子:

    kubectl label nodes k8s-master-1 mylabel=allow_demon_set  
    kubectl label nodes k8s-node-1 mylabel=allow_demon_set
    kubectl label nodes k8s-node-2 mylabel=allow_demon_set
    kubectl label nodes k8s-node-3 mylabel=allow_demon_set
    

    然后到你的守护进程集 yaml 添加节点选择器。

    Example.yaml 使用如下:注意 添加节点选择器字段

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-elasticsearch
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd-elasticsearch
      template:
        metadata:
          labels:
            name: fluentd-elasticsearch
        spec:
          nodeSelector:
            mylabel: allow_demon_set
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          containers:
          - name: fluentd-elasticsearch
            image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          terminationGracePeriodSeconds: 30
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
    

    所以节点标记如下

    $ kubectl get nodes --show-labels
    NAME           STATUS   ROLES    AGE   VERSION   LABELS
    k8s-master-1   Ready    master   9d    v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master-1,kubernetes.io/os=linux,mylable=allow_demon_set,node-role.kubernetes.io/master=
    k8s-node-1     Ready    <none>   9d    v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-1,kubernetes.io/os=linux,mylable=allow_demon_set
    k8s-node-2     Ready    <none>   9d    v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-2,kubernetes.io/os=linux,mylable=allow_demon_set
    k8s-node-3     Ready    <none>   9d    v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-3,kubernetes.io/os=linux,mylable=allow_demon_set
    

    一旦你有正确的 yaml 使用它启动守护程序集

    $ kubectl create -f Example.yaml
    
    $ kubectl get all -o wide
    NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
    pod/fluentd-elasticsearch-jrgl6   1/1     Running   0          20s   10.244.3.19   k8s-node-3     <none>           <none>
    pod/fluentd-elasticsearch-rgcm2   1/1     Running   0          20s   10.244.0.6    k8s-master-1   <none>           <none>
    pod/fluentd-elasticsearch-wccr9   1/1     Running   0          20s   10.244.1.14   k8s-node-1     <none>           <none>
    pod/fluentd-elasticsearch-wxq5v   1/1     Running   0          20s   10.244.2.33   k8s-node-2     <none>           <none>
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   9d    <none>
    
    NAME                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR             AGE   CONTAINERS              IMAGES                                         SELECTOR
    daemonset.apps/fluentd-elasticsearch   4         4         4       4            4           mylable=allow_demon_set   20s   fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd:v2.5.2   name=fluentd-elasticsearch
    

    然后在排空节点之前,我们可以从节点中删除自定义标签,并且 pod-应该优雅地缩小,然后排空节点。

    $ kubectl label nodes k8s-node-3 mylabel-

    检查守护程序集,它应该缩小

    ubuntu@k8s-kube-client:~$ kubectl get all -o wide
    NAME                              READY   STATUS        RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES
    pod/fluentd-elasticsearch-jrgl6   0/1     Terminating   0          2m36s   10.244.3.19   k8s-node-3     <none>           <none>
    pod/fluentd-elasticsearch-rgcm2   1/1     Running       0          2m36s   10.244.0.6    k8s-master-1   <none>           <none>
    pod/fluentd-elasticsearch-wccr9   1/1     Running       0          2m36s   10.244.1.14   k8s-node-1     <none>           <none>
    pod/fluentd-elasticsearch-wxq5v   1/1     Running       0          2m36s   10.244.2.33   k8s-node-2     <none>           <none>
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   9d    <none>
    
    NAME                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR             AGE     CONTAINERS              IMAGES                                         SELECTOR
    daemonset.apps/fluentd-elasticsearch   3         3         3       3            3           mylable=allow_demon_set   2m36s   fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd:v2.5.2   name=fluentd-elasticsearch
    

    现在再次将标签添加到具有相同自定义标签的新节点,当它添加到集群时,deamonset 将扩大规模

    $ kubectl label nodes k8s-node-3 mylable=allow_demon_set

    ubuntu@k8s-kube-client:~$ kubectl get all -o wide
    NAME                              READY   STATUS    RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES
    pod/fluentd-elasticsearch-22rsj   1/1     Running   0          2s      10.244.3.20   k8s-node-3     <none>           <none>
    pod/fluentd-elasticsearch-rgcm2   1/1     Running   0          5m28s   10.244.0.6    k8s-master-1   <none>           <none>
    pod/fluentd-elasticsearch-wccr9   1/1     Running   0          5m28s   10.244.1.14   k8s-node-1     <none>           <none>
    pod/fluentd-elasticsearch-wxq5v   1/1     Running   0          5m28s   10.244.2.33   k8s-node-2     <none>           <none>
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   9d    <none>
    
    NAME                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR             AGE     CONTAINERS              IMAGES                                         SELECTOR
    daemonset.apps/fluentd-elasticsearch   4         4         4       4            4           mylable=allow_demon_set   5m28s   fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd:v2.5.2   name=fluentd-elasticsearch
    

    请确认您是否想要这样做并与 kops 合作

    【讨论】:

    • 嗨 D.T 谢谢你的想法。如果您使用 kubectl 维护集群,这将非常有用,但它不适用于 Kops。它不能修改特定节点,只能修改附加到该组中所有节点的 InstanceGroup 标签。因此修改特定实例组将删除所有节点上的标签,结果 DaemonSet 将从所有节点中删除 pod。
    • 如果你找到了一些使用 kops 的方法,请分享
    猜你喜欢
    • 2023-03-26
    • 2023-03-26
    • 2021-02-22
    • 2018-03-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多