入口的入口控制器名称 class

Ingress controller name for the ingress class

我正在设置入口控制器、入口 class 和入口以在集群外公开服务。这是全新的集群设置。

我已经使用

设置了 nginx-ingress 控制器

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/baremetal/deploy.yaml

根据我的理解,下一步是创建入口 class https://v1-18.docs.kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: external-lb
spec:
  controller: example.com/ingress-controller
  parameters:
    apiGroup: k8s.example.com/v1alpha
    kind: IngressParameters
    name: external-lb

他们是怎么得到控制器的名字的example.com/ingress-controller

您将创建 IngressClass 作为 Installation with Manifests 步骤(第 3 步 here)的一部分。这将创建一个 IngressClass 看起来像:

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  # annotations:
  #   ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller 

然后,要配置 Ingress 资源供 nginx 使用,只需在 Ingress 规范中指定 ingressClassName: nginx,如 here 所示,并再次粘贴在下方:

  apiVersion: networking.k8s.io/v1beta1
  kind: Ingress
  metadata:
    name: cafe-ingress
  spec:
    ingressClassName: nginx
    tls:
    - hosts:
      - cafe.example.com
      secretName: cafe-secret
    rules:
    - host: cafe.example.com
  . . .

我有 运行 多个场景 IngressClassIngressNginx Ingress Controller

场景一

  • 具有自定义名称的 IngressClass
  • Nginx 入口控制器,默认 --ingress-class 值为 nginx
  • Ingress 使用与 IngressClass 名称相同的 ingressClassName

输出:响应 404

场景二

  • 具有自定义名称的 IngressClass
  • 带有自己的ingress-class入口测试的Nginx入口控制器
  • Ingress 使用与 IngressClass 名称相同的 ingressClassName

输出:响应 404

场景三

  • 名称为 test 的 IngressClass
  • Nginx 入口控制器 --ingress-class,值为 test
  • 在 ingressClassName
  • 中使用 test 进入

输出:正确响应

塞纳里奥 4

  • 名称为 nginx 的 IngressClass
  • Nginx 入口控制器 --ingress-class,值为 nginx
  • 在 ingressClassName
  • 中使用 nginx 进入

输出:正确响应

结论

首先,请记住 Nginx 有 3 种类型。 Open Source Nginx Ingress Controller,你可能正在使用它。 Nginx Incorporaton (nginx 公司) 和 Nginx Incorporaton Plus.

在其中一种情况下,当我将 spec.controller: nginx.org/ingress-controllerNginx Ingress Controller 和参数 --ingress-class=nginx 一起使用时,在 Nginx Ingress Controller pod 中,您将看到指向 k8s.io/ingress-nginx.

要重现此行为,您需要使用特定控制器部署 IngressClass,然后部署 nginx。

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: nginx.org/ingress-controller

部署 Nginx Ingress Controller 后,控制器将处于 CrashLoopBackOff 状态。在日志中,您会找到条目:

E1118 15:42:19.008911       8 main.go:134] Invalid IngressClass (Spec.Controller) value "nginx.org/ingress-controller". Should be "k8s.io/ingress-nginx"

仅当IngressClass名称设置为nginx时有效。

我会说 nginx.org/ingress-controller 用于 Nginx Incorporatedk8s.io/ingress-nginx 用于 Open Source Nginx Ingress

如果自定义值用于 controller Deployment manifest 中的 --ingress-class 参数,是否存在具有相同名称的 IngressClass 对象不会产生任何差异,集群如何工作,只要你保持 Ingress spec.ingressClass 值与控制器参数相同。此外,如果存在,IngressClass spec.controller 可以具有与所需模式“类域”相匹配的任何值,并且根本不会影响 Ingress 我集群上的工作流行为。

此外,如果我将 ingress-class 的正确值相应地放入 spec.ingressClass 属性 或 metadata.annotation.kubernetes.io/ingress.class 中,Ingress 工作正常。如果您尝试将两个值都放入同一个 Ingres 对象,它会给出如下错误:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  ingressClassName: nginx

The Ingress "test-ingress" is invalid: annotations.kubernetes.io/ingress.class: Invalid value: "nginx": can not be set when the class field is also set

请记住,它仅针对 Nginx Ingress Controlle. If you would like to use IngressClass with other Ingress Controllers like Traefik or Ambasador 进行了测试,您可以查看他们的发行说明。