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