跨命名空間同步密鑰
跨命名空間的多個元件可能需要使用單一 Certificate
所建立的相同 Secret
。 建議的方法是使用擴充功能,例如
- reflector,支援自動密鑰反映
- kubernetes-replicator 密鑰複製
為不同命名空間中的 Ingress 資源提供萬用字元憑證 (預設 SSL 憑證)
大多數 Ingress 控制器,包括 ingress-nginx、Traefik 和 Kong 都支援指定一個單一憑證,用於請求 TLS 但未指定 tls.[].secretName
的 Ingress 資源。這通常被稱為「預設 SSL 憑證」。只要正確設定,任何命名空間中的 Ingress 資源都能使用單一的萬用字元憑證。萬用字元憑證不支援 HTTP01 驗證,需要 DNS01 驗證。
Ingress 程式碼片段範例
apiVersion: networking.k8s.io/v1kind: Ingress#[...]spec:rules:- host: service.example.com#[...]tls:- hosts:- service.example.com#secretName omitted to use default wildcard certificate
使用擴充功能跨命名空間同步任意密鑰
為了同步目標 Secret,您可以使用 secretTemplate
欄位,使用特定於擴充功能的註解來註解產生的 Secret(請參閱 CertificateSecretTemplate)。
使用 reflector
以下範例展示如何將憑證的 Secret 從 cert-manager
命名空間同步到多個命名空間(例如 dev
、staging
、prod
)。Reflector 將確保任何符合允許條件(支援正規表示式)的命名空間(無論是現有還是新的)都會獲得一份憑證的 Secret,並保持其最新狀態。您也可以使用 reflector
同步其他 Secret(名稱不同)(請參閱擴充功能的 README)。
---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: sourcenamespace: cert-managerspec:secretName: source-tlscommonName: sourceissuerRef:name: source-cakind: Issuergroup: cert-manager.iosecretTemplate:annotations:reflector.v1.k8s.emberstack.com/reflection-allowed: "true"reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "dev,staging,prod" # Control destination namespacesreflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true" # Auto create reflection for matching namespacesreflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "dev,staging,prod" # Control auto-reflection namespaces
使用 kubernetes-replicator
Replicator 支援推播和拉取式的複製。推播式複製會在建立新的命名空間或 Secret 變更時將 TLS Secret「推播」到命名空間中。拉取式複製可讓您在目標命名空間中建立空的 TLS Secret,並從中選取複製資料的「來源」資源。以下範例說明拉取式方法
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: sourcenamespace: cert-managerspec:secretName: source-tlscommonName: sourceissuerRef:name: source-cakind: IssuersecretTemplate:annotations:replicator.v1.mittwald.de/replication-allowed: "true" # permit replicationreplicator.v1.mittwald.de/replication-allowed-namespaces: "dev,test,prod-[0-9]*" # comma separated list of namespaces or regular expressions---apiVersion: v1kind: Secretmetadata:name: tls-secret-replicanamespace: prod-1annotations:replicator.v1.mittwald.de/replicate-from: cert-manager/source-tlstype: kubernetes.io/tls# Normally, we'd create an empty destination secret, but secrets of type# 'kubernetes.io/tls' are treated in a special way and need to have properties# data["tls.crt"] and data["tls.key"] to begin with, though they may be empty.data:tls.key: ""tls.crt: ""