我希望有人能够对这个问题以及如何解决它有所帮助。
我有一个在 FRee Tier 上运行的 Azure kubernetes 服务,具有 2 个工作节点:
我总共发布了大约 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。
如果有人可以帮助我理解我在这里做错了什么,我将不胜感激,如果您需要更多信息,请随时询问
要解决 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
并部署了一个应用程序
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"
现在如果你看到了,如果我看到了
kubectl get pods -n default
或
kubectl top nodes
如果由于 CPU 限制您仍然面临挂起的 pod 问题,您可以扩展节点池:
kubectl scale deployment nginx --replicas=20 -n default
现在验证
kubectl get pods -n default
您甚至可以设置水平 Pod 自动缩放
kubectl autoscale deployment nginx --cpu-percent=50 --min=10 --max=50 -n default
参考资料: