Rancher 系列文章-K3s Traefik MiddleWare 报错-Failed to create middleware keys

rancher,系列,文章,k3s,traefik,middleware,报错,failed,to,create,keys · 浏览次数 : 99

小编点评

## K3s Traefik 404 报错分析和修复指南 **问题:** 所有 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 ``` **分析:** 1. K3s v1.22.5+k3s2 的 Traefik 配置文件中没有 `allowCrossNamespace` 参数。 2. `allowCrossNamespace` 参数默认值为 `false`,说明 Traefik 不能跨 NameSpace 调用 Traefik MiddleWare。 3. 当使用 HelmChartConfig 自定义打包的组件时, `allowCrossNamespace` 默认值为 `false`。 **解决方案:** 1. 通过编辑 Helm 的配置文件中设置 `allowCrossNamespace` 参数为 `true`。 2. 在 HelmChartConfig 中定义所需的配置项,例如 `providers.kubernetesCRD` 的 `allowCrossNamespace` 参数设置为 `true`。 **示例配置文件:** ```yaml apiVersion: helm.cattle.io/v1kind: HelmChartConfigmetadata: name: traefik namespace: kube-systemspec: valuesContent: |- globalArguments: - "--providers.kubernetescrd.allowcrossnamespace=true" ``` **注意:** 1. 此方法仅适用于使用 HelmChart打包的组件。 2. 在使用 HelmChartConfig 自定义打包之前,请确保已将 `allowCrossNamespace` 参数设置到正确的值。 3. 问题可能会再次出现,因为 K3s 会定期重置 Manifests 配置。请使用 `kubectl apply -f manifests.yaml` 命令强制更新 Manifests 配置。

正文

概述

书接上回:《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

即无法跨 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'
...      

所以,刚开始就计划通过编辑 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 中加入如下配置:

...
    providers:
      kubernetesCRD:
        allowCrossNamespace: true

待其生效后, 确实可以恢复正常, 但是 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"

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

问题解决.

🎉🎉🎉

📚️ 参考文档

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

与Rancher 系列文章-K3s Traefik MiddleWare 报错-Failed to create middleware keys相似的内容:

Rancher 系列文章-K3s Traefik MiddleWare 报错-Failed to create middleware keys

概述 书接上回:《Rancher 系列文章-K3S 集群升级》, 我们提到:通过一键脚本升级 K3S 集群有报错。 接下来开始进行 Traefik 报错的分析和修复, 问题是: 所有 Traefik 的 IngressRoute 访问报错 404 问题描述 报错如下: time="2022-05-0

K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分析与解决

开篇 《K3s 系列文章》 《Rancher 系列文章》 问题概述 20220606 5G IoT 网关设备同时安装 K3S Server, 但是 POD 却无法访问互联网地址,查看 CoreDNS 日志提示如下: ... [ERROR] plugin/errors: 2 update.traefi

Rancher 系列文章-K3S 集群升级

概述 书接上回:《Rancher 系列文章-Rancher 升级》, 我们提到:将 Rancher 用 Helm 从 v2.6.3 升级到 v2.6.4. 接下来开始进行 K3S 集群的升级:将 K3S 集群从 v1.21.7+k3s1 升级到 v1.22.5+k3s2 相关信息 本次升级的 K3S

Rancher 系列文章-在腾讯云的 K3S 上安装高可用 Rancher 集群

开篇 📜 引言: 三人行必有我师焉 知识共享,天下为公 《K3s 系列文章》 《Rancher 系列文章》 方案 在腾讯云的 K3S 上安装 Rancher 方案目标 高可用 3 台 master 的 k3s 集群 高可用模式的 rancher 数据备份 rancher 数据备份到 腾讯云对象存储

K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群

开篇 《K3s 系列文章》 《Rancher 系列文章》 方案 在腾讯云上安装 K3S 后续会在这套 K3S 集群上安装 Rancher 方案目标 高可用 3 台master 的 k3s 集群 数据备份 k3s 数据备份到 腾讯云对象存储 cos 尽量复用公有云的能力 ~~Tencent Cloud

Rancher 系列文章-Rancher 升级

概述 之前在 天翼云上用 4 台机器安装了一个 1 master(及 etcd) 3 node 的 K3S 集群,并在其上使用 Helm 安装了 Rancher 2.6.3 版本。 前几天发现 Rancher 官方推荐的最新版为:v2.6.4 所以决定先后对 Rancher 和 K3S 集群进行升级

大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 📚️Reference: IoT 边缘计算系列文章 Rancher + K3s 简介 Rancher: Kubernetes 统一管理平台, Rancher 是为采用容器的团队提供的一个完整的软件栈。它解决了管理多个 K

Rancher系列文章-Rancher v2.6使用脚本实现导入集群

概述 最近在玩 Rancher, 先从最基本的功能玩起, 目前有几个已经搭建好的 K8S 集群, 需要批量导入, 发现官网已经有批量导入的文档了. 根据 Rancher v2.6 进行验证微调后总结经验. 1. Rancher UI 获取创建集群参数 访问Rancher_URL/v3/cluster

Rancher 系列文章-Rancher 对接 Active Directory 实战

概述 只要是个公司,基本上都有邮箱和 AD(Active Directory). 在 AD 里,已经有了: 用户 账号密码 邮箱 用户组 组织架构 所以对于一些仅限于本公司一定范围内人员使用的管理或后台或运营运维类系统,其实是非常适合对接 AD 来进行认证、分组,以及根据分组来进行权限分配的。 对于

Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher

一 基础信息 1.1 前提 本次安装的为 20220129 最新版:Rancher v2.6.3 VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求) VM YUM 仓库:已配置对应版本的 RHEL 和 EPEL YUM 仓库 VM 提供 root 权