在 Kubernetes (GKE) 环境中,将应用暴露给外部访问通常依赖 Service 的 LoadBalancer 类型或 Ingress Controller。虽然这两种方式都很成熟,但 Gateway API 作为一种新型的 API 规范,提供了更强大、更灵活的流量管理能力。本文将探讨如何使用 Gateway API 来实现 GKE 的 pods 从外部访问,并分享一些实战经验。
传统方案的痛点
传统的 Service LoadBalancer 方式简单直接,但每个 LoadBalancer 都会创建一个云厂商的负载均衡器,成本较高,且资源利用率较低。Ingress Controller 则依赖 Nginx、Traefik 等反向代理,配置复杂,且难以实现精细化的流量控制。例如,当我们需要根据请求头、Cookie 等信息将流量路由到不同的 Pod 时,Ingress Controller 的配置就会变得非常繁琐。
Gateway API 的优势
Gateway API 通过 GatewayClass、Gateway、HTTPRoute 等资源对象,提供了一种声明式的流量管理方式。它的优势包括:
- 角色分离:基础设施运维人员负责管理 Gateway,应用开发人员负责定义 HTTPRoute,职责更清晰。
- 协议支持:除了 HTTP/HTTPS,Gateway API 还支持 gRPC、TCP 等协议。
- 高级流量管理:支持基于 header、query parameters、path 等多种条件的流量路由、流量镜像、流量分割等高级功能。
- 可扩展性:Gateway API 允许自定义 GatewayClass,方便集成不同的流量管理解决方案。
部署 Gateway API Controller
首先,我们需要在 GKE 集群中部署 Gateway API Controller。这里以 GKE Gateway Controller 为例,它基于 Google Cloud Load Balancer。
# 部署 GKE Gateway Controller
kubectl apply -f https://github.com/GoogleCloudPlatform/gke-gateway-controller/releases/latest/download/gke-gateway.yaml
创建 GatewayClass
GatewayClass 定义了 Gateway 的类型。GKE Gateway Controller 提供了默认的 GatewayClass。
# gatewayclass.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: gke-gateway
spec:
controllerName: cloud.google.com/gateway-controller
kubectl apply -f gatewayclass.yaml
创建 Gateway
Gateway 实例代表一个实际的负载均衡器。我们需要指定 GatewayClass 来创建 Gateway。
# gateway.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: my-gateway
spec:
gatewayClassName: gke-gateway
listeners:
- name: http
protocol: HTTP
port: 80
kubectl apply -f gateway.yaml
创建 Gateway 后,GKE Gateway Controller 会自动创建一个 Google Cloud Load Balancer。可以通过 kubectl describe gateway my-gateway 查看 Load Balancer 的 IP 地址。
创建 HTTPRoute
HTTPRoute 定义了如何将流量路由到后端的 Pod。我们需要指定 Gateway 来关联 HTTPRoute 和 Gateway。
# httproute.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: my-httproute
spec:
parentRefs:
- name: my-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: my-service # 后端 Service 的名称
port: 80
kubectl apply -f httproute.yaml
实战避坑经验
- GatewayClass 选择:GKE Gateway Controller 基于 Google Cloud Load Balancer,性能和稳定性有保障。如果需要更灵活的流量管理能力,可以考虑使用 Istio Gateway 或 Contour 等方案。
- Health Check:确保后端 Service 的 Health Check 配置正确,避免流量路由到不健康的 Pod。
- 监控与日志:配置 Gateway 的监控和日志,方便排查问题。可以使用 Prometheus 和 Grafana 来监控 Gateway 的性能指标,使用 Stackdriver Logging 来查看 Gateway 的日志。
- 版本兼容性:Gateway API 还在快速发展中,要注意版本兼容性问题。建议使用最新的 Gateway API 版本。
通过以上步骤,我们就可以使用 Gateway API 来实现 GKE 的 pods 从外部访问。Gateway API 提供了更强大、更灵活的流量管理能力,是未来 Kubernetes 流量管理的发展方向。在实际项目中,可以根据业务需求选择合适的 GatewayClass 和 HTTPRoute 配置,实现精细化的流量控制。
冠军资讯
代码一只喵