18.实践篇:Kubernetes的安全三板斧之准入控制器
18.实践篇:Kubernetes的安全三板斧之准入控制器
Admission Controller准入控制器作为把手kubernetes系统安全的最后一道关卡,对已知且有权限用户的操作合规性验证是缺一不可的!
1.What is 准入控制器?
准入控制器(Admission Controller)位于API Server中,在对象被持久化之前,准入控制器拦截对API Server的请求,一般用来做身份验证和授权。
其中包含两个特殊的控制器钩子:
MutatingAdmissionWebhook和ValidatingAdmissionWebhook
1.1.变更(Mutating)准入控制
工作逻辑为修改请求的对象
1.2.验证(Validating)准入控制
工作逻辑为验证请求的对象
以上两类控制器可以分而治之,也能合作运行
2.为什么我们需要它?
就像我在上一章节提到的那样,准入控制器的引入可以很好的帮助我们运维人员,站在一个集群管理者的角度,去“限定”和规划集群资源的合理利用策略和期望状态。
同时,很多kubernetes的高级功能,也是基于准入控制器之上进行建设的。
3.常用的准入控制器
3.1.AlwaysPullImages
总是拉取远端镜像;
好处:可以避免本地系统处于非安全状态时,被别人恶意篡改了本地的容器镜像
3.2.LimitRanger
此准入控制器将确保所有资源请求不会超过namespace级别的LimitRange(定义Pod级别的资源限额,如cpu、mem)
3.3.ResourceQuota
此准入控制器负责集群的计算资源配额,并确保用户不违反命名空间的ResourceQuota对象中列举的任何约束
(定义名称空间级别的配额,如pod数量)
3.4.PodSecurityPolicy
此准入控制器用于创建和修改pod,
并根据请求的安全上下文和可用的Pod安全策略确定是否应该允许它。
4.如何开启准入控制器
在kubernetes环境中,你可以使用kube-apiserver命令结合enable-admission-plugins的flag,后面需要跟上以逗号分割的准入控制器清单,如下所示:
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
5.如何关闭准入控制器
同理,你可以使用flag:disable-admission-plugins,来关闭不想要的准入控制器,如下所示:
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...
6.实战:控制器的使用
6.1.LimitRanger
1) 首先,编辑limitrange-demo.yaml文件,我们定义了一个cpu的准入控制器。
其中定义了默认值、最小值和最大值等。
apiVersion: v1 kind: LimitRange metadata: name: cpu-limit-range namespace: myns spec: limits: - default: #默认上限 cpu: 1000m defaultRequest: cpu: 1000m min: cpu: 500m max: cpu: 2000m maxLimitRequestRatio: #定义最大值是最小值的几倍,当前为4倍 cpu: 4 type: Container
2) apply -f之后,我们可以通过get命令来查看LimitRange的配置详情
[root@centos-1 dingqishi]# kubectl get LimitRange cpu-limit-range -n myns NAME CREATED AT cpu-limit-range 2019-12-10T07:38:29Z [root@centos-1 dingqishi]# kubectl describe LimitRange cpu-limit-range -n myns Name: cpu-limit-range Namespace: myns Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Container cpu 500m 2 1 1 4
6.2.ResourceQuota
1) 同理,编辑配置文件resoucequota-demo.yaml,并apply;
其中,我们定义了myns名称空间下的资源配额。
apiVersion: v1 kind: ResourceQuota metadata: name: quota-example namespace: myns spec: hard: pods: "5" requests.cpu: "1" requests.memory: 1Gi limits.cpu: "2" limits.memory: 2Gi count/deployments.apps: "2" count/deployments.extensions: "2" persistentvolumeclaims: "2"
2) 此时,也可以查看到ResourceQuota的相关配置,是否生效
[root@centos-1 dingqishi]# kubectl get ResourceQuota -n myns NAME CREATED AT quota-example 2019-12-10T08:23:54Z [root@centos-1 dingqishi]# kubectl describe ResourceQuota quota-example -n myns Name: quota-example Namespace: myns Resource Used Hard -------- ---- ---- count/deployments.apps 0 2 count/deployments.extensions 0 2 limits.cpu 0 2 limits.memory 0 2Gi persistentvolumeclaims 0 2 pods 0 5 requests.cpu 0 1 requests.memory 0 1Gi
大家可以将生效后的控制器,结合相关pod自行测试资源配额的申请、限制和使用的情况
@版权声明:51CTO独家出品,未经允许不能转载,否则追究法律责任