症状
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"
验证是否已正确应用资源限制
检查 Pod 的 YAML 配置中的资源限制:
kubectl get pods -l app=akshci-telemetry -n kube-system --kubeconfig "./kubeconfig-$cluster_name" -o yaml
在输出中,验证
resources
部分是否包含限制。resources: limits: cpu: 250m memory: 250Mi requests: cpu: 10m memory: 20Mi