Kyverno介绍

Kyverno(希腊语为“治理”)是专为 Kubernetes 设计的策略引擎。它的许多功能中的一些包括:

  • 策略作为 Kubernetes 资源(无需学习新语言!)

  • 验证、变更或生成任何资源

  • 验证软件供应链安全的容器镜像

  • 巡检镜像元数据

  • 使用标签选择器和通配符匹配资源

  • 使用叠加层进行验证和变更(比如 Kustomize!)

  • 跨命名空间同步配置

  • 使用准入控制阻止不符合要求的资源,或报告违反策略的情况

  • 在应用到集群之前,在 CI/CD 管道中使用 Kyverno CLI 测试策略并验证资源

  • 使用 git 和 kustomize 等熟悉的工具像管理代码一样管理策略

Kyverno 允许集群管理员独立于工作负载配置来管理特定于环境的配置,并为其集群实施配置最佳实践。 Kyverno 可用于扫描现有工作负载以使其符合最佳实践,也可用于通过阻止或更改 API 请求来强制执行最佳实践。

Kyverno 如何工作?

Kyverno 在 Kubernetes 集群中作为动态准入控制器运行。 Kyverno 从 kube-apiserver 接收验证和修改准入 webhook HTTP 回调,并应用匹配策略返回执行准入策略或拒绝请求的结果。

Kyverno 策略可以使用资源种类、名称和标签选择器匹配资源。 名称中支持通配符。

变更策略可以编写为overlay(类似于 Kustomize)或 RFC 6902 JSON 补丁。 验证策略还使用 overlay 样式语法,支持模式匹配和条件(if-then-else)处理。

使用 Kubernetes 事件捕获策略执行结果。 Kyverno 还报告现有资源的政策违规行为。

下图显示了 Kyverno 的高级架构:

image.png

Kyverno 的高可用性安装可以运行多个副本, Kyverno 的每个副本将具有多个执行不同功能的控制器。Webhook 处理来自 Kubernetes API Server 的 AdmissionReview 请求,其 Monitor 组件生成和管理所需的配置。PolicyController 监视策略资源并根据配置的扫描间隔启动后台扫描。GenerateController 管理生成的资源的生命周期。

快速开始

本小节将帮助您安装 Kyverno 并创建您的第一个策略。

注意

您的 Kubernetes 集群版本必须高于 v1.14,否则会增加 webhook 超时。 检查兼容性矩阵以确保您的 Kubernetes 版本受支持。 要检查版本,请输入 kubectl version。

您可以选择直接从最新版本清单安装 Kyverno 或使用 Helm。

要使用最新版本清单(可能是预发行版)安装 Kyverno:

kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml

也可以使用 Helm chart 安装 Kyverno:

# 添加 Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/

# 扫描你的 Helm 仓库,以获取最新可用的 chart
helm repo update

# 将 Kyverno Helm char 安装到一个新的叫作 "kyverno" 的命名空间中
helm install kyverno kyverno/kyverno -n kyverno --create-namespace

将以下策略添加到您的集群。 它包含一个验证规则,要求所有 Pod 都有一个 app.kubernetes.io/name 标签。 Kyverno 支持不同的规则类型来验证、变更、生成和验证镜像配置。策略属性 validationFailureAction 设置为强制阻止不合规的 API 请求(使用默认值 audit 将报告违规但不阻止请求。)

kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: enforce
  rules:
  - name: check-for-labels
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "label 'app.kubernetes.io/name' is required"
      pattern:
        metadata:
          labels:
            app.kubernetes.io/name: "?*"
EOF

尝试创建一个没有所需标签的 Deployment:

kubectl create deployment nginx --image=nginx

你会看到如下报错信息:

error: failed to create deployment: admission webhook "validate.kyverno.svc-fail" 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. Rule autogen-check-for-labels failed at path /spec/template/metadata/labels/app.kubernetes.io/name/'

注意

Kyverno 可以配置为排除系统命名空间,如 kube-system 和 kyverno。 确保在用户定义的命名空间或默认命名空间中创建 Deployment。

尽管 ClusterPolicy 在 Pod 上匹配,但 Kyverno 智能地将其应用于所有能够默认生成 Pod 的源,包括上面的 Deployment。

创建一个带有所需标签的 Pod。 例如,使用此命令:

kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx

此 Pod 配置符合策略,未被阻止。

恭喜,您刚刚在 Kubernetes 集群中实施了一项策略!

通过删除所有集群策略进行清理:

kubectl delete cpol --all

你可能感兴趣的:(Kyverno介绍)