最新:在TwitterMastodon

跨命名空间同步密钥

跨命名空间的多个组件可能需要使用由单个 证书 创建的相同 密钥。建议的方法是使用以下扩展:

将通配符证书服务于不同命名空间中的 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

为了使目标 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: ""