本文最后更新于:2024年7月25日 下午
                  
                
              
            
            
              
                
                概述 
书接上回:《Rancher 系列文章 - K3S 集群升级 》, 我们提到:通过一键脚本升级 K3S 集群有报错。
接下来开始进行 Traefik 报错的分析和修复,问题是:
所有 Traefik 的 IngressRoute 访问报错 404 
 
问题描述 
报错如下:
1 time ="2022-05-05T09:51:21Z"  level =error msg ="Failed to create middleware keys: middleware kube-system/hsts-header is not in the IngressRoute namespace cert-manager"  namespace =cert-manager providerName =kubernetescrd ingress =grafana
即无法跨 NameSpace 调用 Traefik MiddleWare.
解决过程 
首先根据官方文档说明:Kubernetes IngressRoute & Traefik CRD - Traefik 
可以配置 allowCrossNamespace 参数,该参数默认为 false, 如果该参数设置为 true, IngressRoutes 可以引用其他 NameSpace 中的资源。
基本上断定根因就是这个了。查看 K3s v1.22.5+k3s2 的 Traefik 配置,确实没有这个参数,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... containers: -  name:  traefik image:  rancher/mirrored-library-traefik:2.5.0 args: -  '--entryPoints.metrics.address=:9100/tcp' -  '--entryPoints.traefik.address=:9000/tcp' -  '--entryPoints.web.address=:8000/tcp' -  '--entryPoints.websecure.address=:8443/tcp' -  '--api.dashboard=true' -  '--ping=true' -  '--metrics.prometheus=true' -  '--metrics.prometheus.entrypoint=metrics' -  '--providers.kubernetescrd' -  '--providers.kubernetesingress' -  >-         --providers.kubernetesingress.ingressendpoint.publishedservice=kube-system/traefik -  '--entrypoints.websecure.http.tls=true' ...       
所以,刚开始就计划通过编辑 Helm 的文件把这个参数加上。
编辑 K3s 的 Manifests Helm 文件 
📚️ Reference :
自动部署 manifests 和 Helm charts /var/lib/rancher/k3s/server/manifests 中找到的任何 Kubernetes 清单将以类似 kubectl apply 的方式自动部署到 K3s。以这种方式部署的 manifests 是作为 AddOn 自定义资源来管理的,可以通过运行 kubectl get addon -A 来查看。你会发现打包组件的 AddOns,如 CoreDNS、Local-Storage、Traefik 等。AddOns 是由部署控制器自动创建的,并根据它们在 manifests 目录下的文件名命名。 
 
该文件位于:/var/lib/rancher/k3s/server/manifests/traefik.yaml, 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 --- apiVersion:  helm.cattle.io/v1 kind:  HelmChart metadata: name:  traefik-crd namespace:  kube-system spec: chart:  https://%{KUBERNETES_API}%/static/charts/traefik-crd-10.3.001.tgz --- apiVersion:  helm.cattle.io/v1 kind:  HelmChart metadata: name:  traefik namespace:  kube-system spec: chart:  https://%{KUBERNETES_API}%/static/charts/traefik-10.3.001.tgz set: global.systemDefaultRegistry:  "" valuesContent:  |-     rbac:       enabled: true     ports:       websecure:         tls:           enabled: true     podAnnotations:       prometheus.io/port: "8082"       prometheus.io/scrape: "true"     providers:       kubernetesIngress:         publishedService:           enabled: true     priorityClassName: "system-cluster-critical"     image:       name: "rancher/mirrored-library-traefik"     tolerations:     - key: "CriticalAddonsOnly"       operator: "Exists"     - key: "node-role.kubernetes.io/control-plane"       operator: "Exists"       effect: "NoSchedule"     - key: "node-role.kubernetes.io/master"       operator: "Exists"       effect: "NoSchedule" 
在上面的 yaml 中加入如下配置:
1 2 3 4 ... providers: kubernetesCRD: allowCrossNamespace:  true 
待其生效后,确实可以恢复正常,但是 K3s 会定期将 Manifests 重置为原有配置,就会导致问题再次出现.
所以问题并没有最终解决.
使用 HelmChartConfig 自定义打包的组件 
不过根据官方文档后续的内容,我们可以通过 使用 HelmChartConfig 自定义打包的组件  的方式覆盖作为 HelmCharts(如 Traefik)部署的打包组件的值.
具体配置如下:
1 2 3 4 5 6 7 8 9 10 apiVersion:  helm.cattle.io/v1 kind:  HelmChartConfig metadata: name:  traefik namespace:  kube-system spec: valuesContent:  |-     globalArguments:     - "--providers.kubernetescrd.allowcrossnamespace=true" 
生效后,恢复正常,并且没有发生回滚.
问题解决.
🎉🎉🎉
📚️ 参考文档