Skip to content

部署一个简单的 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 资源加入。

yaml
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:

bash
kubectl get gatewayclasses

保存为 my-gateway.yaml 并应用:

bash
kubectl apply -f my-gateway.yaml

要查看 Gateway 资源当前状态,可以执行:

bash
kubectl get gateway my-gateway -o yaml

2. 部署一个测试 Pod

把下面这个简单的 "Hello World" 应用部署起来,方便我们后续验证路由是否生效。

yaml
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 并应用:

bash
kubectl apply -f my-pod.yaml

3. 部署一个 HTTPRoute

下面这条 HTTPRoute 会把所有命中 Gateway 的 HTTP 流量转发到 my-service

yaml
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 并应用:

bash
kubectl apply -f my-route.yaml

4. 验证

请查阅你所选用的 Gateway 控制器文档,查看它有没有为新分配的 Gateway 资源自动创建一个对应的 Kubernetes Service。如果它没有自动创建 Service,你可以把 Gateway 资源从 Pending 状态推进到 Scheduled 状态,但需要自行用其他方式把流量从集群外部打到这个 Gateway。

如果控制器自动创建了 Service(这很常见),你应该能看到一个 LoadBalancer 类型的 Service:

bash
kubectl get services my-gateway

它的 EXTERNAL-IP 字段会显示一个 IP 地址(控制器也可能输出一个主机名)。把请求打过去,就能看到 "Hello World" 响应:

bash
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-podmy-pod.yaml 清单中故意没有启用 readiness 探针(注释掉了),你可能需要根据实际应用启用它。
  • "需要监听 443 端口":参考 TLS 配置指南 查看如何启用 HTTPS。

基于 MIT 协议发布