k8s动态准入控制
准入控制是k8s中用来提供安全控制的一个控制器,而动态控制则是用户定制的安全策略
种类
动态准入控制分为两种,分别为Mutating,Validating
Mutating
Mutating主要为修改性质的,在api调用完成之后k8s会根据ValidatingWebhookConfiguration
中的条件发送给配置的webhook服务,webhook服务根据业务逻辑进行修改,比如说大名鼎鼎的istio的Sidecar注入就是于此
Validating
Validating主要为验证性质的,主要看是不是符合条件集群要求,比方说为了高可用不允许设置副本数为1的类型为deployment的请求
架构
下图所显的是api请求的流程
编写webhook
创建证书
创建证书的的程序很多比较出名的是
openssl
,这里我们使用rancher提供的一个自动生成证书的脚本
1. 将下面的脚本保存为create_self-signed-cert.sh
1 | !/bin/bash -e |
2. 然后执行下面的命令
1 | ./create_self-signed-cert.sh --ssl-domain=admission-example.admission-example.svc.cluster.local --ssl-trusted-domain=admission-example,admission-example.admission-example.svc -ssl-trusted-ip=127.0.0.1 |
3. 会在目录里生成一套证书和秘钥
- .key的为秘钥
- .crt为域名的证书
- csr文件为证书申请文件
- ca开头的为根证书和秘钥
编写yaml文件
编写MutatingWebhookConfiguration和ValidatingWebhookConfiguration
1 | apiVersion: admissionregistration.k8s.io/v1 |
开发webhook
开发上面定义的两个接口validate,mutate
监听的端口和上面配置的端口一直,且使用创建的证书
1 | ... |
实现mutate的部分,我们需要给满足条件的deployment和service添加一个名为
admission-example.naturelr.cc/status": "test"
的注解
这里和使用kubectl操作上很像只不过由代码返回给k8s
1 | func mutate(w http.ResponseWriter, r *http.Request) { |
validate中主要验证service和deployment中标签是否有admission字段如果就没有则拒绝访问
1 | func validate(w http.ResponseWriter, r *http.Request) { |
完整项目在https://github.com/NatureLR/admission-example
测试验证
- 在打了
admission-webhook-example: enabled
标签下的ns中随便创建一个应用会发现被拒绝 - 在给deployment打上了设定的标签之后就可以创建了,且deployment多了一个注解
参考资料
https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/
https://kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-controllers/