入口类的入口控制器名称

let*_*ive 5 kubernetes kubernetes-ingress

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

我已经使用设置了 nginx-ingress 控制器

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

根据我的理解,下一步是创建入口类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
Run Code Online (Sandbox Code Playgroud)

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

Pjo*_*erS 7

我已经使用IngressClass,Ingress和运行了多个场景Nginx Ingress Controller

场景一

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

输出:响应 404

场景二

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

输出:响应 404

场景3

  • 带有test名称的IngressClass
  • --ingress-class具有价值的Nginx 入口控制器test
  • Ingresstest在 ingressClassName 中使用

输出:正确响应

场景 4

  • 带有nginx名称的IngressClass
  • --ingress-class具有价值的Nginx 入口控制器nginx
  • Ingressnginx在 ingressClassName 中使用

输出:正确响应

结论

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

在其中一种场景中,当我使用spec.controller: nginx.org/ingress-controllerwithNginx Ingress Controller参数时--ingress-class=nginx,在Nginx Ingress Controllerpod 中您将看到指向k8s.io/ingress-nginx.

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

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: nginx.org/ingress-controller
Run Code Online (Sandbox Code Playgroud)

部署后Nginx Ingress Controller,控制器 pod 将处于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"
Run Code Online (Sandbox Code Playgroud)

仅当IngressClassname 设置为时才有效nginx

我会说这nginx.org/ingress-controller是为了Nginx Incorporatedk8s.io/ingress-nginx为了Open Source Nginx Ingress

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

此外,Ingress工作正常,如果我把的正确值ingress-class要么spec.ingressClass财产或metadata.annotation.kubernetes.io/ingress.class相应。如果您尝试将两个值放入同一个 Ingres 对象,则会出现如下错误:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  ingressClassName: nginx
Run Code Online (Sandbox Code Playgroud)

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进行了测试。如果您想使用IngressClass其他Ingress Controllers类似TraefikAmbasador酒店,你会检查他们的发行说明。


Mon*_*tor 5

您将创建IngressClass作为步骤的一部分Installation with Manifests此处为步骤 2,第 3 部分)。这将创建一个IngressClass看起来像这样的:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
  # annotations:
  #   ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller 
Run Code Online (Sandbox Code Playgroud)

然后,要配置Ingress要由 消耗的资源,只需在规范中nginx指定,如下所示并在下面再次粘贴:ingressClassName: nginxIngress

  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
  . . .
Run Code Online (Sandbox Code Playgroud)

  • 这是在他们的安装配置中预定义的。他们的控制器将寻找具有该名称的 IngressClass (2认同)