首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >K3s Traefik MiddleWare 报错-Failed to create middleware keys

K3s Traefik MiddleWare 报错-Failed to create middleware keys

作者头像
东风微鸣
发布2022-06-14 14:58:53
发布2022-06-14 14:58:53
6710
举报

概述

书接上回:《Rancher 系列文章-K3S 集群升级[1]》, 我们提到:通过一键脚本升级 K3S 集群有报错。

接下来开始进行 Traefik 报错的分析和修复, 问题是:

•所有 Traefik 的 IngressRoute 访问报错 404

问题描述

报错如下:

代码语言:javascript
复制
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[2]

可以配置 allowCrossNamespace 参数,该参数默认为 false, 如果该参数设置为true, IngressRoutes 可以引用其他 NameSpace 中的资源。

基本上断定根因就是这个了。查看 K3s v1.22.5+k3s2 的 Traefik 配置,确实没有这个参数,如下:

代码语言:javascript
复制
...
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[3] 在/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, 内容如下:

代码语言:javascript
复制
---
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 中加入如下配置:

代码语言:javascript
复制
...
    providers:
      kubernetesCRD:
        allowCrossNamespace: true

待其生效后, 确实可以恢复正常, 但是 K3s 会定期将 Manifests 重置为原有配置, 就会导致问题再次出现.

所以问题并没有最终解决.

使用 HelmChartConfig 自定义打包的组件

不过根据官方文档后续的内容, 我们可以通过 使用 HelmChartConfig 自定义打包的组件[4] 的方式覆盖作为 HelmCharts(如 Traefik)部署的打包组件的值.

具体配置如下:

代码语言:javascript
复制
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    globalArguments:
    - "--providers.kubernetescrd.allowcrossnamespace=true"

生效后, 恢复正常, 并且没有发生回滚.

问题解决.

🎉🎉🎉

📚️ 参考文档

•自动部署 manifests 和 Helm charts[5]•使用 HelmChartConfig 自定义打包的组件[6]

References

[1] Rancher 系列文章-K3S 集群升级: https://ewhisper.cn/posts/13493/ [2] Kubernetes IngressRoute & Traefik CRD - Traefik: https://doc.traefik.io/traefik/providers/kubernetes-crd/#allowcrossnamespace [3] 自动部署 manifests 和 Helm charts: https://docs.rancher.cn/docs/k3s/helm/_index/#%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2-manifests-%E5%92%8C-helm-charts [4] 使用 HelmChartConfig 自定义打包的组件: https://docs.rancher.cn/docs/k3s/helm/_index/#%E4%BD%BF%E7%94%A8-helmchartconfig-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%93%E5%8C%85%E7%9A%84%E7%BB%84%E4%BB%B6 [5] 自动部署 manifests 和 Helm charts: https://docs.rancher.cn/docs/k3s/helm/_index/#%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2-manifests-%E5%92%8C-helm-charts [6] 使用 HelmChartConfig 自定义打包的组件: https://docs.rancher.cn/docs/k3s/helm/_index/#%E4%BD%BF%E7%94%A8-helmchartconfig-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%93%E5%8C%85%E7%9A%84%E7%BB%84%E4%BB%B6

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • 问题描述
    • 解决过程
      • 编辑 K3s 的 Manifests Helm 文件
      • 使用 HelmChartConfig 自定义打包的组件
  • 📚️ 参考文档
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档