一、基于命名空间的资源限制

通常情况下,出于稳定性和安全性考虑,应该对每个 Namespace 不受控制的资源进行限制,比如 Pod 和 ReplicaSet,防止异常创建导致集群故障。

1.1 环境准备

创建测试应用

[root@k8s-master01 ]# kubectl create deploy test-01 --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 

验证,观察到已创建成功

[root@k8s-master01 ~]# kgp 
NAME                       READY   STATUS    RESTARTS   AGE
test-01-584fc4ff48-75wnv   1/1     Running   0          31s

1.2 演示不配命名空间限制的危害

1、在 Pod 内设置内核参数

[root@k8s-master01 ]# kubectl edit deploy test-01 
...
...
# 在第46行内容添加如下内容
 46       securityContext: 
 47         sysctls:
 48         - name: net.core.somaxconn
 49           value: "1024"
...
...

2、设置完成后,一直会创建pod,如果不加阻止,会让集群出现卡死现象

[root@k8s-master01 ~]# kgp | grep test-01 | wc -l 
215

3、复原环境

[root@k8s-master01 ]# kubectl edit deploy test-01 
...
...
# 删除如下内容
 46       securityContext: 
 47         sysctls:
 48         - name: net.core.somaxconn
 49           value: "1024"
...
...

删除多余生成的pod

[root@k8s-master01 ~]# k delete po -l app=test-01

[root@k8s-master01 ~]# kgp
NAME                       READY   STATUS    RESTARTS   AGE
test-01-584fc4ff48-b54p7   1/1     Running   0          41s

1.3 演示配命名空间限制

1、给default命名空间添加命名空间限制

[root@k8s-master01 ~]# vim default-resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: default-quota
spec:
  hard:
    count/pods: "100"
    count/replicasets.apps: 200

相关参数说明:

  • count/pods: 限制当前命名空间内的pod总数
  • count/replicasets.apps:限制当前命名空间内 rs的总数

2、应用

[root@k8s-master01 ~]# kaf default-resourcequota.yaml

查看resourcequota

[root@k8s-master01 ~]# kg resourcequota
NAME            AGE     REQUEST                                            LIMIT
default-quota   3m15s   count/pods: 1/100, count/replicasets.apps: 2/200   

3、在 Pod 内设置内核参数

[root@k8s-master01 ]# kubectl edit deploy test-01 
...
...
# 在第46行内容添加如下内容
 46       securityContext: 
 47         sysctls:
 48         - name: net.core.somaxconn
 49           value: "1024"
...
...

4、设置完成后,一直会创建pod,观察到最多只能创建100

[root@k8s-master01 ~]# kg resourcequota
NAME            AGE    REQUEST                                              LIMIT
default-quota   5m3s   count/pods: 100/100, count/replicasets.apps: 2/200   

5、复原环境

[root@k8s-master01 ]# kubectl delete deploy test-01