GCloud kubernetes集群出现1个CPU错误不足

时间:2019-02-14 20:51:34

标签: kubernetes google-cloud-platform gcloud kubectl google-kubernetes-engine

我使用以下方法在Google Cloud上创建了Kubernetes集群:

gcloud container clusters create my-app-cluster --num-nodes=1

然后,我部署了3个应用程序(后端,前端和刮板),并创建了负载平衡器。我使用了以下配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: my-app-deployment
    labels:
        app: my-app
spec:
    replicas: 1
    selector:
        matchLabels:
            app: my-app
    template:
        metadata:
            labels:
                app: my-app
        spec:
            containers:
              - name: my-app-server
                image: gcr.io/my-app/server
                ports:
                  - containerPort: 8009
                envFrom:
                  - secretRef:
                        name: my-app-production-secrets
              - name: my-app-scraper
                image: gcr.io/my-app/scraper
                ports:
                  - containerPort: 8109
                envFrom:
                  - secretRef:
                        name: my-app-production-secrets
              - name: my-app-frontend
                image: gcr.io/my-app/frontend
                ports:
                  - containerPort: 80
                envFrom:
                  - secretRef:
                        name: my-app-production-secrets

---

apiVersion: v1
kind: Service
metadata:
    name: my-app-lb-service
spec:
    type: LoadBalancer
    selector:
        app: my-app
    ports:
      - name: my-app-server-port
        protocol: TCP
        port: 8009
        targetPort: 8009
      - name: my-app-scraper-port
        protocol: TCP
        port: 8109
        targetPort: 8109
      - name: my-app-frontend-port
        protocol: TCP
        port: 80
        targetPort: 80

输入kubectl get pods时,我得到:

NAME                                   READY     STATUS    RESTARTS   AGE
my-app-deployment-6b49c9b5c4-5zxw2   0/3       Pending   0          12h

在Google Cloud上进行调查时,我在Pod上看到“计划外”状态和“ CPU不足”错误:

Unschedulable state due to Insufficient cpu

转到“群集”页面中群集下的“节点”部分时,我看到请求的681 mCPU和分配的940 mCPU: enter image description here

怎么了?为什么我的吊舱无法启动?

1 个答案:

答案 0 :(得分:2)

每个容器都有默认的CPU请求(在GKE中,我注意到它是0.1 CPU或100m)。假设使用这些默认值,那么您在该容器中有三个容器,因此您要再请求0.3个CPU。

该节点具有其他工作负载请求的0.68 CPU(680m),该节点上的总限制(可分配)为0.94 CPU(940m)。

如果要查看哪些工作负载在保留该0.68 CPU,则需要检查节点上的Pod。在GKE的页面上,您可以看到每个节点的资源分配和限制,如果单击该节点,它将带您到提供此信息的页面。
以我为例,我可以看到kube-dns的两个Pod各自占用0.26 CPU。这些是正确操作集群所需的系统Pod。您看到的内容还将取决于您选择的附加服务,例如:HTTP负载平衡(入口),Kubernetes仪表板等。

您的pod会将节点的CPU占用的CPU提升到0.98,这超出了0.94的限制,这就是为什么pod无法启动的原因。

请注意,调度是基于每个工作负载请求的CPU数量,而不是实际使用的数量或限制。

您的选择:

  1. 关闭所有占用您不需要的CPU资源的附加服务。
  2. 向群集添加更多CPU资源。为此,您将需要更改节点池以使用具有更多CPU的VM,或者增加现有池中的节点数。您可以在GKE控制台中或通过gcloud命令行执行此操作。
  3. 在您的容器中提出显式请求,以减少将覆盖默认值的CPU。
apiVersion: apps/v1
kind: Deployment
...
        spec:
            containers:
              - name: my-app-server
                image: gcr.io/my-app/server
                ...
                resources:
                  requests:
                     cpu: "50m"
              - name: my-app-scraper
                image: gcr.io/my-app/scraper
                ...
                resources:
                  requests:
                     cpu: "50m"
              - name: my-app-frontend
                image: gcr.io/my-app/frontend
                ...
                resources:
                  requests:
                     cpu: "50m"