简介
cer-manager 是一个证书管理器,可以自动颁发和更新证书来保护ingress
安装
首先下载yaml文件
wget https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml
之后apply这个yaml文件
kubectl apply -f cert-manager.yaml
如果没有特殊情况就安装成功了
NAME READY STATUS RESTARTS AGE
cert-manager-cainjector-78845d8846-426lh 1/1 Running 0 2d18h
cert-manager-webhook-578944d587-l4rnr 1/1 Running 0 2d18h
cert-manager-6945c55d49-cfbbh 1/1 Running 0 2d18h
配置ClusterIssuer
在申请证书之前我们要配置一个ClusterIssuer,ClusterIssuer可以签发所有namespace的证书,但是Issuers只可以签发对应namespace中的证书,为了方便那就直接配置一个ClusterIssuer
cert-manager 有两种验证你的域名是你的域名的方式,分别是dns和http验证,为了方便我就使用了dns的方式,使用dns的方式会给你添加一个txt的解析,目前cert-manager支持以下dns提供商
- ACMEDNS
- Akamai
- AzureDNS
- CloudFlare
- Route53
- DigitalOcean
- RFC2136
我使用的是cloudflare
首先需要创建一个secret去存放你的cloudflare token
cloudflare-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: 您的token
cloudflare的api token需要下面两个权限
- zone read权限
- dns edit权限
之后创建ClusterIssuer
issuer.yaml
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: cert-manager
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
email: [email protected]
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
接着创建证书
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: www.xxx.com
namespace: argocd
spec:
dnsNames:
- www.xxx.com # 要签发证书的域名
issuerRef:
kind: ClusterIssuer
name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验
secretName: xxx-tls # 最终签发出来的证书会保存在这个 Secret 里面
创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xxx-ingress
namespace: xxx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: "www.xxx.cn"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: xxx-server
port:
number: 443
tls:
- hosts:
- www.xxx.cn
secretName: xxx-tls
欢迎关注我的博客www.bboy.app
Have Fun