rbac 之准入控制器
ResourceQuota准入控制器
ResourceQuota准入控制器是k8s上内置的准入控制器,默认该控制器是启用的状态,它主要作用是用来限制一个名称空间下的资源的使用,它能防止在一个名称空间下的pod被过多创建时,导致过多占用k8s资源,简单讲它是用来在名称空间级别限制用户的资源使用。
1、限制cpu、内存、pod、deployment数量;
创建resourcequota资源
[root@k8s-master pki]# kubectl create ns chenxi namespace/chenxi created
创建指定名称空间下的资源限制
[root@k8s-master resourcequota]# cat resourcequota-1.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: chenxi-test #名字
namespace: chenxi # 所在的名称空间
spec:
hard: #资源限额设定
pods: "6" #pod 数量限制
limits.cpu: "6" #所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。硬限制
limits.memory: 10Gi #所有非终止状态的 Pod,其内存限额总量不能超过该值。
requests.cpu: "5" #所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。软限制
requests.memory: 6Gi # 所有非终止状态的 Pod,其内存需求总量不能超过该值。
count/deployments.apps: "6" #控制器的数量
persistentvolumeclaims: "6" # 在该命名空间中允许存在的 PVC 的总数上限。 官方参考网址:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/
[root@k8s-master resourcequota]# kubectl apply -f resourcequota-1.yaml
resourcequota/chenxi-test created
创建控制器并查看资源限制
[root@k8s-master resourcequota]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: chenxi
labels:
app: deployment-chenxi
spec:
minReadySeconds: 1 # 创建pod后准备就绪时间
progressDeadlineSeconds: 600 #部署完成之前等待超时时间
# replicas: 5 # pod的副本数量
# replicas: 2 # pod的副本数量,缩容为2个
replicas: 6 # pod的副本数量,由2个扩到4个
# revisionHistoryLimit: 4 # 保留历史版本数量。默认10个版本
selector: # 标签选择器
matchLabels: #
app: chenxi
template: #pod模板定义
metadata:
labels:
app: chenxi
spec:
containers:
- name: myapp
# image: docker.io/janakiramm/myapp:v1 #版本1
image: docker.io/janakiramm/myapp:v2 #版本2
imagePullPolicy: IfNotPresent
ports:
- name: cx
containerPort: 80
resources:
requests:
cpu: 1
memory: 1Gi
limits:
cpu: 2
memory: 2Gi
[root@k8s-master resourcequota]# kubectl get pod -n chenxi
NAME READY STATUS RESTARTS AGE
deployment-85d6b95f56-4v5f5 1/1 Running 0 28s
deployment-85d6b95f56-q888c 1/1 Running 0 31s
deployment-85d6b95f56-wbhx4 1/1 Running 0 5s
[root@k8s-master resourcequota]# kubectl get deployment -n chenxi
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 3/6 3 3 18m
[root@k8s-master resourcequota]# kubectl describe resourcequota -n chenxi
Name: chenxi-test
Namespace: chenxi
Resource Used Hard
-------- ---- ----
count/deployments.apps 1 6
limits.cpu 6 6 #cpu 资源达到限制
limits.memory 6Gi 10Gi
persistentvolumeclaims 0 6
pods 3 6
requests.cpu 3 5
requests.memory 3Gi 6Gi
修改控制的pod 资源
[root@k8s-master resourcequota]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: chenxi
labels:
app: deployment-chenxi
spec:
minReadySeconds: 1 # 创建pod后准备就绪时间
progressDeadlineSeconds: 600 #部署完成之前等待超时时间
# replicas: 5 # pod的副本数量
# replicas: 2 # pod的副本数量,缩容为2个
replicas: 7 # pod的副本数量,由2个扩到4个
revisionHistoryLimit: 4 # 保留历史版本数量。默认10个版本
selector: # 标签选择器
matchLabels: #
app: deployment-chenxi
template: #pod模板定义
metadata:
labels:
app: deployment-chenxi
spec:
containers:
- name: myapp
# image: docker.io/janakiramm/myapp:v1 #版本1
image: docker.io/janakiramm/myapp:v2 #版本2
imagePullPolicy: IfNotPresent
ports:
- name: cx
containerPort: 80
resources:
requests:
cpu: 50m
memory: 500Mi
limits:
cpu: 60m
memory: 1Gi
[root@k8s-master resourcequota]# kubectl get deployment -n chenxi
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 6/7 6 6 45s
[root@k8s-master resourcequota]# kubectl describe resourcequota -n chenxi
Name: chenxi-test
Namespace: chenxi
Resource Used Hard
-------- ---- ----
count/deployments.apps 1 6
limits.cpu 360m 6
limits.memory 6Gi 10Gi
persistentvolumeclaims 0 6
pods 6 6
requests.cpu 300m 5
requests.memory 3000Mi 6Gi
限制存储空间
[root@k8s-master resourcequota]# cat resourcequota-2.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: chenxi-test-2 #名字
namespace: chenxi # 所在的名称空间
spec:
hard: #资源限额设定
pods: "6" #pod 数量限制
limits.cpu: "6" #所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。硬限制
limits.memory: 10Gi #所有非终止状态的 Pod,其内存限额总量不能超过该值。
requests.cpu: "5" #所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。软限制
requests.memory: 6Gi # 所有非终止状态的 Pod,其内存需求总量不能超过该值。
count/deployments.apps: "6" #控制器的数量
persistentvolumeclaims: "6" # 在该命名空间中允许存在的 PVC 的总数上限。 官方参考网址:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/
requests.storage: "5Gi" #所有 PVC,存储资源的需求总量不能超过该值。
limits.ephemeral-storage: "2Gi" # 在命名空间的所有 Pod 中,本地临时存储限制值的总和不能超过此值。
LimitRanger准入控制器
LimitRanger准入控制器是k8s上一个内置的准入控制器,LimitRange是k8s上的一个标准资源,它主要用来定义在某个名称空间下限制pod或pod里的容器对k8s上的cpu和内存资源使用;它能够定义在某个名称空间下创建pod时使用的cpu和内存的上限和下限以及默认cpu、内存的上下限。
如果创建pod时定义了资源上下限,但不满足LimitRange规则中定义的资源上下限,此时LimitRanger就会拒绝创建此pod;如果在LimitRange规则中定义了默认的资源上下限制,创建资源没有指定其资源限制,它默认会使用LimitRange规则中的默认资源限制;同样的逻辑LimitRanger可以限制一个pod使用资源的上下限,它还可以限制pod中的容器的资源上下限,比限制pod更加精准;不管是针对pod还是pod里的容器,它始终只是限制单个pod资源使用。
定义了两个资源,一个创建limit名称空间,一个是在对应limit名称空间下定义了LimitRange资源;其中LimitRange资源的名称为cpu-memory,default字段用来指定默认容器资源上限值;defaultRequest用来指定默认容器资源下限值;min字段用来指定限制用户指定的资源下限不能小于对应资源的值;max是用来限制用户指定资源上限值不能大于该值;maxLimitRequestRatio字段用来指定资源的上限和下限的比值;即上限是下限的多少倍;type是用来描述对应资源限制的级别,该字段有两个值pod和container。
[root@k8s-master resourcequota]# cat limitrange.yaml
apiVersion: v1
kind: Namespace
metadata:
name: limit
---
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory
namespace: limit
spec:
limits:
- default: #默认最大
cpu: 1000m
memory: 1000Mi
defaultRequest: #默认最小
cpu: 500m
memory: 500Mi
min: # 手动指定最小cpu不能小于下面限制
cpu: 500m
memory: 500Mi
max: #手动指定限制不能大于下面限制
cpu: 2000m
memory: 2000Mi
maxLimitRequestRatio: # 手动指定上限与下限之间倍数限制
cpu: 4
memory: 4
type: Container # 限制的资源类型是容器
[root@k8s-master resourcequota]# kubectl apply -f limitrange.yaml
namespace/limit created
limitrange/cpu-memory created
上述资源清单表示在该名称空间下创建pod时,默认不指定其容器的资源限制,就限制对应容器最少要有0.5个核心的cpu和500M的内存;最大为1个核心cpu,1g内存;如果手动定义了容器的资源限制,那么对应资源限制最小不能小于cpu为0.5个核心,内存为500M,最大不能超过cpu为2个核心,内存为2000M;
如果在创建pod时,只指定了容器的资源上限或下限,那么上限最大是下限的的4倍,如果指定cpu上限为2000m那么下限一定不会小于500m,如果只指定了cpu下限为500m那么上限最大不会超过2000m,对于内存也是同样的逻辑。
[root@k8s-master resourcequota]# kubectl apply -f pod.yaml
pod/nginx-pod-demo created
[root@k8s-master resourcequota]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-demo
namespace: limit
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx
查看资源分配情况
[root@k8s-master resourcequota]# kubectl describe pod -n limit nginx-pod-demo
Name: nginx-pod-demo
Namespace: limit
Priority: 0
Service Account: default
Node: k8s-node2/192.168.10.52
Start Time: Fri, 13 Oct 2023 06:09:40 +0800
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 10.244.169.173/32
cni.projectcalico.org/podIPs: 10.244.169.173/32
kubernetes.io/limit-ranger: LimitRanger plugin set: cpu, memory request for container nginx; cpu, memory limit for container nginx
Status: Running
IP: 10.244.169.173
IPs:
IP: 10.244.169.173
Containers:
nginx:
Container ID: containerd://19eeda02ce7c69ae6e9f7e51b96d13ee2aa3008fa836e42e3ebaa1cbbfcde357
Image: nginx
Image ID: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
Port: <none>
Host Port: <none>
State: Running
Started: Fri, 13 Oct 2023 06:09:41 +0800
Ready: True
Restart Count: 0
Limits: 限制
cpu: 1
memory: 1000Mi
Requests: 限制
cpu: 500m
memory: 500Mi
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fd7gr (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-fd7gr:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 53s default-scheduler Successfully assigned limit/nginx-pod-demo to k8s-node2
Normal Pulled 52s kubelet Container image "nginx" already present on machine
Normal Created 52s kubelet Created container nginx
Normal Started 52s kubelet Started container nginx

浙公网安备 33010602011771号