节点未就绪,待处理的pod

Rob*_*cok 6 google-cloud-platform kubernetes google-kubernetes-engine

我正在GKE上运行一个集群,有时我会进入挂起状态.现在我只使用两个节点并允许群集自动缩放.其中一个节点具有NotReady状态,只是停留在其中.因此,由于CPU不足,我的一半pod正在等待.

我是怎么到那儿的

我从一开始就部署了一个具有相当高的CPU使用率的pod.当我将其缩放到2时,我注意到CPU使用率为1.0; 在我将部署扩展到3个副本的那一刻,我希望第三个处于Pending状态,直到集群添加另一个节点,然后在那里安排它.
相反,节点切换到NotReady状态,其上的所有pod现在都处于Pending状态.但是,节点没有重启或任何东西 - 它只是不被Kubernetes使用.然后GKE认为有足够的资源,因为VM有0 CPU使用率,并且不会扩展到3.我无法从控制台手动SSH到实例 - 它被卡在加载循环中.

我可以手动删除实例然后它开始工作 - 但我不认为这是完全管理的想法.

我注意到的一件事 - 不确定是否相关:在GCE控制台中,当我查看VM实例时,实例组和负载均衡器(这是nginx入口点周围的服务)正在使用Ready节点,但NotReady节点仅由实例组使用 - 而不是负载平衡器.

此外,kubectl get events有一条线:

Warning   CreatingLoadBalancerFailed   {service-controller }          Error creating load balancer (will retry): Failed to create load balancer for service default/proxy-service: failed to ensure static IP 104.199.xx.xx: error creating gce static IP address: googleapi: Error 400: Invalid value for field 'resource.address': '104.199.xx.xx'. Specified IP address is already reserved., invalid
Run Code Online (Sandbox Code Playgroud)

loadBalancerIP: 104.199.xx.xx在代理服务的定义中指定了以确保在每次重新启动时服务获得相同(保留)的静态IP.

有关如何防止这种情况发生的任何想法?因此,如果一个节点卡在NotReady状态,它至少会重新启动 - 但理想情况下不会进入这样的状态开始?

谢谢.

小智 8

我要做的第一件事是为这些pod定义资源和限制.

资源告诉集群您认为该pod将使用多少内存和CPU.这样做是为了帮助调度程序找到运行这些pod的最佳位置.

限制在这里至关重要:它们设置为防止您的pod损坏节点的稳定性.由于资源不足,最好让一个由OOM杀死的pod而不是一个使节点停机的pod.

例如,在这种情况下,你说要为你的pod想要200m CPU(20%),但如果它有机会超过300(30%),你希望调度程序杀掉它并开始一个新的.

spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
    resources:
      limits:
        cpu: 300m
        memory: 200Mi
      requests:
        cpu: 200m
        memory: 100Mi
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多:http://kubernetes.io/docs/admin/limitrange/