在使用 cert-manager申请泛域名证书时,通常会遇到其他命名空间也需要用该证书情况,由于 Secret 不能跨命名空间(Namespace)共享,重复申请触发限额或手动复制太麻烦的问题。
下面使用reflector进行命名空间自动同步
安装 reflector
配置证书复制到其他 namespace
kubectl apply -f https://github.com/emberstack/kubernetes-reflector/releases/latest/download/reflector.yaml -n kube-system
修改 Certificated 文件
使用 kubernetes-reflector 推送模式
将证书的 Secret 从 cert-manager 命名空间同步到多个命名空间(例如 dev、staging、prod)。Reflector 将确保任何与允许条件匹配的命名空间(现有或新的)都将获得证书 Secret 的副本,并将保持最新。您也可以使用 reflector 同步其他 Secret(不同的名称)(请参阅扩展的 README)。
Replicator 支持基于推送和基于拉取的复制。
# certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-sundayhk-com
namespace: cert-manager
spec:
secretName: wildcard-sundayhk-com-tls # 最终签发出来的证书会保存在这个 Secret 里面
issuerRef:
kind: ClusterIssuer
group: cert-manager.io
name: zerossl-production # 引用 ClusterIssuer
commonName: "sundayhk.com"
dnsNames:
- "*.sundayhk.com"
- "sundayhk.com"
secretTemplate:
annotations:
reflector.v1.k8s.emberstack.com/reflection-allowed: "true" # 启用跨命名空间反射(同步)功能。
reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "default,staging,prod-[0-9]*"
reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "dev,staging,prod-[0-9]*"
root@arm-us1:~# kubectl apply -f certificate.yaml
测试结果:
默认wildcard-sundayhk-com-tls Secret在 cert-manager命名空间,现在创建prod-1命名空间,就自动同步过来了
root@arm-us1:~# kubectl create ns prod-1
namespace/prod-1 created
root@arm-us1:~# kubectl get secret -n prod-1
NAME TYPE DATA AGE
wildcard-sundayhk-com-tls kubernetes.io/tls 2 12s
使用 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: ""
https://cert-manager.io/docs/devops-tips/syncing-secrets-across-namespaces/
SundayHK