跨命名空间同步密钥
跨命名空间的多个组件可能需要使用由单个 证书
创建的相同 密钥
。建议的方法是使用以下扩展:
- 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
为了使目标 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: ""