安全 (security)

security 类不是一套独立的 kustomize 应用,而是给两个安全相关组件 —— cert-manager 和 kyverno —— 补充的监控与网络策略片段。这两个组件的主体 manifest 实际都放在 infrastructure 类的同名目录下,由各自的 ArgoCD Application 同步。

这个类里有什么

applications/security/ 下只有两份目录,各自只装监控相关的零散 manifest:

  • Name
    cert-manager/servicemonitor.yaml
    Description
    一个 ServiceMonitor,namespace 为 cert-manager,按 app.kubernetes.io/instance: cert-manager 选中 Service,从 tcp-prometheus-servicemonitor 端口的 /metrics 每 30s 抓一次指标。
  • Name
    kyverno/servicemonitor.yaml
    Description
    一个 ServiceMonitor,namespace 为 kyverno,覆盖 admission-controller / background-controller / cleanup-controller / reports-controller 四个组件的 metrics-port,每 30s 抓一次 /metrics
  • Name
    kyverno/networkpolicy-allow-prometheus.yaml
    Description
    NetworkPolicy allow-prometheus-scraping,放行来自 prometheus namespace 的 ingress 到 kyverno pod 的 TCP 8000 端口,让 Prometheus 能抓到上面的指标。

组件

两个组件的完整定义都在 infrastructure 目录,下面是从 manifest 直接核对的事实。

  • Name
    cert-manager
    Description
    集群的 TLS 证书签发器,路径 applications/infrastructure/cert-manager/,由 ArgoCD Application cert-manager(project infrastructure,标签 category: security,sync-wave 1)同步到 cert-manager namespace。控制器镜像 quay.io/jetstack/cert-manager-controller:v1.20.2,含 controller / cainjector / webhook 三个 Deployment,各带 VPA;webhook 有 PodDisruptionBudget。ClusterIssuer letsencrypt-prod 走 ACME(acme-v02.api.letsencrypt.org,邮箱 admin@yldm.tech),同时配置 HTTP-01(IngressClass traefik)和 Cloudflare DNS-01 两种 solver;DNS-01 覆盖 yldm.tech / yldm.ai / dunaifen.games / relaya.pro,其中 *.relaya.pro 通配证书只能靠 DNS-01 签发。Cloudflare API token、letsencrypt 私钥等都走 ExternalSecret 从 Vault 取。
  • Name
    kyverno
    Description
    策略引擎 / 准入控制器,路径 applications/infrastructure/kyverno/,由 ArgoCD Application kyverno(project platform,标签 category: policy,sync-wave 5)同步到 kyverno namespace。镜像 reg.kyverno.io/kyverno/kyverno:v1.18.1(initContainer kyvernopre 同版本),拆成 admission-controller / background-controller / cleanup-controller / reports-controller 四个 Deployment,各自独立 ServiceAccount + Role/RoleBinding。webhook 用到的 TLS 证书对(kyverno-tls-pair / kyverno-tls-ca)通过 ExternalSecret 提供。该 Application 开了 ServerSideApply,并对两份体积巨大的 CRD 单独用 compare-options: ServerSideDiff=false 注解避免 perma-OutOfSync(见仓库 #808)。

cert-manager 与 metallb 自签 issuer

除了对外签发 Let's Encrypt 证书,cert-manager 还给集群内部的 webhook 签自签证书。最典型的就是 metallb 的 validating webhook:它的证书不走 ACME,而是用一个 namespace 级的自签 Issuer。

相关对象都在 applications/networking/metallb/,不在 cert-manager 目录里:

# applications/networking/metallb/issuers-selfsigned.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: selfsigned-issuer
  namespace: metallb-system
spec:
  selfSigned: {}

配套的 certificates-webhook.yaml 用这个 Issuer 给 webhook-server-cert 签一张有效期 1 年、提前 30 天续订的证书,dnsNames 为 webhook-service.metallb-system.svc 及其 .cluster.local 形式。这就是为什么 metallb 的 manifest 相比上游做了定制(--webhook-mode=enabled),它依赖 cert-manager 在场才能起 webhook。

kyverno 的保护策略

kyverno 目前装了两条 ClusterPolicy(applications/infrastructure/kyverno/policies/),都是 validationFailureAction: Enforcebackground: false,作用是阻止误删核心基础设施

ClusterPolicy保护对象拒绝的操作
protect-core-infrastructurekube-system / kube-public / kube-node-lease / default 这几个系统 namespace;kube-system 里的 kube-dns / metrics-server Service 与 coredns / metrics-server Deployment;kube-systemdefault 里的 default ServiceAccountDELETE
protect-kubernetes-servicedefault namespace 里的 kubernetes ServiceDELETE

也就是说,这两条策略只在删除这些关键对象时拦截并报错,对其它资源不做校验。

看 infrastructure 类全貌

评论