部署一个简单的 Gateway
原文:https://gateway-api.sigs.k8s.io/guides/getting-started/simple-gateway/
本文会带你部署一个最小的 Gateway API 配置。在跟着操作之前,请先确认你已经按照 Gateway API 入门 的说明,安装好了 Gateway API 的 CRD 和一个 Gateway 控制器(Gateway controller)。
本指南中所有命令、清单都假设你运行的是 Gateway API v1.0 或更高版本。注意:v1.0 之前的版本使用 gateway.networking.k8s.io/v1beta1,与本文示例不完全兼容。
1. 创建一个 Gateway 资源
最小化的 Gateway 资源只需要 metadata.name 和一个用于描述网关类型的 spec.gatewayClassName 字段。在本示例中,我们将网关绑定到端口 80 上,但没有附加任何路由——路由会在后面通过 HTTPRoute 资源加入。
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: my-gateway
spec:
gatewayClassName: my-gateway-class
listeners: # Use a different listener configuration for TLS
- name: http
port: 80
protocol: HTTP
# hostname: "*.example.com" # 可选:只接受匹配该主机名的请求提示:你可以先查看集群里所有可用的 GatewayClass:
bashkubectl get gatewayclasses
保存为 my-gateway.yaml 并应用:
kubectl apply -f my-gateway.yaml要查看 Gateway 资源当前状态,可以执行:
kubectl get gateway my-gateway -o yaml2. 部署一个测试 Pod
把下面这个简单的 "Hello World" 应用部署起来,方便我们后续验证路由是否生效。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-pod
ports:
- port: 8080
targetPort: 80
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-pod
spec:
containers:
- name: my-pod
image: nginx
ports:
- containerPort: 80
# 注意:这里的 "ready" 探针仅作为说明用途;
# 在本示例中并未启用。详见本指南最后的"常见问题"部分。
# readinessProbe:
# httpGet:
# path: /
# port: 80
# initialDelaySeconds: 5
# periodSeconds: 10保存为 my-pod.yaml 并应用:
kubectl apply -f my-pod.yaml3. 部署一个 HTTPRoute
下面这条 HTTPRoute 会把所有命中 Gateway 的 HTTP 流量转发到 my-service:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-route
spec:
parentRefs: # 引用上一步创建的 Gateway
- name: my-gateway
hostnames: ["my-route.example.com"]
rules:
- matches: # 可选:限制只有特定路径/方法/请求头的请求才会被路由
- path:
type: PathPrefix
value: /
backendRefs: # 把流量转发到 my-service
- name: my-service
port: 8080保存为 my-route.yaml 并应用:
kubectl apply -f my-route.yaml4. 验证
请查阅你所选用的 Gateway 控制器文档,查看它有没有为新分配的 Gateway 资源自动创建一个对应的 Kubernetes Service。如果它没有自动创建 Service,你可以把 Gateway 资源从 Pending 状态推进到 Scheduled 状态,但需要自行用其他方式把流量从集群外部打到这个 Gateway。
如果控制器自动创建了 Service(这很常见),你应该能看到一个 LoadBalancer 类型的 Service:
kubectl get services my-gateway它的 EXTERNAL-IP 字段会显示一个 IP 地址(控制器也可能输出一个主机名)。把请求打过去,就能看到 "Hello World" 响应:
curl http://$INGRESS_IP:$PORT/ --header "Host: my-route.example.com"你应该会看到来自 my-pod 的响应。
5. 常见问题
- "我的 Gateway 一直停在 Pending 状态":这通常是因为你指定的
gatewayClassName在集群里不存在。运行kubectl get gatewayclasses找到正确的名字再修改你的 Gateway 资源。 - "我看不到 EXTERNAL-IP":你使用的控制器可能没有自动创建 Service。查阅它的文档,看它是否需要你手动把 Gateway 关联到一个 Service。
- "我的 Pod 显示 0/1 Ready":检查 Pod 状态:
kubectl describe pod my-pod。my-pod.yaml清单中故意没有启用 readiness 探针(注释掉了),你可能需要根据实际应用启用它。 - "需要监听 443 端口":参考 TLS 配置指南 查看如何启用 HTTPS。