在 Kubernetes 常见的 API 中,Ingress 能够暴露 HTTP 和 HTTPS 服务,并支持负载均衡,路由请求流量到后端 Service。默认情况下,所有 Ingress 对象都能够访问同一条 Ingress Controller 路径。为了更好地控制入站请求,可以通过 Ingress Class 在多个 Ingress Controller 中切换。
一、Ingress Class查询
你可以通过命令来查询可用的 Ingress Class 列表:
kubectl get ingressclass
你会看到输出类似下面这样:
NAME CONTROLLER PARAMETERS AGE
nginx nginx-ingress-controller
69d
traefik traefik-ingress-controller
71d
example custom-ingress-controller api.example.com/metrics 5d
可以看出,名称机制与 K8s 对象命名相一致。在 Ingress Class 中,可以有多个 Class,使用 `NAME` 字段来区分。 `CONTROLLER` 字段表示哪个 Ingress Controller 实例会处理该 Ingress Class。 另外,`PARAMETERS` 就是该 Ingress Controller 支持的参数,例如上面的示例, `custom-ingress-controller` 支持 `api.example.com/metrics` 作为特殊参数。
二、Ingress Class 控制超时时间
在有些情况下,你需要控制所有 Ingress 对象的超时时间,此时,可以使用 Ingress Class 去创建一个默认的 Ingress Class,从而影响所有的 Ingress 类型的超时时间。
在这里,我们举例说明这一过程:
我们需要在全局控制 Ingress 的超时时间,可以通过以下配置完成:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: global-timeout
spec:
controller: example-ingress-class
parameters:
timeout: "30s"
这里我们定义了一个 Ingress Class 来控制所有 Ingress 的超时时间为 30 秒。 `controller` 指定了哪个 Ingress Controller 会处理该 Ingress Class,并且 `parameters` 用于传递自定义参数给 Ingress Controller。
三、Ingress Class 部署
Ingress Class 像大多数 Kubernetes 对象一样,也可以通过 YAML 文件来部署。
下面的例子展示了如何使用 YAML 文件来创建一个 Ingress Class:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: special
spec:
controller: ingress-nginx-controller
parameters:
api-version: "networking.k8s.io/v2beta1"
kind: "Ingress"
name: "nginx-ingress"
在这里,我们指定了 `ingress-nginx-controller` 作为该 Ingress Class 的 Ingress Controller, 并附带了三个参数 `api-version` 表示使用的 Networking API 版本, `kind` 表示使用的对象类型, `name` 表示其他要使用该 Ingress Class 的对象。
四、Ingress Class Name
IngressClass 对象的名称应该标识出 Ingress Class 的用途,以及与之关联的 Ingress Controller。也就是说,名称应该遵循以下格式:
{INGRESS_CONTROLLER_NAME}-{CLASS_NAME}
以下是一些合法的名称示例:
example-ingress-class # Ingress Controller 名称是 example
traefik-traefik # Ingress Controller 名称是 traefik
nginx-internal # Ingress Controller 名称是 nginx
五、Ingress Classes False
在 Kubernetes 1.21 之前,使用 Ingress Object 要求集群必须有一个 Ingress Controller。为了解决这一问题,Kubernetes 引入了 Ingress Classes 概念。通过 Ingress Classes, Ingress 对象可以具有与 Ingress Controller 相关的特殊属性,然后由 Ingress Controller 处理适当的请求。
但是,在某些情况下,Ingress Controller 的选择会失败,也就是从 Ingress Controller 获取响应时出错会导致 Selection 失败,因此 Ingress Controller 将不会使用该 Ingress。如果你希望暂时禁用 Ingress Controller 的选择,可以通过在 Ingress Class 中设置 `ingressclass.kubernetes.io/is-default-class` 标签为 false 实现。
以下是一个示例,标记 IngressClass 为非默认 Ingress Class:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: non-defaultclass
annotations:
ingressclass.kubernetes.io/is-default-class: "false"
spec:
controller: nginx-internal
六、Ingress Controller选取
要选择特定的 Ingress Controller,请在 Ingress Class YAML 中设置 `controller` 字段。这个值是 Ingress Controller 的名称,该名称必须与与那个 Ingress Controller 的使用匹配。
我们可以通过以下命令进行设置:
kubectl apply -f ingress-class.yaml
下面是一个使用 Ingress Controller 的示例:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: example-ingress-class
spec:
controller: ingress-nginx-controller # 设置 Ingress Controller
parameters:
api-version: "networking.k8s.io/v1"
kind: "Ingress"
name: "nginx-ingress"
七、总结
在 Kubernetes 中,IngressClass 可以使用多个 IngressController 来切换连接,默认 IngressController 可以处理所有的 Ingress。一个 Ingress Class 包含一个 controller 和一组参数,用于与之关联的 Ingress 对象。IngressClasses 可以使得应用抽象化更好,更好地组织和扩展应用程序中的不同部分。