前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kyverno - Kubernetes 原生策略管理引擎

Kyverno - Kubernetes 原生策略管理引擎

作者头像
我是阳明
发布2020-10-26 11:16:29
1.2K0
发布2020-10-26 11:16:29
举报
文章被收录于专栏:k8s技术圈

Kyverno[1] 是一个为 Kubernetes 打造的策略管理引擎:

  • 策略作为 Kubernetes 资源
  • validate、mutate 或者生成任何资源
  • 使用标签选择器和通配符匹配资源
  • 在不同的命名空间中生成和同步默认值
  • 拦截或报告违规行为
  • 使用 kubectl 进行测试

注意:你的 Kubernetes 集群版本必须高于 v1.14,它增加了 webhook 超时。

直接使用下面的命令即可安装 Kyverno:

代码语言:javascript
复制
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 会报告违规行为,但不会阻止请求)。

代码语言:javascript
复制
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: "?*"

创建了上面的策略资源后,我们可以尝试创建一个不带有上面指定标签的应用:

代码语言:javascript
复制
kubectl create deployment nginx --image=nginx

我们会看到如下所示的一些错误提示信息:

代码语言:javascript
复制
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,则可以正常创建,比如下面的资源清单:

代码语言:javascript
复制
kind: "Pod"
apiVersion: "v1"
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: nginx
spec:
  containers:
  - name: "nginx"
    image: "nginx:latest"

因为这个 Pod 符合我们定义的策略规则,所以不会被拦截。

可以通过删除所有的集群策略来进行清理:

代码语言:javascript
复制
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进阶训练营,点击下方图片了解详情

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档