说明
- 文章里用的不是集群签发(ClusterIssuer),区别不大(Issuer)
- 提前创建需要https的namespace
- 采用http-01方式生成https证书,所以域名可以填写子域名,但是不能填写泛域名
- 提前把要解析的域名映射解析到集群所在服务器上
- 如果有安全组需要开放80端口,CA机构只能通过80端口验证token(域名是否属于你)
- 可以用项目网关,不用集群网关这样有一个项目专门生成证书,然后复制到其他项目使用(本文用集群网关测试)
- 运行过程中自动产生的ingress和pod,会在证书生成后自动关闭消失。
安装cert-manager
- https://cert-manager.io/docs/installation/kubectl/
创建 Issuer (issuer.yaml)
- class : nginx (会自动创建类型为nginx的ingress,用户CA机构访问域名验证token)
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-staging
#需要https的项目的工作空间
namespace: test-cert
spec:
acme:
#注意不要直接复制官网地址,一个地址用于生成测试证书,浏览器会有警告提示
# https://acme-staging-v02.api.letsencrypt.org/directory
server: https://acme-v02.api.letsencrypt.org/directory
#改为自己的邮箱
email: *******@qq.com
privateKeySecretRef:
# 会在配置文件种
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx
- 两个server地址不同的区别,默认的url生成证书用于测试环境,浏览器访问会有安全警告(可以https方式)
运行Issuer
#创建运行
kubectl apply -f issuer.yaml
#查看状态
kubectl get Issuer -n test-cert
#查看错误信息
kubectl describe Issuer -n test-cert
- 状态为true时代表成功
- 运行成功后工作工作空间下会出现一个Secret类型的配置文件:letsencrypt-staging
开放集群网关或者项目网关80端口(不影响已经有的ingress和nodeport)
- 可以通过其他方式开放istio , geteway api , ingress (本文章只讲述ingress)
- 因为ingress也是以pod方式实现, 又因为kubernetes默认的端口范围:30000-32767,所以ingress端口范围也是这个,所以无法使用80端口
- 修改 /etc/kubernetes/manifests/kube-apiserver.yaml 增加配置 - --service-node-port-range=79-32767
- 修改后不用操作会自动生效(需要等1分钟)
- 因为ingress是以nodeport方式暴露的,所以这时候就可以修改nodeport端口,改为80
- 找到并编辑yaml后点击重新创建
创建Certificate(certificate.yaml)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: test-cert
spec:
#生成后的证书名称 ,可以本项目用,也可以复制到其他地方
secretName: ingress-tls
issuerRef:
# 关联上面的issuer
name: letsencrypt-staging
dnsNames:
#需要证书的域名,可以写多个
- xxx.xxx.cn
运行Certificate
kubectl apply -f certificate.yaml
#查看状态
kubectl get Certificate-n test-cert
#查看错误信息
kubectl describe Certificate-n test-cert
#深层错误原因
kubectl describe CertificateRequest -n test-cert
#深层错误原因
kubectl describe challenges-n test-cert
- 状态为true时代表成功
- 成功后会出现证书文件
- 有证书后就可以随便创建ingress使用
其他
#删除certificate
kubectl delete -f certificate.yaml
#删除issuer
kubectl delete -f issuer.yaml
删除后可以重新创建
如果出现:Waiting for HTTP-01 challenge 异常基本就是端口错误
创建过程中cert-manager会自动创建ingress,存在时间比较短(用完就销毁),如果发生错误就会一直存在