安全 (security)
security 类不是一套独立的 kustomize 应用,而是给两个安全相关组件 —— cert-manager 和 kyverno —— 补充的监控与网络策略片段。这两个组件的主体 manifest 实际都放在 infrastructure 类的同名目录下,由各自的 ArgoCD Application 同步。
applications/security/cert-manager/ 和 applications/security/kyverno/ 这两个目录里只有 ServiceMonitor(以及 kyverno 的一个 NetworkPolicy),没有 kustomization.yaml,也没有 Deployment。真正的控制器、CRD、ClusterIssuer、RBAC 都在 applications/infrastructure/cert-manager/ 和 applications/infrastructure/kyverno/。下面的事实区分这两处来源。这个类里有什么
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,放行来自prometheusnamespace 的 ingress 到 kyverno pod 的 TCP8000端口,让 Prometheus 能抓到上面的指标。
组件
两个组件的完整定义都在 infrastructure 目录,下面是从 manifest 直接核对的事实。
- Name
- cert-manager
- Description
- 集群的 TLS 证书签发器,路径
applications/infrastructure/cert-manager/,由 ArgoCD Applicationcert-manager(projectinfrastructure,标签category: security,sync-wave 1)同步到cert-managernamespace。控制器镜像quay.io/jetstack/cert-manager-controller:v1.20.2,含 controller / cainjector / webhook 三个 Deployment,各带 VPA;webhook 有 PodDisruptionBudget。ClusterIssuerletsencrypt-prod走 ACME(acme-v02.api.letsencrypt.org,邮箱admin@yldm.tech),同时配置 HTTP-01(IngressClasstraefik)和 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 Applicationkyverno(projectplatform,标签category: policy,sync-wave 5)同步到kyvernonamespace。镜像reg.kyverno.io/kyverno/kyverno:v1.18.1(initContainerkyvernopre同版本),拆成 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)。
category: security,而 kyverno 打的是 category: policy —— 但本页按习惯把这两个安全组件归在 security 类一起讲。它们的 manifest 物理位置都在 applications/infrastructure/ 下。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: Enforce、background: false,作用是阻止误删核心基础设施:
| ClusterPolicy | 保护对象 | 拒绝的操作 |
|---|---|---|
protect-core-infrastructure | kube-system / kube-public / kube-node-lease / default 这几个系统 namespace;kube-system 里的 kube-dns / metrics-server Service 与 coredns / metrics-server Deployment;kube-system 和 default 里的 default ServiceAccount | DELETE |
protect-kubernetes-service | default namespace 里的 kubernetes Service | DELETE |
也就是说,这两条策略只在删除这些关键对象时拦截并报错,对其它资源不做校验。
看 infrastructure 类全貌