rbac 之准入控制器
ResourceQuota准入控制器
ResourceQuota准入控制器是k8s上内置的准入控制器,默认该控制器是启用的状态,它主要作用是用来限制一个名称空间下的资源的使用,它能防止在一个名称空间下的pod被过多创建时,导致过多占用k8s资源,简单讲它是用来在名称空间级别限制用户的资源使用。
1、限制cpu、内存、pod、deployment数量;
创建resourcequota资源
1 2 | [root@k8s-master pki] # kubectl create ns chenxi namespace /chenxi created |
创建指定名称空间下的资源限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [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 |
创建控制器并查看资源限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | [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 资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | [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 |
限制存储空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [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,对于内存也是同样的逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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 |
查看资源分配情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | [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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