Ingress路由

Ingress是什么?

Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由,并且可以通过配置不同的控制器来满足不同的需求。

下图展示了 Ingress 是如何运作的:

通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 控制器 负责完成 Ingress 的工作,具体实现上通常会使用某个负载均衡器,不过也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 功能

  • 提供外部可访问的 URL
  • 流量负载均衡
  • SSL/TLS 终止
  • 基于名称的虚拟托管
Ingress 资源示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

Ingress 规则

  • host:可选,指定主机名。
  • paths:路径列表,每个路径关联一个后端服务。
  • backend:定义服务和端口。

默认后端

未匹配任何规则的请求将被路由到默认后端。

路径类型

  • ImplementationSpecific:由 IngressClass 决定匹配方法。
  • Exact:精确匹配 URL 路径。
  • Prefix:基于 URL 路径前缀匹配。

Ingress 类

Ingress 可以由不同的控制器实现,每个 Ingress 应指定一个类(IngressClass),包含额外配置,如控制器名称。

IngressClass 参数

.spec.parameters 字段可引用其他资源以提供相关配置。参数的具体类型取决于 .spec.controller 字段中指定的 Ingress 控制器。

IngressClass 作用域

IngressClass 参数可以是集群作用域或命名空间作用域。

集群作用域

默认情况下,IngressClass 参数是集群范围的。如果未设置 .spec.parameters.scope 或将其设置为 Cluster,则 IngressClass 引用集群范围的资源。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-1
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Cluster ### 集群       
    apiGroup: k8s.example.net
    kind: ClusterIngressParameter
    name: external-config-1

命名空间作用域

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Namespace ### 命名空间
    apiGroup: k8s.example.com
    kind: IngressParameter
    namespace: external-configuration
    name: external-config

默认 Ingress 类

可以将一个 IngressClass 标记为集群默认类。设置 ingressclass.kubernetes.io/is-default-class 注解为 true 确保新的 Ingress 使用默认 IngressClass。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: default-ingress-class
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: example.com/ingress-controller

单个服务支持的 Ingress

单个主机:

根据请求的 HTTP URI,将来自同一 IP 地址的流量路由到多个服务。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-example
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: bar-service
            port:
              number: 80

多个主机:

将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-based-example
spec:
  rules:
  - host: foo.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80
  - host: bar.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bar-service
            port:
              number: 80

TLS

你可以通过设定包含 TLS 私钥和证书的 Secret 来保护 Ingress。TLS 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-example
spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80