【问题标题】:How to choose ingress controller in values.yaml如何在 values.yaml 中选择入口控制器
【发布时间】:2021-03-08 07:29:32
【问题描述】:

上下文

我有一个 k3s (v1.19.3+k3s3) 集群,我正在使用“开箱即用traefik ingress controler

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 }}
...

基于此,我想说我需要编辑values.yamlannotations部分以使用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

但是,无论我在annotations 中尝试什么,helm 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

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-ingress traefik k3s


    【解决方案1】:

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

    chart documentation 我看到了:

    此图表已经过测试,可与 NGINX Ingress、cert-manager、 呜呜呜

    您拥有的 helm 选项是:

    从上面写的所有我有一个问题|命题:你不想switch to NGINX ingress controller in K3s吗?

    准备好您的集群 首要任务是您需要让您的集群没有其他入口控制器,因为这会与您当前的入口控制器冲突。这是因为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 ingress 在 Helm Stable Charts 中可用,如果您已经在 Helm CLI 中安装了 stable 注册表,只需运行 helm install stable/nginx-ingress。

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

    【讨论】:

    • 感谢@Vitalii 的回答。实际上,我现在正在切换到 Nginx(毫无疑问,这更容易)。我的问题更像是一个学术问题(有可能吗?典型图表是否允许这些实现差异? 它们应该吗?如何他们可以吗?)
    【解决方案2】:

    你的想法是正确的,例如在 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 入口部署。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2023-02-09
      • 2015-09-02
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多