Azure Kubernetes 服务 Pod 待处理 - 4 CPU 不足

问题描述 投票:0回答:1

我希望有人能够对这个问题以及如何解决它有所帮助。

我有一个在 FRee Tier 上运行的 Azure kubernetes 服务,具有 2 个工作节点:

  • 系统节点(虚拟机 Standard_D2ds_v5),这用于 helm 图表,并具有最多 2 个实例的自动缩放功能
  • Linux 节点( Standard_D2ds_v5),这是我用于所有部署的节点,可以扩展到 6 个实例

我总共发布了大约 40 个 pod,每个 pod 都有一个 istio sidecar。

今天我开始看到每次发布后,新的 pod 都会处于待处理状态,并显示消息:

0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 4 Insufficient cpu. preemption: 0/5 nodes are available: 1 Preemption is not helpful for scheduling, 4 No preemption victims found for incoming pod..

我在这里有点困惑,因为我无法准确指出问题所在。

阅读微软文档,我可以看到每个节点有 30 个 Pod 的限制,这意味着我总共可以有 180 个 Pod,每个节点 30 个,Linux 工作规模集上总共有 6 个节点(对吗?)

如果问题不是节点中运行的 Pod 的限制,那么我就会受到资源限制,并且不会设置每个容器可以使用多少资源的阈值。

我准备了这个yaml文件:

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
  namespace: kube-system
spec:
  limits:
  - default:
      cpu: "500m"
    defaultRequest:
      cpu: "250m"
    type: Container
---
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
  namespace: default
spec:
  limits:
  - default:
      cpu: "500m"
    defaultRequest:
      cpu: "250m"
    type: Container

我应用了资源限制,但似乎没有任何变化,如果我描述命名空间,我可以看到限制,但 pod 一直处于挂起状态。

只是为了澄清,因为我认为这很重要。工作人员使用 Azure CNI 网络,该网络限制每个节点 30 个 Pod。

如果有人可以帮助我理解我在这里做错了什么,我将不胜感激,如果您需要更多信息,请随时询问

azure azure-aks
1个回答
0
投票

要解决 CPU 资源不足而挂起 pod 的问题,您可以尝试将 CPU 限制调整为较低的值,并向集群添加更多工作节点。

您可以参考下面的示例并将其与您的设置进行比较。

这里我的集群 navAKSCluster 下有两个节点

系统节点池-

az aks nodepool add \
  --resource-group navrg \
  --cluster-name navAKSCluster \
  --name systempool \
  --node-count 1 \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 2 \
  --node-vm-size Standard_D2ds_v5 \
  --mode System

用户池

az aks nodepool add \
  --resource-group navrg \
  --cluster-name navAKSCluster \
  --name userpool \
  --node-count 1 \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 6 \
  --node-vm-size Standard_D2ds_v5 \
  --mode User

应用的资源限制

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
  namespace: kube-system
spec:
  limits:
  - default:
      cpu: "500m"
    defaultRequest:
      cpu: "250m"
    type: Container
---
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
  namespace: default
spec:
  limits:
  - default:
      cpu: "500m"
    defaultRequest:
      cpu: "250m"
    type: Container

enter image description here

并部署了一个应用程序

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            cpu: "100m"
            memory: "200Mi"
          limits:
            cpu: "500m"
            memory: "500Mi"

enter image description here

现在如果你看到了,如果我看到了

kubectl get pods -n default

enter image description here

kubectl top nodes

enter image description here

如果由于 CPU 限制您仍然面临挂起的 pod 问题,您可以扩展节点池:

kubectl scale deployment nginx --replicas=20 -n default

现在验证

kubectl get pods -n default

enter image description here

您甚至可以设置水平 Pod 自动缩放

kubectl autoscale deployment nginx --cpu-percent=50 --min=10 --max=50 -n default

enter image description here

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.