自签证书
部署 issuer
创建命名空间
新建一个 secret,存储证书
cd $(mktemp -d)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/CN=issuer.cert-manager.com"
kubectl -n cert-manager create secret tls cert-ca --key ca.key --cert ca.crt --dry-run -o yaml |kubectl apply -f -
Issuer 可以为位于同命名空间的组件签发证书。
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: cert-issuer
namespace: cert-manager
# Issuer 的 spec.ca.secretName 与 Issuer 位于同命名空间
spec:
ca:
secretName: cert-ca
ClusterIssuer 可以为集群中所有命名空间的组件签发证书。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: cert-cluster-issuer
namespace: cert-manager
# ClusterIssuer 的 spec.ca.secretName 需要存在于 cert-manager 组件所在的命名空间
spec:
ca:
secretName: cert-ca-cluster
因此还需要建立证书
cd $(mktemp -d)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/CN=cluster-issuer.cert-manager.com"
kubectl -n operators create secret tls cert-ca-cluster --key ca.key --cert ca.crt --dry-run -o yaml |kubectl apply -f -
创建 Certificate 资源
需要创建对应的 Certificate 资源,示例如下:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
labels:
app: test
name: test-serving-cert
namespace: cert-manager
spec:
## 过期时间 10y
duration: 87600h0m0s
## 轮转时间,过期前 30 天
renewBefore: 720h0m0s
Names:
- test.cert-manager.svc
- test.cert-manager.svc.cluster.local
## 指向的 issuer,位于同命名空间的组件可以使用
## 位于其他命名空间的组件可以使用 cluster issuer
issuerRef:
kind: Issuer
name: cert-issuer
## 签发的证书的存储secret名称
secretName: test-serving-cert
证书引用
Cert-manager 会对 Certificate 资源进行监听,将签发的证书存储在 spec.secretName
指定的 secret 中 ,组件即可将改 secret 进行挂载使用。
WebhookConfiguration 的证书注入
如果组件的 webhook 需要配置证书,Cert-manager 的 CA injector 提供了对 ValidatingWebhookConfiguration、MutatingWebhookConfiguration 资源的证书注入机制。
可以为对应的 ValidatingWebhookConfiguration、MutatingWebhookConfiguration 资源设置 annotation "cert-manager.io/inject-ca-from"
。
Cert-manager 会更新对应资源的 caBundle 配置,将指定 certificate 的 secretName 配置的 ca.crt 信息写入 caBundle。
---
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
annotations:
# cert-manager 会将指定 certificate 的 secretName 配置的 ca.crt
# 更新到 MutatingWebhookConfiguration 的 webhooks.[].clientConfig.caBundle 字段
cert-manager.io/inject-ca-from: cert-manager/test-serving-cert
name: test
证书的自动更新
引用证书的组件自身应该保证证书能够自动更新。
即组件证书向 Cert-manager 迁移方案后,组件证书更新之后,组件本身应该能够发现证书发生变化,进而重新加载新的证书,使用新的证书。
使用 kubebuilder 生成的组件可以自动更新加载证书。