当一个node上有多个服务,每个服务有自己的命名空间,且我们不希望因为一个服务请求过多而饿死其他服务时,可以限制每个命名空间的最大资源持有率
先生成一个命名空间
kubectl create ns rq-test-ns
创建一个限制命名空间资源利用率的约束
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-rq
namespace: rq-test-ns
spec:
hard:
pods: "10"
requests.cpu: "1"
requests.memory: "500Mi"
limits.cpu: "1"
limits.memory: "500Mi"
P.S. 若ResourceQuota中设置了limit,则pod文件中必须包含limit参数
应用
编写在这个命名空间中创建pod的脚本
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-3
namespace: rq-test-ns
spec:
containers:
- name: nginx-pod-1
image: nginx:latest
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "200Mi"
连续在这个命名空间中创建pod,当pod的request.memory总和超过规定的命名空间request.memory时,会报错
$ kubectl apply -f .\podConfig.yml
pod/nginx-pod-1 created
$ kubectl apply -f .\podConfig.yml
pod/nginx-pod-2 created
$ kubectl apply -f .\podConfig.yml
Error from server (Forbidden): error when creating ".\\podConfig.yml": pods "nginx-pod-3" is forbidden: exceeded quota: test-rq, requested: limits.memory=200Mi,requests.memory=200Mi, used: limits.memory=400Mi,requests.memory=400Mi, limited: limits.memory=500Mi,requests.memory=500Mi
可以通过一下命令修改已存在的ResourceQuota
$ kubectl patch resourcequota test-rq -n rq-test-ns --type='json' -p="[{'op': 'replace', 'path': '/spec/hard/requests.memory', 'value': '300Mi'}]"
resourcequota/test-rq patched
然而,修改ResourceQuota并不会导致任何已经创建的Pod被驱逐。一旦Pod被创建,并且其资源请求被ResourceQuota接受,那么即使后续改变了ResourceQuota,该Pod的资源也不会被回收。
网友评论