我们使用 Let's Encrypt 来颁发 HTTPS 证书。原因:1.免费,2.在k8s里可通过 cert-manager 来解决自动续期的问题。
安装cert-manager
在 K8S上,有 cert-manager 来自动更新证书,具体安装方法可参考 参考资料1
。
至于 ClusterIssuer(用来颁发证书),则依据下面 Yaml :
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: timzaak@mail.com
privateKeySecretRef:
name: letsencrypt-prod-issuer-account-key
http01: {}
以上安装结束。
证书制作
这里提供一个 yaml demo
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: xx-test
namespace: backend
spec:
secretName: xx-test-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- "xx.xxx.com"
acme:
config:
- http01:
ingressClass: nginx
domains:
- "xx.xxx.com"
demo 里的字段说明:
metadata.name
, 资源名称,最好起的有意义。
metadata.namespace
, 资源所在的命名空间。
spec.secretName
, 存放证书的Secret名称,可在 Rancher上看到,起的要有意义。
spec.dnsNames
, 要颁发证书的域名,可以是多个,最好一个 namespace 下,就一个 Certificate 配置,把要生成的域名,全放进去。
spec.acme.config.domains
, 要颁发证书的域名, 和spec.dnsNames
保持一致。
spec.acme.config.htp01.ingressClass
, Ingress Controller 类名称,我们外网名称为nginx
以上所说的字段,自己创建的时候,要进行修改,其余字段含义,可去官方查看。
先修改 DNS 解析,让域名 解析到我们的外网 Nginx Controller 上,然后,在命令行里执行 kubectl apply -f ${上面的yaml文件}
在提交 yaml 文件后,使用 kubectl describe certificate -n ${NAMESPACE_NAME}
查看证书状态,其 Status.Conditions.Message
可能会处于 Certificate issuance in progress. Temporary certificate issued
, 这个时候要等1~20分钟,官方在验证生成证书中,如果20分钟还不行,请询问 张朔源。 如果强制使用,chrome 等浏览器会报红:证书不可信。
证书删除
Rancher UI 存在 BUG,无法删除证书,原因是证书由 Certificate 和 Secret 两部分组成,UI界面只能删除 Secret,无法删除Certificate,会出现 Secret 重复出现的问题,需要通过命令行删除。
kubectl delete certificate ${CERTIFICATE_NAME} -n ${NAME_SPACE}
kubectl detele secret ${SECRET_NAME} -n ${NAME_SPACE}
TODO
- 没找到一个使用泛域名证书的解决方案,只能每个 namespace 下,一个证书多域名 来解决多域名需求的问题。
- 内网 HTTPS 证书通过 http01 验证进行申请不可行,因为该验证方式需要用到外网,另一种 dns01 验证的方式,我们域名解析的 dns 服务商不支持。内网目前只能使用 HTTP
网友评论