K8s使用Cert-Manager签发证书
概念
Issuer/ClusterIssuer 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
Certificate 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。
CertificateRequests 用于从颁发者请求 X.509 证书。该资源包含 PEM 编码证书请求的 base64 编码字符串,该请求被发送到引用的颁发者。根据证书签名请求,成功颁发将返回签名证书。通常该资源由控制器或其它系统使用的管理。
安装
K8S的版本必须高于v1.19.0
。否则请参见其他文章。
方式1
Bash
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.11.0 \
方式2
Bash
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml
查看安装情况:
Bash
kubectl get pods -n cert-manager -w
卸载
Bash
helm uninstall cert-manager -n cert-manager
kubectl delete ns cert-manager
创建 ACME ClusterIssuer
YAML
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
# 你需要在这里替换为你的EMAIL地址
email: user@example.com
privateKeySecretRef:
# 签发机构的私钥存储的Secret名称
name: letsencrypt-account-key
solvers:
# 有多种可选项,见下文
- http01:
ingress:
class: nginx
将文件保存为cluster-issuer.yaml
,然后执行命令
Bash
kubectl apply -f cluster-issuer.yaml
关于solvers的官方手册:
此文在这里使用DNS01
进行验证。所以要将上文的HTTP01
替换为下文:
YAML
- dns01:
cloudflare:
serviceAccountSecretRef:
name: cloudflare-api-token-secret
key: api-token
笔者使用了Cloudflare来托管域名,使用DNS01方式认证必须在Cloudflare上创建域名访问的API Key
。创建API Key
的方法可以点击此处找到。
执行apply后确认状态:
Bash
kubectl get ClusterIssuer
创建 ClusterIssuer Secret
YAML
apiVersion: v1
kind: Secret
metadata:
# 名称必须与上文的serviceAccountSecretRef.name相同
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
data:
# 在这里需要设置你的cloudflare的Token
# 名称必须与上文的serviceAccountSecretRef.key相同
api-token: <API Token>
将文件保存为issuer-secret.yaml
,然后执行命令:
Bash
kubectl apply -f issuer-secret.yaml
执行apply后确认状态:
Bash
kubectl get secret cloudflare-api-token-secret -n cert-manager
配置POD
在你需要使用ingress
的pod中加入以下配置:
YAML
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: example-ssl-cert
hosts:
- example.com
通常情况下,等待一段时间就可以伸成证书,并存储在secretName
指定的Secrets中。