# 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 # 使用前:替换 、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=" # 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 # 服务类型