准入管制

一、什么是K8S之准入管制
就是在创立资源通过身份验证之后,kube-apiserver在数据写入etcd之前做一次拦挡,而后对资源进行更改、判断正确性等操作。

LimitRange,ResourceQuota

目标:能管制特定命名空间中的资源使用量,最终实现集群的偏心应用和老本的管制

  1. LimitRange:为Pod增加默认的计算资源需要和计算资源限度;以及存储资源需要和存储资源限度;
    反对别离在容器和Pod级别进行限度;
    比方:指定名称空间下每个Pod CPU、内存的最低最高额度
  2. ResourceQuota:限度资源数量,限度计算资源总量,存储资源总量;
    比方:指定名称空间下,只容许创立Pod、svc的数量, 所有Pod CPU、内存的最低最高额度
  • 须要实现的性能如下:
    限度运行状态的Pod的计算资源用量
    限度长久存储卷的数量以管制对存储的拜访
    限度负载均衡器的数量以管制老本
    避免滥用网络端口
    提供默认的计算资源Requests以便于零碎做出更优化的调度
  • 一个 LimitRange(限度范畴) 对象提供的限度可能做到:
    在一个命名空间中施行对每个 Pod 或 Container 最小和最大的资源使用量的限度。
    在一个命名空间中施行对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限度。
    在一个命名空间中施行对一种资源的申请值和限度值的比值的管制。
    设置一个命名空间中对计算资源的默认申请/限度值,并且主动的在运行时注入到多个 Container 中。

二、启用 LimitRang
对 LimitRange 的反对自 Kubernetes 1.10 版本默认启用。
LimitRange 反对在很多 Kubernetes 发行版本中也是默认启用的。
LimitRange 的名称必须是非法的 DNS 子域名。

三、限度范畴总览
管理员在一个命名空间内创立一个 LimitRange 对象。
用户在命名空间内创立 Pod ,Container 和 PersistentVolumeClaim 等资源。
LimitRanger 准入控制器对所有没有设置计算资源需要的 Pod 和 Container 设置默认值与限度值, 并跟踪其使用量以保障没有超出命名空间中存在的任意 LimitRange 对象中的最小、最大资源使用量以及使用量比值。
若创立或更新资源(Pod、 Container、PersistentVolumeClaim)违反了 LimitRange 的束缚, 向 API 服务器的申请会失败,并返回 HTTP 状态码 403 FORBIDDEN 与形容哪一项束缚被违反的音讯。
若命名空间中的 LimitRange 启用了对 cpu 和 memory 的限度, 用户必须指定这些值的需要使用量与限度使用量。否则,零碎将会回绝创立 Pod。
LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证

示例1: 创立LimitRange准入控制策略

  • 对Pod、容器、PVC等资源进行限度
[root@k8s-master authfiles]# cat limitrange-demo.yaml apiVersion: v1kind: LimitRangemetadata:  name: core-resource-limits  namespace: dev  #名字空间级别资源 对整个名额空间失效spec:  limits:  - type: Pod  #对Pod限度    max:      cpu: "4"  #CPU最大不能超过4核      memory: "4Gi"  #内存不能超过4G    min:      cpu: "500m"  #CPU最小不能小于500m      memory: "16Mi"  #内存不能小于16M  - type: Container  #对容器作限度    max:      cpu: "4"      memory: "1Gi"    min:      cpu: "100m"      memory: "4Mi"    default:  #上阈值  #如果容器中没有做requests或limits作限度,则附加的默认值      cpu: "2"      memory: "512Mi"    defaultRequest:  #下阈值      cpu: "500m"       memory: "64Mi"    maxLimitRequestRatio:  #最大限度申请比率 上阈值/下阈值 也能够用倍数做限度      cpu: "4"  - type: PersistentVolumeClaim  #对PV做限度    max:      storage: "10Gi"    min:      storage: "1Gi"    default:      storage: "5Gi"    defaultRequest:      storage: "1Gi"    maxLimitRequestRatio:  #没有下阈值 也能够用倍数做限度      storage: "5"
  • 创立LimitRange策略
