Kyverno - Kubernetes 原生策略管理引擎
Kyverno[1] 是一个为 Kubernetes 打造的策略管理引擎:
策略作为 Kubernetes 资源 validate、mutate 或者生成任何资源 使用标签选择器和通配符匹配资源 在不同的命名空间中生成和同步默认值 拦截或报告违规行为 使用 kubectl 进行测试
注意:你的 Kubernetes 集群版本必须高于 v1.14,它增加了 webhook 超时。
直接使用下面的命令即可安装 Kyverno:
kubectl create -f [https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml](https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml "https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml")
当然我们也可以使用 Helm Chart 来快速安装 kyverno。
然后添加下面的策略,它包含一个验证规则,要求所有的 pod 都有一个 app.kubernetes.io/name
标签,Kyverno 支持不同的规则类型来 validate、mutate 和生成配置,策略属性 validationFailureAction
被设置为强制执行,以阻止不合规的 API 请求(使用默认值 audit 会报告违规行为,但不会阻止请求)。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: enforce
rules:
- name: check-for-labels
match:
resources:
kinds:
- Pod
validate:
message: "label `app.kubernetes.io/name` is required"
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
创建了上面的策略资源后,我们可以尝试创建一个不带有上面指定标签的应用:
kubectl create deployment nginx --image=nginx
我们会看到如下所示的一些错误提示信息:
Error from server: admission webhook "nirmata.kyverno.resource.validating-webhook" denied the request:
resource Deployment/default/nginx was blocked due to the following policies
require-labels:
autogen-check-for-labels: 'Validation error: label `app.kubernetes.io/name` is required;
Validation rule autogen-check-for-labels failed at path /spec/template/metadata/labels/app.kubernetes.io/name/'
如果我们创建一个带有所需要标签的 Pod,则可以正常创建,比如下面的资源清单:
kind: "Pod"
apiVersion: "v1"
metadata:
name: nginx
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: "nginx"
image: "nginx:latest"
因为这个 Pod 符合我们定义的策略规则,所以不会被拦截。
可以通过删除所有的集群策略来进行清理:
kubectl delete cpol --all
接下来我们可以通过查看策略示例[2]来学习如何编写策略规则[3],此外我们还可以使用 Kyverno CLI[4] 工具来测试定义的策略。
当然在 Kubernetes 社区中还有很多类似的策略管理引擎可以作为 Kyverno 的替代品:
Open Policy Agent:开放策略代理(OPA)[5]是一个通用的策略引擎,可以作为 Kubernetes 准入控制器使用,它支持大量的使用案例,策略使用一种自定义查询语言 Rego[6] 来编写。 K-rail:k-rail[7] 为安全和多租户提供了一些现成的策略,这些策略是用 Golang 编写的,Kyverno 的一些示例策略就是受到了 k-rail 策略的启发。 Polaris:Polaris[8] 验证配置的最佳实践,它包括健康、网络、安全等多个检查,检查可以分配一个 severity(严重性),Dashboard 会报告一个总体分数。
关注微信公众帐号,后台回复
kyverno
获取 kyverno 介绍 PPT。
参考资料
Kyverno: https://kyverno.io/
[2]策略示例: https://github.com/kyverno/kyverno/blob/master/samples/README.md
[3]编写策略规则: https://github.com/kyverno/kyverno/blob/master/documentation/writing-policies.md
[4]Kyverno CLI: https://github.com/kyverno/kyverno/blob/master/documentation/kyverno-cli.md
[5]开放策略代理(OPA): https://www.openpolicyagent.org/
[6]Rego: https://www.openpolicyagent.org/docs/latest/how-do-i-write-policies#what-is-rego
[7]k-rail: https://github.com/cruise-automation/k-rail/
[8]Polaris: https://github.com/reactiveops/polaris
K8S进阶训练营,点击下方图片了解详情