K8S 外网免费 HTTPS 使用

我们使用 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: [email protected]
    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

  1. 没找到一个使用泛域名证书的解决方案,只能每个 namespace 下,一个证书多域名 来解决多域名需求的问题。
  2. 内网 HTTPS 证书通过 http01 验证进行申请不可行,因为该验证方式需要用到外网,另一种 dns01 验证的方式,我们域名解析的 dns 服务商不支持。内网目前只能使用 HTTP

参考资料:

  1. Installing cert-manager
  2. Quick-Start using Cert-Manager with NGINX Ingress

你可能感兴趣的:(K8S 外网免费 HTTPS 使用)