GCloud kubernetes 集群出现 1 Insufficient cpu 错误

GCloud kubernetes cluster with 1 Insufficient cpu error

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

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

然后我部署了我的 3 个应用程序(后端、前端和一个 scraper)并创建了一个负载均衡器。我使用了以下配置文件:

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 云时,我看到 "Unschedulable" 状态 "insufficient cpu" pod 上的错误:

当转到“集群”页面中集群下的“节点”部分时,我看到请求了 681 个 mCPU,分配了 940 个 mCPU:

怎么了?为什么我的 pod 不启动?

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

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

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

对于超过 0.94 限制的节点,您的 pod 将需要 CPU 到 0.98 CPU,这就是您的 pod 无法启动的原因。

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

您的选择:

  1. 关闭所有占用 CPU 您不需要的资源的附加服务。
  2. 向集群添加更多 CPU 资源。为此,您需要更改节点池以使用具有更多 CPU 的 VM,或者增加现有池中的节点数量。您可以在 GKE 控制台或通过 gcloud 命令行执行此操作。
  3. 在您的容器中明确请求 less 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"