rbac 之准入控制器

发布时间 2023-10-13 06:17:45作者: 烟雨楼台,行云流水

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