主要内容:全自动 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 端口也映射了。

---
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 相关的服务开始申请证书了。
踩坑小贴士
- 同一个 ingress(应用路由)下,路由规则列表 里有 多个同域子域名,可以公用一个 TLS Secret 对象。但是不要跨 ingress 对象去公用 TLS Secret。
- 同一个 ingress(应用路由)下,路由规则列表 里有 多个规则。保存后最好看一眼最终的 yaml 内容(尤其是有删除排在中间的路由规则的时候)。Kuboard 的界面可能有bug,表单界面上看到的路由规则不准,要以 yaml 里的为准。
traefik 的全局自定义配置
配置 80端口 跳转 443 端口
顺带,信任 tcp 代理的转发协议(配合 frp 内网穿透 的 proxyProtocol 配置,让工作负载能获取到客户端真实ip)

---
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 。