Kyverno - Kubernetes 原生策略管理引擎

共 2949字,需浏览 6分钟

 ·

2020-10-15 20:56

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。

参考资料

[1]

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进阶训练营,点击下方图片了解详情


浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报