首页 > 解决方案 > 使用 Azure AKS 向 pod 请求 CPU 失败

问题描述

我正在使用运行 K8s v1.16.15 的 AKS 集群。

我正在按照这个简单的示例为 pod 分配一些 cpu,但它不起作用。 https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/

为请求应用此 yaml 文件后,

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
- "2"

如果我尝试 Kubectl describe pod... 我会得到以下信息:

Events:
Type     Reason            Age        From               Message
----     ------            ----       ----               -------
Warning  FailedScheduling  <unknown>   default-scheduler  0/1 nodes are available: 1 Insufficient cpu.

但是 CPU 似乎可用,如果我运行 kubectl top 节点,我会得到:

CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%

702m         36%    4587Mi          100%

也许它与某些 AKS 配置有关,但我可以弄清楚。

你知道发生了什么吗?

非常感谢提前!!

标签: kubernetesazure-aks

解决方案


前面的答案很好地解释了为什么会发生这种情况。可以添加的是,在调度有请求的 pod 时,您必须了解其他集群对象消耗的资源。系统对象也使用您的资源。即使是小型集群,您也可能启用了一些会消耗节点资源的插件。

所以你的节点有一定数量的 CPU 和内存可以分配给 pod。虽然调度调度程序只会考虑具有足够未分配资源的节点来满足您的所需请求。如果未分配的 CPU 或内存量小于 pod 请求的量,Kubernetes 不会将 pod 调度到该节点,因为节点无法提供 pod 所需的最小量。

如果您描述您的节点,您将看到已经在运行并消耗您的资源的 pod 和所有allocated resources

Namespace                   Name                                           CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                           ------------  ----------  ---------------  -------------  ---
  default                     elasticsearch-master-0                         1 (25%)       1 (25%)     2Gi (13%)        4Gi (27%)      8d
  default                     test-5487d9b57b-4pz8v                          0 (0%)        0 (0%)      0 (0%)           0 (0%)         27d
  kube-system                 coredns-66bff467f8-rhbnj                       100m (2%)     0 (0%)      70Mi (0%)        170Mi (1%)     35d
  kube-system                 etcd-minikube                                  0 (0%)        0 (0%)      0 (0%)           0 (0%)         16d
  kube-system                 httpecho                                       0 (0%)        0 (0%)      0 (0%)           0 (0%)         34d
  kube-system                 ingress-nginx-controller-69ccf5d9d8-rbdf8      100m (2%)     0 (0%)      90Mi (0%)        0 (0%)         34d
  kube-system                 kube-apiserver-minikube                        250m (6%)     0 (0%)      0 (0%)           0 (0%)         16d
  kube-system                 kube-controller-manager-minikube               200m (5%)     0 (0%)      0 (0%)           0 (0%)         35d
  kube-system                 kube-scheduler-minikube                        100m (2%)     0 (0%)      0 (0%)           0 (0%)         35d
  kube-system                 traefik-ingress-controller-78b4959fdf-8kp5k    0 (0%)        0 (0%)      0 (0%)           0 (0%)         34d

Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests      Limits
  --------           --------      ------
  cpu                1750m (43%)   1 (25%)
  memory             2208Mi (14%)  4266Mi (28%)
  ephemeral-storage  0 (0%)        0 (0%)
  hugepages-1Gi      0 (0%)        0 (0%)
  hugepages-2Mi      0 (0%)        0 (0%)

现在最重要的部分是你可以做些什么:

  1. 您可以启用自动缩放,以便系统自动配置节点和额外需要的资源。这当然假设您用完了资源并且需要更多资源
  2. 您可以自己配置适当的节点(取决于您如何引导集群)
  3. 关闭任何可能占用您不需要的所需资源的附加服务

推荐阅读