Gateway API

Gateway API 是一组 Kubernetes 原生资源,包括 GatewayClass、Gateway、HTTPRoute 等,提供从集群外部到集群内服务的动态路由功能。Gateway API 是 Ingress 的继任者,将替代 Ingress 成为下一代 Kubernetes 路由解决方案。

Gateway API 的设计模型如下:

ui

其中:

  • 基础设施提供商(TensorStack AI 平台)负责创建 GatewayClass 资源;
  • 平台管理员(集群管理员)负责创建 Gateway 资源;
  • 应用开发者(平台 App 开发者、普通用户)负责创建 HTTPRoute 资源。

上述资源的功能分别是:

  • GatewayClass:与 IngressClassStorageClass 类似,GatewayClass 定义了一组共享共同配置和行为的 Gateway,由实现该 GatewayClass 的控制器管理。
  • Gateway:描述了如何将流量翻译到集群内的服务。
  • HTTPRoute:定义了特定协议的规则,用于将流量从 Gateway 映射到 Kubernetes 服务。

查看 GatewayClass

TensorStack AI 平台默认使用 Cilium 作为控制器实现 Gateway API 功能,所创建的 GatewayClass 如下:

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: cilium
spec:
  controllerName: io.cilium/gateway-controller

HTTP 示例

针对 Service 文档中创建的 nginx 服务,如果你想通过 HTTP 协议访问,可创建如下 Gateway 和 HTTPRoute:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: cilium
  listeners:
  - protocol: HTTP
    port: 80
    name: web-gw
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-route-nginx
spec:
  parentRefs:
  - name: my-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /test
    backendRefs:
    - name: nginx-service
      port: 80

其中 my-gateway/test 路径将被转发到 nginx-service 这个 Service。

通过以下命令查看该 Gateway 的 IP 地址为 100.1.2.3

$ kubectl get gateway my-gateway
NAME         CLASS    ADDRESS      PROGRAMMED   AGE
my-gateway   cilium   100.1.2.3    True         13d

因此,可以通过以下命令访问 nginx-service 服务:

curl -G http://100.1.2.3/test

HTTPS 示例

针对 Service 文档中创建的 nginx 服务,如果你想通过 HTTPS 协议访问,可创建如下 Gateway 和 HTTPRoute:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: tls-gateway
spec:
  gatewayClassName: cilium
  listeners:
  - name: https-1
    protocol: HTTPS
    port: 443
    hostname: "example.com"
    tls:
      certificateRefs:
      - kind: Secret
        name: demo-cert
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route-nginx
spec:
  parentRefs:
  - name: tls-gateway
  hostnames:
  - "example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /test
    backendRefs:
    - name: nginx-service
      port: 80

其中:

  • tls-gateway 设置了域名为 example.com,存储证书的 Secret 为 demo-cert,你需要在该 Secret 中存储 example.com 的 TLS 证书;
  • tls-gateway/test 路径将被转发到 nginx-service 这个 Service。

通过以下命令查看该 Gateway 的 IP 地址为 100.1.2.3

$ kubectl get gateway tls-gateway
NAME          CLASS    ADDRESS      PROGRAMMED   AGE
tls-gateway   cilium   100.1.2.3    True         13d

你需要配置 DNS 解析,将域名 example.com 解析到 IP 地址 100.1.2.3。然后可以通过以下命令访问 nginx-service 服务:

curl -G https://example.com/test

下一步