[root@k8s-master authfiles]# kubectl apply -f limitrange-demo.yaml limitrange/core-resource-limits created[root@k8s-master authfiles]# kubectl get limitrange -n devNAME                   CREATED ATcore-resource-limits   2021-08-25T02:29:04Z[root@k8s-master authfiles]# kubectl get pod -n devNAME                              READY   STATUS    RESTARTS   AGEdeployment-demo-fb544c5d8-4jvgh   1/1     Running   0          16hdeployment-demo-fb544c5d8-7fq8f   1/1     Running   0          16hdeployment-demo-fb544c5d8-hdsz4   1/1     Running   0          16hdeployment-demo-fb544c5d8-qq7mp   1/1     Running   0          16h[root@k8s-master authfiles]# kubectl describe  limitrange core-resource-limits -n devName:                  core-resource-limitsNamespace:             devType                   Resource  Min   Max   Default Request  Default Limit  Max Limit/Request Ratio----                   --------  ---   ---   ---------------  -------------  -----------------------Pod                    cpu       500m  4     -                -              -Pod                    memory    16Mi  4Gi   -                -              -Container              memory    4Mi   1Gi   64Mi             512Mi          -Container              cpu       100m  4     500m             2              4PersistentVolumeClaim  storage   1Gi   10Gi  1Gi              5Gi            5
  • 验证测试策略是否失效
[root@k8s-master authfiles]# kubectl run testpod-$RANDOM --image="ikubernetes/demoapp:v1.0" -n devpod/testpod created[root@k8s-master authfiles]# kubectl get pod -n devNAME            READY   STATUS              RESTARTS   AGEtestpod-1017    1/1     Running             0          93s[root@k8s-master authfiles]# kubectl get pods testpod -n dev -o yaml...spec:  containers:  - image: kubernetes/demoapp:v1.0    imagePullPolicy: IfNotPresent    name: testpod    resources:  #默认值      limits:        cpu: "2"   #最高2核        memory: 512Mi      requests:        cpu: 500m #最低500m        memory: 64Mi
  • 创立小于内存限度的Pod 创立失败
[root@k8s-master authfiles]# kubectl run testpod-$RANDOM  --image="ikubernetes/demoapp:v1.0" -n dev  --limits='cpu=2,memory=1Gi' --requests='cpu=1,memory=8Mi'Error from server (Forbidden): pods "testpod-10340" is forbidden: minimum memory usage per Pod is 16Mi, but request is 8388608

ResourceQuota

  • ResourceQuota资源可限度名称空间中处于非终止状态的所有Pod对象的计算资源需要及计算资源限度总量。
  • cpu或requests.cpu: CPU资源相干申请的总量限额;
  • memory或requests.memory: 内存资源相干申请的总量限额;
  • limits.cpu: CPU资源相干限度的总量限额;
  • limits.memory:内存资源相干限度的总量限额;
  • Rescurcebuota资源还反对为本地名称空间中的PVC存储资源的需要总量和限度总量提供限额,它可能别离从名称空间中的全副PVC、隶属于特定存储类的PVC以及基于本地长期存储的PVC三个类别别离进行定义。
  • requests.storage:所有PVC存储需要的总量限额;空间限度;
  • persistentvolumeclaims:能够创立的PVC总数限额;数量限度;
  • <storage-class-name>.storageclass.storage.k8s.io/requests.storage:特定的存储类上可应用的所有PVC存储需要的总量限额;
  • <storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims:特定的存储类上可应用的PVC总数限额;
  • requests.ephemeral-storage:所有Pod能够应用的本地长期存储资源的requets总量;
  • limits.ephemeral-storage:所有Pod可用的本地长期存储资源的limits总量。

示例2:创立ResourceQuota准入控制策略

