Skip to content

HTTPS 证书 ​

主要内容:全自动 https、识别客户端真实ip、80 强制跳转 443

kubernetes 知识点:体会 注解 的作用。配置中心里有个 密文 类型的东西。traefik 的全局自定义配置。

先要有个 证书的颁发者 ​

安装 cert-manager ​

原文链接: https://cert-manager.io/docs/installation/kubectl/

原文关键步骤:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml

配置 ClusterIssuer ​

申请证书的过程中,有一个步骤要校验域名的所有权,有两种方式,

一种是基于 dns 来校验域名所有权。不过 阿里云 的 dns 未被 letsencrypt 支持。

我们用的方式,在申请证书的过程中,需要 80 端口能被 letsencrypt 的服务器访问,通过 80 端口返回 letsencrypt 预期的数据,来校验域名的所有权。所以在 内网穿透 的配置中,我们把 80 端口也映射了。

yaml
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  annotations: {}
  name: letsencrypt-prod
spec:
  acme:
    email: xxx@qq.com
    privateKeySecretRef:
      name: prod-issuer-account-key
    server: 'https://acme-v02.api.letsencrypt.org/directory'
    solvers:
      - http01:
          ingress:
            class: traefik
        selector: {}

上面的配置中,给颁发者取了名字,叫 letsencrypt-prod, 后面会用到。

然后用上这个 证书的颁发者 ​

配置 ingress 注解 ​

cert-manager.io/cluster-issuer    letsencrypt-prod

配置 ingress 使用证书文件 ​

新建个 TLS Secret(配置中心/密文),只用填名称,内容空白的就行,issuer 会自动往里面填内容。

保存 应用路由 的配置后,应该就能在 Kuboard 界面上看到事件通知,看到 cert-manager 相关的服务开始申请证书了。

踩坑小贴士 ​

  1. 同一个 ingress(应用路由)下,路由规则列表 里有 多个同域子域名,可以公用一个 TLS Secret 对象。但是不要跨 ingress 对象去公用 TLS Secret。
  2. 同一个 ingress(应用路由)下,路由规则列表 里有 多个规则。保存后最好看一眼最终的 yaml 内容(尤其是有删除排在中间的路由规则的时候)。Kuboard 的界面可能有bug,表单界面上看到的路由规则不准,要以 yaml 里的为准。

traefik 的全局自定义配置 ​

配置 80端口 跳转 443 端口

顺带,信任 tcp 代理的转发协议(配合 frp 内网穿透 的 proxyProtocol 配置,让工作负载能获取到客户端真实ip)

yaml
---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    ports:
      web:
        redirectTo:
          port: websecure
        proxyProtocol:
          insecure: true
      websecure:
        proxyProtocol:
          insecure: true

traefik 是 k3s 默认自带的组件,使用 helm 安装的,所以这里是在使用 helm 的配置能力去覆盖可自定义的 valuesContent。我们需要两篇官方文档,

一是 k3s 文档中介绍的,如何 自定义 traefik 安装参数: https://docs.k3s.io/zh/helm#customizing-packaged-components-with-helmchartconfig 。

二是 traefik 的 helm 仓库资料,看有哪些参数可以自定义:https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml 。