Gateway API 在 APISIX Ingress 的支持和使用

更新时间 2022-10-27

什么是 Kubernetes Gateway API

Gateway API 是除原生 Service 与 Ingress 之外,社区发起的另一个帮助用户将 Kubernetes 中的服务暴露到集群之外的规范,由 sig-network 管理。

Gateway API 包括了对许多常用网络协议(例如 HTTP、TCP、UDP)以及对 TLS 的支持。此外,Gateway API 包含的 Gateway 资源使得通过 Kubernetes API 来管理代理或网关的生命周期成为可能。

为什么需要 Gateway API

相比于 Ingress,Gateway API 代表了 Ingress 的功能父集。Gateway API 具有如下的改进:

  • 面向角色:Gateway 是由一组 API 资源组成的。不同的 API 资源代表了使用与配置 Kubernetes 网络资源的不同角色。
  • 表现力强:Gateway API 的核心功能就包含诸如基于头的匹配、流量加权以及其他在 Ingress 中只能通过各实现者自定义的非标准化 annotations 等方式实现的功能。
  • 可扩展:Gateway API 允许不同资源在不同层级一同使用。这使得能够对 API 结构进行更精细化的控制。

此外,该标准还包含了可移植性、共享网关与跨命名空间引用等功能。

如图所示,面向角色的设计使得不同团队之间可以可以共享集群内部的网络基础设施,并且共享集群管理员设置的策略与约束。这样,基础设施提供方、集群管理员、应用开发者等不同类型的角色可以只专注于自己的工作内容,而无需关注其他角色负责的部分。

Gateway API model

不同的角色配置不同层级的 Gateway API 资源,不同层级的资源共同作用:

Gateway API roles

Gateway API 目前的状态

随着 Gateway API 被广泛实现 与应用,Gateway API 也发布了 v0.5.0 版本。在该版本中,一些核心的重要 API 首次进入 Beta 阶段,包括:GatewayClass、Gateway、HTTPRoute。

如何在 APISIX Ingress 中使用 Gateway API

APISIX Ingress Controller 对 Gateway API 的支持正在开发中,处于 Alpha 阶段,目前已支持 HTTPRoute、TCPRoute 等资源。

安装 Gateway API CRD

要使用 Gateway API,需要先安装 Gateway API 的 CRD,可通过 APISIX Ingress Controller 仓库下的副本或官方仓库 kubernetes-sigs/gateway-api。此处使用 APISIX Ingress Controller 仓库的 CRD 副本为例。

执行以下命令以安装 Gateway API 的 CRD:

1git pull git@github.com:apache/apisix-ingress-controller.git
2cd apisix-ingress-controller
3
4kubectl apply -f ./samples/deploy/gateway-api/

安装 APISIX Ingress Controller

在 APISIX Ingress Controller 中,默认没有启用 Gateway API 的支持,可通过参数 --enable-gateway-api=true 启用。

在使用 Helm 安装时,可通过配置 values 来启用。

使用如下命令安装 APISIX 与 APISIX Ingress Controller:

1helm repo add apisix https://charts.apiseven.com
2helm repo add bitnami https://charts.bitnami.com/bitnami
3helm repo update
4kubectl create ns apisix-ingress
5
6helm install apisix apisix/apisix --namespace apisix-ingress \
7  --set gateway.type=NodePort \
8  --set ingress-controller.enabled=true \
9  --set ingress-controller.config.apisix.serviceNamespace=apisix-ingress \
10  --set ingress-controller.config.kubernetes.enableGatewayAPI=true

注意其中的参数 --set ingress-controller.config.kubernetes.enableGatewayAPI=true 即是用于开启 Gateway API 支持。

这些命令将在 apisix-ingress 命名空间下创建完整的测试环境,包括 APISIX、etcd 与 APISIX Ingress Controller。

部署测试负载

使用 kennethreitz/httpbin 镜像作为测试负载。

使用如下命中以在默认命名空间下部署这些负载:

1kubectl run httpbin --image kennethreitz/httpbin --port 80
2kubectl expose pod httpbin --port 80

配置 HTTPRoute

目前,APISIX Ingress Controller 支持 v1alpha2 版本的 Gateway API 资源。

在测试时,使用如下 HTTPRoute 配置,将其保存到 httproute.yaml 文件中。

1# httproute.yaml
2apiVersion: gateway.networking.k8s.io/v1alpha2
3kind: HTTPRoute
4metadata:
5  name: basic-http-route
6spec:
7  hostnames:
8  - local.httpbin.org
9  rules:
10  - backendRefs:
11    - name: httpbin
12      port: 80
13    matches:
14    - path:
15        type: PathPrefix
16        value: /

使用如下命令部署该 HTTPRoute 配置:

1kubectl apply -f ./httproute.yaml

验证

可以直接在 APISIX 的 Pod 中进行验证,执行以下命令:

1kubectl -n apisix-ingress exec -it \
2  $(kubectl -n apisix-ingress get Pods -l "app.kubernetes.io/name=apisix" -o name) -c apisix -- \
3  curl -H "Host: local.httpbin.org" localhost:9080/ip

预期输出为:

1{
2  "origin": "127.0.0.1"
3}

这表明我们的配置成功生效。

APISIX Ingress 对 Gateway API 的支持状态

目前,APISIX Ingress Controller 正在对 Gateway API 添加支持,目前已经支持 HTTPRoute、TCPRoute 等资源。

APISIX Ingress Controller 对于 Gateway 与 Gateway Class 的支持正在积极开发中,因此目前这些资源的配置暂时不会生效。

总结

在本文中,我们介绍了 Gateway API 这个社区中全新的将服务暴露到集群之外的规范,并且介绍了如何在 APISIX Ingress Controller 中使用它。

APISIX Ingress Controller 对 Gateway API 的完整支持正在积极开发中。