概述
書接上回:《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"
生效后, 恢復正常, 并且沒有發生回滾.
問題解決.
??????
??? 參考檔案
- 自動部署 manifests 和 Helm charts
- 使用 HelmChartConfig 自定義打包的組件
三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術博客 EWhisper.cn 撰寫.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/548228.html
標籤:其他
上一篇:人工智能機器學習底層原理剖析,人造神經元,您一定能看懂,通俗解釋把AI“黑話”轉化為“白話文”
下一篇:一篇用AI生成圖片與內容的文章
