Kyverno · Kubernetes 原生策略引擎

Kyverno 是运行在集群准入层的策略引擎,通过 admission webhook 在资源创建、更新、删除时校验(validate)、变更(mutate)、生成(generate)Kubernetes 对象,并产出策略报告(policy report)。本集群以 Helm chart kyverno-3.5.2 形式部署,拆成四个职责独立的 Deployment:admission-controller(准入处理)、background-controller(后台变更/生成)、cleanup-controller(TTL 清理)、reports-controller(策略报告聚合)。

集群里它承担两类可验证的职责:一是托管两条 ClusterPolicy,阻止误删核心基础设施资源(见下方策略一节);二是承接 cluster/ 目录的 ValidatingAdmissionPolicy 生成(admission-controller 开启了 --generateValidatingAdmissionPolicy=true)。

部署形态

四个 controller 都是单副本 Deployment,统一调度到 workload: infra 节点(按 README 即 k8s-worker3),镜像同为 v1.18.1

  • Name
    命名空间
    Description
    kyverno(独立 namespace,带 ResourceQuota 与 LimitRange)
  • Name
    工作负载
    Description
    4 × Deployment:admission / background / cleanup / reports controller,各 replicas=1
  • Name
    镜像版本
    Description
    reg.kyverno.io/kyverno/kyverno:v1.18.1(admission,含 init 容器 kyvernopre:v1.18.1)、background-controller:v1.18.1、cleanup-controller:v1.18.1、reports-controller:v1.18.1(Helm chart kyverno-3.5.2)
  • Name
    调度
    Description
    nodeSelector workload=infra;每个 controller 配同组件 podAntiAffinity(preferred,topologyKey hostname)
  • Name
    端口
    Description
    webhook/cleanup server 9443 (HTTPS);metrics 8000
  • Name
    安全上下文
    Description
    全部容器 runAsNonRoot、readOnlyRootFilesystem、drop ALL capabilities、seccomp RuntimeDefault、禁止特权升级
  • Name
    资源
    Description
    单容器 requests 100m/128Mi、limits 300m/384Mi(admission)或 300m/128Mi(其余);namespace 配额 pods 20、limits 3 CPU / 4Gi

admission-controller 配 startup/liveness/readiness 三探针(HTTPS /health/* on 9443),cleanup-controller 配 startup/liveness/readiness,background 与 reports controller 无探针。admission 与 reports controller 各挂一个 emptyDir 卷 /.sigstoreTUF_ROOT,用于 image 校验的 sigstore TUF root)。

配置与依赖

两个 ConfigMap 提供运行配置:kyverno(主配置)与 kyverno-metrics(指标暴露配置)。

kyverno ConfigMap 关键项:resourceFilters 列出一大批被准入处理跳过的资源(kube-system / kube-public / kube-node-lease 全部资源、Node、各类 *Review、kyverno 自身的 Deployment/Service/Pod/RBAC 等),webhooks 的 namespaceSelector 排除 kube-systemkyverno 两个命名空间,enableDefaultRegistryMutation: "true" 默认 registry 为 docker.iowebhookAnnotationsadmissions.enforcer/disabled: "true"。该 ConfigMap 带 helm.sh/resource-policy: keep

kyverno-metrics ConfigMap 定义 histogram 桶边界、按指标维度裁剪 label(去掉 resource_namespace / policy_namespace 等高基数维度),namespace include/exclude 均为空。

证书走 ExternalSecret,从 ClusterSecretStore vault-backend 拉取,刷新间隔 1h:

SecretVault remoteRef.key
kyverno-svc.kyverno.svc.kyverno-tls-cakyverno/kyverno-svc.kyverno.svc.kyverno-tls-ca
kyverno-cleanup-controller.kyverno.svc.kyverno-tls-cakyverno/kyverno-cleanup-controller.kyverno.svc.kyverno-tls-ca
kyverno-cleanup-controller.kyverno.svc.kyverno-tls-pairkyverno/kyverno-cleanup-controller.kyverno.svc.kyverno-tls-pair

admission-controller 启动参数引用 --caSecretName=kyverno-svc.kyverno.svc.kyverno-tls-ca--tlsSecretName=kyverno-svc.kyverno.svc.kyverno-tls-pair,cleanup-controller 引用同名的 cleanup TLS 证书。其余关键开关:--autoUpdateWebhooks=true--generateValidatingAdmissionPolicy=true--enablePolicyException=false--protectManagedResources=false--resyncPeriod=15m;reports-controller 开启 --backgroundScan=true(间隔 1h,2 个 worker)、--policyReports=true--validatingAdmissionPolicyReports=true

CRD 集中在 customresourcedefinitions.yaml(约 6MB,包含 Kyverno 全套 CRD),随 chart 一并管理。

策略

policies/ 目录托管两条 ClusterPolicy,均为 validationFailureAction: Enforcebackground: false,作用是在 DELETE 操作上做强制拦截。

  • Name
    protect-core-infrastructure
    Description
    阻止删除系统命名空间(kube-system / kube-public / kube-node-lease / default)、kube-system 内核心 Service(kube-dns / metrics-server)与 Deployment(coredns / metrics-server),以及 kube-system/default 下的 default ServiceAccount。severity critical。
  • Name
    protect-kubernetes-service
    Description
    阻止删除 default 命名空间下的 kubernetes Service。severity critical。

访问与监控

webhook 通过 ClusterIP Service kyverno-svc(443 → targetPort https/9443)暴露给 API server 调用。指标通过 kyverno-svc-metrics(8000)等 metrics Service 暴露。

监控侧的 ServiceMonitor 与 Prometheus 网络策略放在 applications/security/kyverno/(infrastructure 目录只有主体 manifest):

  • Name
    ServiceMonitor
    Description
    name kyverno,按 app.kubernetes.io/instance=kyverno 且 component ∈ {admission / background / cleanup / reports}-controller 选取,抓 metrics-port/metrics,间隔 30s
  • Name
    HPA / VPA / PDB
    Description
    无(manifest 目录未定义)

各 controller 容器以 --otelConfig=prometheus --metricsPort=8000 --disableMetrics=false 暴露指标。

网络策略

kyverno 命名空间默认收紧,infrastructure 目录提供一组 NetworkPolicy:default-deny-ingress 默认拒绝入站;allow-same-namespace 放行命名空间内 Pod 互通;allow-dns-egress 放行到 kube-system 的 53/UDP+TCP;allow-kube-api-access 放行出站到 API server(apiserver Pod 443、ClusterIP 10.43.0.1:443、master 节点网段 192.168.88.0/24:6443);allow-kube-api-webhook 放行入站 webhook 调用(来自全集群 Pod、节点网段、Pod 网段 10.42.0.0/16 的 9443,以及 service 443)。security 目录的 allow-prometheus-scraping 额外放行来自 prometheus 命名空间到 8000 的抓取。

返回 infrastructure 总览

评论