最新消息:在TwitterMastodon取得專案更新

跨命名空間同步密鑰

跨命名空間的多個元件可能需要使用單一 Certificate 所建立的相同 Secret。 建議的方法是使用擴充功能,例如

為不同命名空間中的 Ingress 資源提供萬用字元憑證 (預設 SSL 憑證)

大多數 Ingress 控制器,包括 ingress-nginxTraefikKong 都支援指定一個單一憑證,用於請求 TLS 但未指定 tls.[].secretName 的 Ingress 資源。這通常被稱為「預設 SSL 憑證」。只要正確設定,任何命名空間中的 Ingress 資源都能使用單一的萬用字元憑證。萬用字元憑證不支援 HTTP01 驗證,需要 DNS01 驗證。

Ingress 程式碼片段範例

apiVersion: networking.k8s.io/v1
kind: 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 命名空間同步到多個命名空間(例如 devstagingprod)。Reflector 將確保任何符合允許條件(支援正規表示式)的命名空間(無論是現有還是新的)都會獲得一份憑證的 Secret,並保持其最新狀態。您也可以使用 reflector 同步其他 Secret(名稱不同)(請參閱擴充功能的 README)。

---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: source
namespace: cert-manager
spec:
secretName: source-tls
commonName: source
issuerRef:
name: source-ca
kind: Issuer
group: cert-manager.io
secretTemplate:
annotations:
reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "dev,staging,prod" # Control destination namespaces
reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true" # Auto create reflection for matching namespaces
reflector.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/v1
kind: Certificate
metadata:
name: source
namespace: cert-manager
spec:
secretName: source-tls
commonName: source
issuerRef:
name: source-ca
kind: Issuer
secretTemplate:
annotations:
replicator.v1.mittwald.de/replication-allowed: "true" # permit replication
replicator.v1.mittwald.de/replication-allowed-namespaces: "dev,test,prod-[0-9]*" # comma separated list of namespaces or regular expressions
---
apiVersion: v1
kind: Secret
metadata:
name: tls-secret-replica
namespace: prod-1
annotations:
replicator.v1.mittwald.de/replicate-from: cert-manager/source-tls
type: 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: ""