下面以三个示例介绍LimitRange如何使用:

  • 默认的requests和limits
  • 确定requests和limits的范围
  • 限制申请存储空间的大小

注意:在配置了requests和limits参数时,会以自行配置的为准(如果没有超过LimitRanger的最大、最小限制的话)。如果配置了limits而没有配置requests,那么requests的默认值将被设置成limits配置的参数。

一、默认的requests和limits

1.定义一个yaml文件

[root@k8s-master01 study]# vim limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-limit-range
spec:
  limits:
  - default:
      cpu: 1
      memory: 512Mi
    defaultRequest:
      cpu: 0.5
      memory: 256Mi
    type: Container

#default默认limits配置
#defaultRequest默认requests配置

2.开始创建

[root@k8s-master01 study]# kubectl create ns rq-test
[root@k8s-master01 study]# kubectl create -f limitrange.yaml -n rq-test

3.创建deployment

[root@k8s-master01 study]# kubectl create deploy test-1 --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --replicas=3 -n rq-test

4.查看deployment创建情况

[root@k8s-master01 study]# kubectl get deployment -n rq-test
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
test-1   3/3     3            3           8m11s

5.在线编辑查看resources是否已配置,观察到没有配置

[root@k8s-master01 study]# kubectl edit deployment test-1 -n rq-test
...
...
       name: nginx
        resources: {}

...
...

6.把pod删除,观察是否添加默认参数。观察到已成功添加到默认参数

[root@k8s-master01 study]# kubectl get po -n rq-test
NAME                       READY   STATUS        RESTARTS   AGE

test-1-74795ddfbc-6zxft    1/1     Running       0          12m
test-1-74795ddfbc-hhsnd    1/1     Running       0          12m
test-1-74795ddfbc-ksrn6    1/1     Running       0          12m

[root@k8s-master01 study]# kubectl delete po test-1-74795ddfbc-ksrn6  -n rq-test
pod "test-1-74795ddfbc-ksrn6" deleted
[root@k8s-master01 study]# kubectl get po -n rq-test
NAME                       READY   STATUS        RESTARTS   AGE

test-1-74795ddfbc-6zxft    1/1     Running       0          13m
test-1-74795ddfbc-hhsnd    1/1     Running       0          13m
test-1-74795ddfbc-lxpjh    1/1     Running       0          6s

[root@k8s-master01 study]# kubectl get po test-1-74795ddfbc-lxpjh   -n rq-test -oyaml
...
...
    imagePullPolicy: IfNotPresent
    name: nginx
    resources:
      limits:
        cpu: "1"
        memory: 512Mi
      requests:
        cpu: 500m
        memory: 256Mi
...
...

二、确定requests和limits的范围

1.在上面基础修改yaml文件

[root@k8s-master01 study]# vim limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-limit-range
spec:
  limits:
  - default:
      cpu: 1
      memory: 512Mi
    defaultRequest:
      cpu: 0.5
      memory: 256Mi
    max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: "10m"
      memory: 128Mi
    type: Container

max内存CPU的最大配置
min内存CPU的最小配置

2.重新部署

[root@k8s-master01 study]# kubectl create ns rq-test
[root@k8s-master01 study]# kubectl replace -f limitrange.yaml -n rq-test
limitrange/cpu-mem-limit-range replaced

3.结果验证,观察到参数已经配置完成

[root@k8s-master01 study]# kubectl get limitrange -n rq-test -oyaml
apiVersion: v1
items:
- apiVersion: v1
  kind: LimitRange
  metadata:
    creationTimestamp: "2022-12-11T02:11:12Z"
    name: cpu-mem-limit-range
    namespace: rq-test
    resourceVersion: "31880"
    uid: 3a3f1870-890c-4b67-aaf4-343b49bc6d75
  spec:
    limits:
    - default:
        cpu: "1"
        memory: 512Mi
      defaultRequest:
        cpu: 500m
        memory: 256Mi
      max:
        cpu: "2"
        memory: 1Gi
      min:
        cpu: 10m
        memory: 128Mi
      type: Container
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

4.在线编辑deployment,修改内存以及CPU参数小于最小值

[root@k8s-master01 study]# kubectl edit deploy test-1 -n rq-test
...
...
        resources:
          requests:
            cpu: 1m
            memory: 64 Mi
...
...

5.查看pod状态,观察到没有生成新的pod

[root@k8s-master01 study]# kubectl get po -n rq-test
NAME                       READY   STATUS        RESTARTS   AGE

test-1-74795ddfbc-6zxft    1/1     Running       0          58m
test-1-74795ddfbc-hhsnd    1/1     Running       0          58m
test-1-74795ddfbc-lxpjh    1/1     Running       0          45m

三、限制申请存储空间的大小

1.在上面基础修改yaml文件

[root@k8s-master01 study]# vim limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-mem-limit-range
spec:
  limits:
  - default:
      cpu: 1
      memory: 512Mi
    defaultRequest:
      cpu: 0.5
      memory: 256Mi
    max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: "10m"
      memory: 128Mi
    type: Container
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi

2.重新部署

[root@k8s-master01 study]# kubectl create ns rq-test
[root@k8s-master01 study]# kubectl replace -f limitrange.yaml -n rq-test
limitrange/cpu-mem-limit-range replaced

3.结果验证,观察到参数已经配置完成

[root@k8s-master01 study]# kubectl get limitrange -n rq-test -oyaml
apiVersion: v1
items:
- apiVersion: v1
  kind: LimitRange
  metadata:
    creationTimestamp: "2022-12-11T02:11:12Z"
    name: cpu-mem-limit-range
    namespace: rq-test
    resourceVersion: "34235"
    uid: 3a3f1870-890c-4b67-aaf4-343b49bc6d75
  spec:
    limits:
    - default:
        cpu: "1"
        memory: 512Mi
      defaultRequest:
        cpu: 500m
        memory: 256Mi
      max:
        cpu: "2"
        memory: 1Gi
      min:
        cpu: 10m
        memory: 128Mi
      type: Container
    - max:
        storage: 2Gi
      min:
        storage: 1Gi
      type: PersistentVolumeClaim
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

#max最大PVC的空间
#min最小PVC的空间

4.编写一个yaml文件,用于测试

[root@k8s-master01 study]# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: slow

5.开始创建8G内存进行测试,观察到8G内容太大,报错

[root@k8s-master01 study]# kubectl create -f pvc.yaml -n rq-test
Error from server (Forbidden): error when creating "pvc.yaml": persistentvolumeclaims "myclaim" is forbidden: maximum storage usage per PersistentVolumeClaim is 2Gi, but request is 8Gi

6.修改yaml文件参数为1M,用于测试。观察到请求内存最少为1G,1M太少了,所以报错

[root@k8s-master01 study]# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Mi
  storageClassName: slow

[root@k8s-master01 study]# kubectl create -f pvc.yaml -n rq-test
Error from server (Forbidden): error when creating "pvc.yaml": persistentvolumeclaims "myclaim" is forbidden: minimum storage usage per PersistentVolumeClaim is 1Gi, but request is 1Mi