简介
Kubernetes Gateway API 是一组面向 Kubernetes 用户的新网络 API,用于管理和配置负载均衡器、网关和流量路由。作为 Kubernetes 网络资源的现代化替代方案,Gateway API 提供了更灵活、更强大的功能。与现有的 Ingress 资源相比,Gateway API 支持更复杂的流量管理和路由需求。
Gateway API 的核心概念
- GatewayClass: 定义了不同类型的网关实现,可以由不同的供应商或插件提供。
- Gateway: 是流量进入集群的入口点,定义了负载均衡器的行为和配置。
- HTTPRoute: 定义了 HTTP 和 HTTPS 流量的路由规则。
- TLSRoute、TCPRoute 和 UDPRoute: 类似于 HTTPRoute,分别用于定义 TLS、TCP 和 UDP 流量的路由规则。
前置条件
在使用 Gateway API 之前,你需要安装一个负载均衡器实现。我推荐使用 MetalLB 以便 Gateway 资源具有与之关联的地址。同时,确保你的 Kubernetes 版本大于 1.25。
安装 Envoy Gateway
我喜欢直接使用 YAML 文件进行安装:
wget https://github.com/envoyproxy/gateway/releases/download/v1.0.1/install.yaml
修改其中的镜像为国内可以访问的镜像:
kubectl apply -f install.yaml
接着我们需要创建 GatewayClass:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
parametersRef:
group: gateway.envoyproxy.io
kind: EnvoyProxy
name: custom-proxy-config
namespace: envoy-gateway-system
通常情况下,只需要创建如下 GatewayClass 即可:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
但由于国内 Docker Hub 镜像访问困难,我们需要创建一个 EnvoyProxy:
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: custom-proxy-config
namespace: envoy-gateway-system
spec:
provider:
type: Kubernetes
kubernetes:
envoyDeployment:
replicas: 2
container:
image: hub.example.com/envoyproxy/envoy:distroless-v1.29.3
patch:
type: StrategicMerge
value:
spec:
template:
spec:
containers:
- name: shutdown-manager
image: hub.example.com/envoyproxy/gateway-dev:62ff3e7
详细信息可以参考官方文档。
创建示例应用
首先创建 Gateway:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: eg
namespace: test
spec:
gatewayClassName: eg
listeners:
- name: http
protocol: HTTP
port: 80
然后创建 HTTPRoute:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: backend
namespace: test
spec:
parentRefs:
- name: eg
hostnames:
- "www.example.com"
rules:
- backendRefs:
- group: ""
kind: Service
name: backend
port: 3000
weight: 1
matches:
- path:
type: PathPrefix
value: /
接着创建 Service:
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: test
labels:
app: backend
service: backend
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend
最后创建 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: backend
version: v1
template:
metadata:
labels:
app: backend
version: v1
spec:
containers:
- image: gcr.io/k8s-staging-gateway-api/echo-basic:v20231214-v1.0.0-140-gf544a46e
imagePullPolicy: IfNotPresent
name: backend
ports:
- containerPort: 3000
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
从 Ingress 迁移到 Gateway API
如果你不知道如何配置 Gateway API,想快速迁移,可以使用官方的 Ingress2Gateway 工具:
只需执行以下命令即可完成迁移:
ingress2gateway print --input_file=ingress.yaml
最后说几句
虽然 Gateway API 已经发布到 v1.0.1 版本,但如果没有迫切需求,在生产环境中我仍然推荐使用 Ingress。
欢迎关注我的博客www.bboy.app
Have Fun