[root@k8s-master authfiles]# cat resourcequota-demo.yaml apiVersion: v1kind: ResourceQuotametadata:  name: resourcequota-demo  namespace: devspec:  hard :    pods: "5"  #Pod总量    count/services: "5"  #svc总量    count/configmaps: "5"    count/secrets: "5"    count/cronjobs.batch: "2"    requests.cpu: "2"  #cpu下阈值总量    requests.memory: "4Gi"    limits.cpu: "4"  #cpu上阈值总量    limits.memory: "8Gi"    count/deployments.apps: "2"    count/statefulsets.apps: "2"    persistentvolumeclaims: "6"    requests.storage: "20Gi"    longhorn.storageclass.storage.k8s.io/requests.storage: "20Gi"    longhorn.storageclass.storage.k8s.io/persistentvolumeclaims: "6"[root@k8s-master authfiles]# kubectl apply -f resourcequota-demo.yaml resourcequota/resourcequota-demo created[root@k8s-master authfiles]# kubectl get ResourceQuota -n devNAME                 AGE   REQUEST                                                                                                                                                                                                                                                                                                                                                                                                    LIMITresourcequota-demo   33s   count/configmaps: 0/5, count/cronjobs.batch: 0/2, count/deployments.apps: 0/2, count/secrets: 3/5, count/services: 0/5, count/statefulsets.apps: 0/2, longhorn.storageclass.storage.k8s.io/persistentvolumeclaims: 0/6, longhorn.storageclass.storage.k8s.io/requests.storage: 0/20Gi, persistentvolumeclaims: 0/6, pods: 1/5, requests.cpu: 500m/2, requests.memory: 64Mi/4Gi, requests.storage: 0/20Gi   limits.cpu: 2/4, limits.memory: 512Mi/8Gi
  • 创立不符合标准的Pod 验证测试策略是否失效
[root@k8s-master authfiles]# kubectl describe resourcequota resourcequota-demo -n devName:                                                        resourcequota-demoNamespace:                                                   devResource                                                     Used   Hard--------                                                     ----   ----count/configmaps                                             0      5count/cronjobs.batch                                         0      2count/deployments.apps                                       0      2count/secrets                                                3      5count/services                                               0      5count/statefulsets.apps                                      0      2limits.cpu                                                   2      4limits.memory                                                512Mi  8Gilonghorn.storageclass.storage.k8s.io/persistentvolumeclaims  0      6longhorn.storageclass.storage.k8s.io/requests.storage        0      20Gipersistentvolumeclaims                                       0      6pods                                                         1      5requests.cpu                                                 500m   2requests.memory                                              64Mi   4Girequests.storage                                             0      20Gi[root@k8s-master authfiles]# kubectl run testpod-$RANDOM --image="ikubernetes/demoapp:v1.0" -n devpod/testpod-10678 created[root@k8s-master authfiles]# kubectl describe resourcequota resourcequota-demo -n devName:                                                        resourcequota-demoNamespace:                                                   devResource                                                     Used   Hard--------                                                     ----   ----count/configmaps                                             0      5count/cronjobs.batch                                         0      2count/deployments.apps                                       0      2count/secrets                                                3      5count/services                                               0      5count/statefulsets.apps                                      0      2limits.cpu                                                   4      4   #配额已应用完 无奈在创立Podlimits.memory                                                1Gi    8Gilonghorn.storageclass.storage.k8s.io/persistentvolumeclaims  0      6longhorn.storageclass.storage.k8s.io/requests.storage        0      20Gipersistentvolumeclaims                                       0      6pods                                                         2      5requests.cpu                                                 1      2requests.memory                                              128Mi  4Girequests.storage                                             0      20Gi[root@k8s-master authfiles]# kubectl run testpod-$RANDOM --image="ikubernetes/demoapp:v1.0" -n dev Error from server (Forbidden): pods "testpod-30200" is forbidden: exceeded quota: resourcequota-demo, requested: limits.cpu=2, used: limits.cpu=4, limited: limits.cpu=4#报错 策略已失效