GKE群集未缩减规模

时间:2019-08-06 06:16:25

标签: kubernetes google-kubernetes-engine autoscaling

我在Google Kubernetes群集上启用了自动缩放功能,我可以看到其中一个使用的Pod更低

enter image description here

我总共有6个节点,并且我希望至少该节点会终止。我经历了以下几点: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node

我已将此注释添加到我的所有Pod中

cluster-autoscaler.kubernetes.io/safe-to-evict: true

但是,群集自动缩放器可以正确放大,但是并没有达到我的预期。

我有以下日志

$ kubectl  logs kube-dns-autoscaler-76fcd5f658-mf85c -n kube-system

autoscaler/pkg/autoscaler/k8sclient/k8sclient.go:90: Failed to list *v1.Node: Get https://10.55.240.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.55.240.1:443: getsockopt: connection refused
E0628 20:34:36.187949       1 reflector.go:190] github.com/kubernetes-incubator/cluster-proportional-autoscaler/pkg/autoscaler/k8sclient/k8sclient.go:90: Failed to list *v1.Node: Get https://10.55.240.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.55.240.1:443: getsockopt: connection refused
E0628 20:34:47.191061       1 reflector.go:190] github.com/kubernetes-incubator/cluster-proportional-autoscaler/pkg/autoscaler/k8sclient/k8sclient.go:90: Failed to list *v1.Node: Get https://10.55.240.1:443/api/v1/nodes?resourceVersion=0: net/http: TLS handshake timeout
I0628 20:35:10.248636       1 autoscaler_server.go:133] ConfigMap not found: Get https://10.55.240.1:443/api/v1/namespaces/kube-system/configmaps/kube-dns-autoscaler: net/http: TLS handshake timeout, will create one with default params
E0628 20:35:17.356197       1 autoscaler_server.go:95] Error syncing configMap with apiserver: configmaps "kube-dns-autoscaler" already exists
E0628 20:35:18.191979       1 reflector.go:190] github.com/kubernetes-incubator/cluster-proportional-autoscaler/pkg/autoscaler/k8sclient/k8sclient.go:90: Failed to list *v1.Node: Get https://10.55.240.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.55.240.1:443: i/o timeout

我不确定以上是否是相关日志,调试此问题的正确方法是什么?

我的广告连播具有本地存储空间。我一直在尝试使用

调试此问题
kubectl drain  gke-mynode-d57ded4e-k8tt

error: DaemonSet-managed pods (use --ignore-daemonsets to ignore): fluentd-gcp-v3.1.1-qzdzs, prometheus-to-sd-snqtn; pods with local storage (use --delete-local-data to override): mydocs-585879b4d5-g9flr, istio-ingressgateway-9b889644-v8bgq, mydocs-585879b4d5-7lmzk

我认为忽略daemonsets是安全的,因为CA可以将其逐出,但是我不确定如何使CA理解可以将mydocs逐出并在添加注释后移至另一个节点

编辑

已按照GCP控制台上的说明正确设置了最小和最大节点 enter image description here

2 个答案:

答案 0 :(得分:1)

kubectl logs命令用于DNS自动缩放器,而不用于群集自动缩放器。它将为您提供有关群集中kube-dns副本数量的信息,而不是节点数量或扩展决策的信息。

cluster autoscaler FAQ(并考虑到您在问题中写的内容):

  

Kube系统吊舱:

     
      
  • 默认情况下不在节点上运行
  •   
  • 具有本地存储空间的豆荚
  •   

另外,限制性Pod Disruption Budgets。但是,由于问题中未提及,因此我假设您尚未设置任何内容。

尽管您的Pod具有本地存储,但是您添加了注释以使其安全地逐出,从而使系统Pod在默认情况下不会在节点中运行。

由于GKE中的系统Pod已用reconciliation loop注释,因此您无法在其中添加此指令,这可能会阻止其驱逐。

在这种情况下,您可以考虑使用Pod Disruption Budget configured to allow the autoscaler to evict them

Pod Disruption Budget可以包含节点中默认未运行的DNS和日志记录Pod。

不幸的是,GKE是托管选项,因此自动缩放器常见问题解答中没有太多应用。但是,如果您想走得更远,则不妨考虑使用pod binpacking strategyAffinity and anti-affinityTaints and tolerations使requests and limits正确地适合它们,从而使缩小尺寸变得更容易。

最后,在GKE上,您可以使用cluster-autoscaler-status ConfigMap来检查自动缩放器的决定。

答案 1 :(得分:0)

与此同时,GKE 添加了 autoscaling profiles

https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler#autoscaling_profiles

<块引用>

优化利用率:优先考虑优化利用率,而不是在集群中保留备用资源。选中后,集群自动缩放器会更积极地缩减集群:它可以删除更多节点,并更快地删除节点。此配置文件已针对对启动延迟不敏感的批处理工作负载进行了优化。我们目前不建议将此配置文件用于服务工作负载。

optimize-utilization 帮助将我们的暂存系统缩小到零节点,因为所有 Kubernetes 资源都已被删除。但是,GKE 做出反应并开始缩减节点池还需要几分钟的时间。