概述
书接上回:《Rancher 系列文章 -K3S 集群升级》, 我们提到:通过一键脚本升级 K3S 集群有报错。
接下来开始进行 Traefik 报错的分析和修复, 问题是:
- 所有 Traefik 的
IngressRoute
访问报错 404
问题描述
报错如下:
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 ROUTEROS |
即无法跨 NameSpace 调用 Traefik MiddleWare.
解决过程
首先根据官方文档说明:Kubernetes IngressRoute & Traefik CRD - Traefik
可以配置 allowCrossNamespace
参数,该参数默认为 false
, 如果该参数设置为true
, IngressRoutes 可以引用其他 NameSpace 中的资源。
基本上断定根因就是这个了。查看 K3s v1.22.5+k3s2 的 Traefik 配置,确实没有这个参数,如下:
... 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' ... YAML |
所以,刚开始就计划通过编辑 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
, 内容如下:
--- 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 |
在上面的 yaml 中加入如下配置:
... providers: kubernetesCRD: allowCrossNamespace: true YAML |
待其生效后, 确实可以恢复正常, 但是 K3s 会定期将 Manifests 重置为原有配置, 就会导致问题再次出现.
所以问题并没有最终解决.
使用 HelmChartConfig 自定义打包的组件
不过根据官方文档后续的内容, 我们可以通过 使用 HelmChartConfig 自定义打包的组件 的方式覆盖作为 HelmCharts(如 Traefik)部署的打包组件的值.
具体配置如下:
apiVersion: helm.cattle.io/v1 kind: HelmChartConfig metadata: name: traefik namespace: kube-system spec: valuesContent: |- globalArguments: - "--providers.kubernetescrd.allowcrossnamespace=true" YAML |
生效后, 恢复正常, 并且没有发生回滚.
问题解决.
🎉🎉🎉