AKS Arc 遥测 Pod 占用过多的内存和 CPU

症状

AKS Arc 群集中的 akshci 遥测 Pod 可能会随时间推移消耗大量 CPU 和内存资源。 如果启用了指标,可以使用以下命令验证 CPU 和内存使用情况 kubectl

kubectl -n kube-system top pod -l app=akshci-telemetry

你可能会看到如下所示的输出:

NAME                              CPU(cores)   MEMORY(bytes)
akshci-telemetry-5df56fd5-rjqk4   996m         152Mi

缓解措施

若要解决此问题,请为命名空间中的 kube-system Pod 设置默认资源限制

重要说明

  • 验证 kube-system 命名空间中是否有任何 Pod 可能需要比默认限制设置更多的内存。 如果是这样,可能需要调整。
  • LimitRange 应用于命名空间;在本例中,命名空间kube-system。 默认资源限制也适用于不指定自己限制的新 Pod。
  • 现有的 Pod(包括那些已经有资源限制的 Pod)不会受到影响。
  • 未指定自身资源限制的新 Pod 将受到下一节中设置的限制的约束。
  • 设置资源限制并删除遥测 Pod 后,新 Pod 最终可能会达到内存限制并生成 OOM (Out-Of-Memory) 错误。 这是暂时缓解措施。

若要继续设置资源限制,可以运行以下脚本。 虽然脚本使用 az aksarc get-credentials,你也可以使用 az connectedk8s proxy 来获取代理 kubeconfig 并访问 Kubernetes 集群。

定义 LimitRange YAML 以设置默认 CPU 和内存限制

# Set the $cluster_name and $resource_group of the aksarc cluster
$cluster_name = ""
$resource_group = ""

# Connect to the aksarc cluster
az aksarc get-credentials -n $cluster_name -g $resource_group --admin -f "./kubeconfig-$cluster_name"

$limitRangeYaml = @'
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-resource-constraint
  namespace: kube-system
spec:
  limits:
  - default: # this section defines default limits for containers that haven't specified any limits
      cpu: 250m
      memory: 250Mi
    defaultRequest: # this section defines default requests for containers that haven't specified any requests
      cpu: 10m
      memory: 20Mi
    type: Container
'@

$limitRangeYaml | kubectl apply --kubeconfig "./kubeconfig-$cluster_name" -f -

kubectl get pods -l app=akshci-telemetry -n kube-system --kubeconfig "./kubeconfig-$cluster_name"
kubectl delete pods -l app=akshci-telemetry -n kube-system --kubeconfig "./kubeconfig-$cluster_name"

sleep 5
kubectl get pods -l app=akshci-telemetry -n kube-system --kubeconfig "./kubeconfig-$cluster_name"

验证是否已正确应用资源限制

  1. 检查 Pod 的 YAML 配置中的资源限制:

    kubectl get pods -l app=akshci-telemetry -n kube-system --kubeconfig "./kubeconfig-$cluster_name" -o yaml
    
  2. 在输出中,验证 resources 部分是否包含限制。

    resources:
      limits:
        cpu: 250m
        memory: 250Mi
      requests:
        cpu: 10m
        memory: 20Mi
    

后续步骤

Azure Arc 启用的 AKS 中的已知问题