跳转至

自签证书

部署 issuer

创建命名空间

kubectl create ns cert-manager

新建一个 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 生成的组件可以自动更新加载证书。