【问题标题】:GCloud kubernetes cluster with 1 Insufficient cpu errorGCloud kubernetes cluster with 1 Insufficient cpu error
【发布时间】:2019-07-08 23:31:10
【问题描述】:

我使用以下方法在 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 不足”错误:

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

怎么了?为什么我的 pod 没有启动?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    您的 pod 会为节点占用 CPU 到 0.98 CPU,这超过了 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"
    

    【讨论】:

    • 谢谢!我认为请求的 681mCPU 已经包含我的应用程序。那么如果我的应用程序不运行,什么需要 681 mCPU 呢??
    • 我是 Kubernetes 新手。我正在寻找如何使用 yaml 文件向集群添加更多 CPU 资源的示例。我找到了cloud.google.com/blog/products/gcp/…,但我不确定是否需要使用 ResourceQuotas 或 LimitRange。什么是正确的?
    • 我编辑了答案以解释 681mCPU 的去向。还添加了 YAML 来解释如何减少 CPU 请求以便它应该运行。
    • 谢谢!我现在看到了正在使用我的 cpu 的服务列表。我如何知道 Kubernetes 运行我的应用程序需要什么?哪些服务是强制性的?
    • 它们可能都是必需的,除了 Kubernetes 仪表板和可能的 HTTP 负载均衡器。你当然不想关闭 DNS ;)
    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2023-02-08
    • 2018-08-21
    • 2013-03-12
    • 2019-04-23
    相关资源
    最近更新 更多