问:如何设置kubernetes集群以更好地平衡cpu负载?

问:如何设置kubernetes集群以更好地平衡cpu负载?,kubernetes,devops,google-kubernetes-engine,Kubernetes,Devops,Google Kubernetes Engine,我的一个Kubernetes集群GKE只有三个节点,并且经常有一个节点对CPU过载。我有大约32个部署,大多数部署有3个吊舱。当一个节点过载时,我通常会看到3个pod中的1个出现崩溃。理想情况下,事情不会崩溃,我的所有节点的利用率都不会超过100% 为了解决这个问题,我删除pod,排空和释放节点,或者拉动节点,事情通常会恢复正常。然而,我想知道其他人是如何解决这个问题的: 我需要更好的健康检查吗? 我的资源设置是否错误或过低? 调试这个的正确方法是什么?我使用kubectl top节点、kube

我的一个Kubernetes集群GKE只有三个节点,并且经常有一个节点对CPU过载。我有大约32个部署,大多数部署有3个吊舱。当一个节点过载时,我通常会看到3个pod中的1个出现崩溃。理想情况下,事情不会崩溃,我的所有节点的利用率都不会超过100%

为了解决这个问题,我删除pod,排空和释放节点,或者拉动节点,事情通常会恢复正常。然而,我想知道其他人是如何解决这个问题的:

我需要更好的健康检查吗? 我的资源设置是否错误或过低? 调试这个的正确方法是什么?我使用kubectl top节点、kubectl top pods和kubectl get pods-o wide来理解发生了什么。 典型节点倾斜:

kubectl top nodes                                                                                                                                                                                                                                                                                                                                        
NAME                                             CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%                                                                                                                                                                                                                                                                                                      
gke-staging-cluster-default-pool-386bd62d-bj36   481m         24%       4120Mi          38%                                                                                                                                                                                                                                                                                                          
gke-staging-cluster-default-pool-386bd62d-cl3p   716m         37%       6583Mi          62%       
gke-staging-cluster-default-pool-386bd62d-gms8   1999m        103%      6679Mi          63%       
Pod资源:

kubectl top pod | sort -nr -k2
hchchc-staging-deployment-669ff7477c-lcx5d                248m         47Mi                                                                                                                                                                                                                                                                                                                          
ggg-hc-demo-staging-deployment-77f68db7f8-nf9b5             248m         125Mi           
ggg-hc-demo-staging-deployment-77f68db7f8-c6jxd             247m         96Mi            
ggg-hc-demo-staging-deployment-77f68db7f8-l44vj             244m         196Mi           
athatha-staging-deployment-6dbdf7fb5d-h92h7                 244m         95Mi            
athatha-staging-deployment-6dbdf7fb5d-hqpm9                 243m         222Mi           
engine-cron-staging-deployment-77cfbfb948-9s9rv             142m         35Mi            
hchchc-twitter-staging-deployment-7846f845c6-g8wt4        59m          83Mi            
hchchc-worker-staging-deployment-7cbf995ddd-msrbt         51m          114Mi           
hchchc-twitter-staging-deployment-7846f845c6-brlbl        51m          94Mi            

将吊舱和节点关联起来:

kubectl get pods -o wide | grep Crash

hchchc-twitter-staging-deployment-7846f845c6-v8mgh        1/2       CrashLoopBackOff   17         1h    10.0.199.31   gke-staging-cluster-default-pool-386bd62d-gms8
hchchc-worker-staging-deployment-66d7b5d7f4-thxn6         1/2       CrashLoopBackOff   17         1h    10.0.199.31   gke-staging-cluster-default-pool-386bd62d-gms8
ggggg-worker-staging-deployment-76b84969d-hqqhb           1/2       CrashLoopBackOff   17         1h    10.0.199.31   gke-staging-cluster-default-pool-386bd62d-gms8
ggggg-worker-staging-deployment-76b84969d-t4xmb           1/2       CrashLoopBackOff   17         1h    10.0.199.31   gke-staging-cluster-default-pool-386bd62d-gms8
ggggg-worker-staging-deployment-76b84969d-zpkkf           1/2       CrashLoopBackOff   17         1h    10.0.199.31   gke-staging-cluster-default-pool-386bd62d-gms8

您可能需要向部署中添加pod反亲和力。这将使负载更均匀地分布在所有节点上

反亲和力的一个例子:

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - podAffinityTerm:
          topologyKey: kubernetes.io/hostname
这会告诉部署避免在节点上放置相同的pod(如果已经存在)。因此,如果部署有3个副本,那么所有3个副本都应该分布在3个节点上,而不是全部聚集在单个节点上并耗尽CPU

这不是一个完美的解决方案,但它可以帮助平衡一点负载


查看更多关于反亲和力的信息:

Lindsay,谢谢,我以前从未听说过!由于这是一个很小的群集,它可能无法很好地工作,但这是一个很好的第一步。32部署3个pod,每个pod仅位于3个节点上,这对于太少的节点来说似乎太多了,除非您严重限制了它们的资源。可能还值得研究群集自动扩展,以根据节点资源使用情况处理其他pod部署。