0

语境

我有一个k3s (v1.19.3+k3s3) 集群,我正在使用“开箱即用”的traefik 入口控制器

kubectl  get svc -n kube-system 
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
kube-dns             ClusterIP      10.43.0.10      <none>          53/UDP,53/TCP,9153/TCP       5d16h
metrics-server       ClusterIP      10.43.127.152   <none>          443/TCP                      5d16h
traefik-prometheus   ClusterIP      10.43.73.131    <none>          9100/TCP                     5d16h
traefik              LoadBalancer   10.43.121.125   111.11.11.111   80:32492/TCP,443:31586/TCP   5d16h
kubectl   -n kube-system describe svc traefik
Name:                     traefik
Namespace:                kube-system
Labels:                   app=traefik
                          app.kubernetes.io/managed-by=Helm
                          chart=traefik-1.81.0
                          heritage=Helm
                          release=traefik
Annotations:              meta.helm.sh/release-name: traefik
                          meta.helm.sh/release-namespace: kube-system
Selector:                 app=traefik,release=traefik
Type:                     LoadBalancer
IP:                       10.43.121.125
LoadBalancer Ingress:     111.11.11.111
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  32492/TCP
Endpoints:                10.42.0.6:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  31586/TCP
Endpoints:                10.42.0.6:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

问题

我没有找到如何使用 helm 图表(例如,这个ghost chart)来使用这个入口控制器。根据我对 Helm 图表如何工作以及它们实现的目的的理解,Ingress模板允许使用不同的入口控制器。这是图表的ingress.yaml

...
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "ghost.labels" . | nindent 4 }}
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: {{ $maxSize }}
  {{- with .Values.ingress.annotations }}
    {{- toYaml . | nindent 4 }}
  {{- end }}
...

基于此,我会说我需要编辑annotations部分values.yaml使用 traefik而不是默认值kubernetes.io/ingress.class: nginx

ingress:
  enabled: true
  annotations: 
    kubernetes.io/ingress.class: traefik  # what should I use?
  hosts:
    - host: some.domain.io
      paths:
        - /
  tls:
    - secretName: chart-example-tls
      hosts:
        - some.domain.io

但是,无论我尝试什么annotationshelm install继续获得

Error: UPGRADE FAILED: failed to create resource: Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1beta1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found

就好像 helm 正在寻找一个Nginx 入口控制器,无论如何。这是图表的可能限制(比如这个)还是我误解了 Helm 图表的工作原理?如何traefik ingress在此图表的部署中使用默认值?

4

2 回答 2

1

您的想法是正确的,例如在 Helm 图表中,您应该能够通过注释正确定义入口。

例如https://github.com/stefanprodan/podinfo/blob/master/charts/podinfo/templates/ingress.yaml

它定义了如下注释:

{{- with .Values.ingress.annotations }}
  annotations:
{{ toYaml . | indent 4 }}

您可以应用 traefik 特定的注释,例如

  annotations:
        traefik.ingress.kubernetes.io/router.entrypoints: websecure
        traefik.ingress.kubernetes.io/router.tls.certresolver: myresolver
        traefik.ingress.kubernetes.io/router.middlewares: kube-system-traefik-forward-auth@kubernetescrd

在您的问题的图表中: https ://github.com/groundhog2k/helm-charts/blob/master/charts/ghost/templates/ingress.yaml#L16

注释

nginx.ingress.kubernetes.io/proxy-body-size

是硬编码的。这不应该阻止部署正常工作。您说它看起来像 Helm 正在“寻找” Nginx 入口控制器,这是不正确的,afaik。Helm 没有在寻找任何东西。除了注释中的特定参考之外,我找不到任何 nginx 硬编码的东西,值被注释掉了。 https://github.com/groundhog2k/helm-charts/blob/master/charts/ghost/values.yaml#L60 所以正确的答案是你仍然有一个错误的 nginx 入口部署。

于 2021-02-02T23:55:43.503 回答
1

不,据我所知 - 您无法为这些图表选择准确的入口控制器。Nginx 和 Traefik 都使用相同的端口,因此您必须提前定义适当的入口控制器。

图表文档中我看到:

此图表已经过测试,可与 NGINX Ingress、cert-manager、bla bla 一起使用

您拥有的掌舵选项是: 在此处输入图像描述

从上面写的所有内容中,我有一个问题|建议:您不想在 K3s 中切换到 NGINX 入口控制器吗?

准备好你的集群 首要任务是你需要让你的集群没有其他入口控制器,因为这会与你当前的入口控制器冲突。这是因为NGINX 和 Traefik 都监听 80 和 443,这会导致相互冲突 ,因此请确保您的 K3s 集群只有一种。

为获得最佳结果,您的 K3s 集群必须使用--no-deploy-traefik参数安装,这将导致 K3s 集群仅使用裸容器编排器进行部署,而没有默认的 HTTP 后端,即 Traefik。

为确保您没有安装 Traefik 控制器,请运行kubectl get deployments -n kube-system以查看 Traefik 是否已消失。

如果您已验证 Traefik 不存在,那么您可以继续下一部分。

安装 NGINX 有两种安装 NGINX 的方法,从 Helm 图表或直接 kubectl apply -f

使用 Helm 图表 NGINX 入口在 Helm 稳定图表中可用,如果您已经在 Helm CLI 中安装了稳定注册表,只需运行 helm install stable/nginx-ingress。

您还可以使用此处所述的以下配置修改安装。

于 2020-11-25T13:54:46.613 回答