84 lines
4.7 KiB
YAML
84 lines
4.7 KiB
YAML
# 03-03 Traefik Dashboard + ACME(唯一清单,推荐)
|
||
# =============================================================================
|
||
# 含:HelmChartConfig(local-path 持久化 /data + ACME Cloudflare DNS-01 + Dashboard)
|
||
# + IngressRoute(/dashboard、/api)
|
||
# acme.json 与 chart persistence 均落在 /data,Pod 重建后证书仍在;nodeSelector 须固定单节点(RWO)
|
||
#
|
||
# 部署:kubectl apply -f ansible/files/traefik-dashboard-acme/traefik-dashboard-acme.yaml
|
||
# 使用前:替换 <YOUR_REAL_EMAIL>、nodeSelector 主机名;Secret cloudflare-api-token 已存在(见 03-02)
|
||
# 全集群只能有一份 HelmChartConfig metadata.name=traefik
|
||
#
|
||
# --- 不要 Dashboard 时 ---
|
||
# 删除文末 IngressRoute 整段;并在 valuesContent 中删掉 ports(可选)、--api.dashboard、--api.insecure
|
||
#
|
||
# --- 临时不用持久化(不推荐)---
|
||
# 将 persistence.enabled 改为 false 并删掉 persistence 下其余字段(证书可能随 Pod 丢失)
|
||
# =============================================================================
|
||
---
|
||
apiVersion: helm.cattle.io/v1 # HelmChartConfig 所在的 API 版本
|
||
kind: HelmChartConfig # HelmChartConfig:给 K3s/Helm 注入 values 的资源
|
||
metadata: # 资源标识信息
|
||
name: traefik # chart 对应的 name(需要与 Traefik chart/约定一致)
|
||
namespace: kube-system # Traefik 通常运行在 kube-system
|
||
spec: # 该资源要注入 chart 的配置
|
||
valuesContent: |- # 以“字符串形式的 YAML”注入到 Helm chart values(由 chart 解析)
|
||
ports: # 暴露 entrypoints 给集群入口
|
||
web: # HTTP entrypoint
|
||
expose: true # 允许暴露 web
|
||
websecure: # HTTPS entrypoint
|
||
expose: true # 允许暴露 websecure
|
||
|
||
persistence: # chart 持久化配置:为 /data 挂载 PVC
|
||
enabled: true # 开启持久卷
|
||
name: data # chart 创建/引用的卷名(PVC 等)
|
||
accessMode: ReadWriteOnce # RWO:同一时间只能在一个节点挂载
|
||
size: 512Mi # 请求容量(local-path 会据此创建本地卷)
|
||
storageClass: local-path # 使用 K3s 的 local-path-provisioner
|
||
path: /data # 容器内挂载目录(与 acme.storage 一致)
|
||
|
||
additionalArguments: # 额外传给 Traefik 的 CLI 参数
|
||
- "--api.dashboard=true" # 打开 dashboard 功能
|
||
- "--api.insecure=true" # (k8s)允许 dashboard 在入口可用(注意安全)
|
||
|
||
- "--log.level=INFO" # 日志级别
|
||
- "--certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,1.0.0.1:53" # DNS 解析器列表(用于 DNS-01)
|
||
- "--certificatesresolvers.cloudflare.acme.email=<YOUR_REAL_EMAIL>" # ACME 注册邮箱
|
||
- "--certificatesresolvers.cloudflare.acme.storage=/data/acme.json" # 证书与账户存储(容器内 /data)
|
||
# - "--certificatesresolvers.cloudflare.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 测试用,上线前删除
|
||
- "--certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare" # DNS-01 provider:cloudflare
|
||
- "--certificatesresolvers.cloudflare.acme.dnschallenge.propagation.delayBeforeChecks=600" # DNS-01 propagation 等待秒数
|
||
|
||
- "--ping=true" # 开启 ping healthcheck
|
||
- "--ping.entryPoint=websecure" # ping 使用 websecure(HTTPS) entrypoint
|
||
|
||
- "--entrypoints.web.proxyProtocol.trustedIPs=192.168.2.0/24" # web entrypoint 信任的代理网段
|
||
- "--entrypoints.websecure.proxyProtocol.trustedIPs=192.168.2.0/24" # websecure entrypoint 信任的代理网段
|
||
|
||
env: # 环境变量注入
|
||
- name: CF_DNS_API_TOKEN # 供 Traefik 使用的 Cloudflare Token 环境变量名
|
||
valueFrom: # 从 Secret 挂载
|
||
secretKeyRef: # Secret 引用方式
|
||
name: cloudflare-api-token # Secret 名
|
||
key: api-token # Secret 内 key
|
||
|
||
nodeSelector: # 将 Traefik Pod 固定到指定节点(避免 local-path RWO 迁移导致丢数据)
|
||
kubernetes.io/hostname: ylc61 # 目标节点主机名
|
||
|
||
---
|
||
# 显式 IngressRoute(与 03-01 一致,确保 /dashboard 可达; Helm ingressRoute.dashboard 在 K3s chart 中未必生效)
|
||
apiVersion: traefik.io/v1alpha1 # IngressRoute API 版本
|
||
kind: IngressRoute # Traefik 路由 CRD
|
||
metadata: # IngressRoute 元信息
|
||
name: traefik-dashboard # 路由名称
|
||
namespace: kube-system # 命名空间
|
||
spec: # IngressRoute 规则
|
||
entryPoints: # 入口点列表
|
||
- web # 使用 web(HTTP) 入口
|
||
routes: # 路由规则列表
|
||
- match: PathPrefix(`/dashboard`) || PathPrefix(`/api`) # 匹配 Dashboard/API 路径前缀
|
||
kind: Rule # 规则类型
|
||
services: # 后端服务
|
||
- name: api@internal # Traefik 内置 API 服务
|
||
kind: TraefikService # 服务类型
|
||
|