CKA [Networking] – Gateway API的使用

以下的ingress流程是我们让用户从外部导入流量,但是ingress只能导入HTTP或HTTPS

如果你想从外部导入TCP / UDP / GRPC 等等其他的流量协议的话,那么就必须使用Gateway API了。Gateway API支持L4和L7的协议。

Gateway是ingress的继任者,以下的连接是ingress所没有的功能,比如http header modification, http request mirroring, grpc routing 等等。

Gateway有什么而外的功能:https://gateway-api.sigs.k8s.io/guides

以下的官方文档有写为什么需要从ingress迁移到使用gateway api

https://gateway-api.sigs.k8s.io/guides/migrating-from-ingress

如果要使用ingress就必须安装ingress controller 比如 nginx ingress controller 否则ingress无法使用,那么使用gateway也是一样的道理,想要使用gateway就必须安装gateway controller, 如果istio 或 nginx,以下的连接可以查看。

Gateway Controller List: https://gateway-api.sigs.k8s.io/implementations

从 Client 发起请求到 Pod 响应的完整流程示意:

Client
   ↓ 1. DNS 解析
External LoadBalancer (或 NodePort)
   ↓ 2. 单一 IP/端口
Gateway (CR) —— Listener(端口、协议)
   ↓ 3. HTTP/Host/Path 匹配
HTTPRoute (CR) —— Route Rules
   ↓ 4. backendRefs 指向 K8s Service
Service
   ↓ 5. ClusterIP + Endpoints
Endpoints —— Pod
   ↓ 6. 真实 Pod

Gateway API也能控制多少%的流量到不同的pod,以便进行canary deployment

根据下图,Gateway API 包含了GatewayClass , Gateway 和 Route

Gateway的架构讲解

GatewayClass讲解

Gateway可以用于不同的Gateway Controller, 通常都是创建GatewayClass来绑定不同的GatewayController

以下创建的nginx GatewayClass就是绑定了nginx-gateway-controller

Gateway讲解

Gateway就是等于外部的流量入口的infra,监听哪个port,指定使用了哪个GatewayClass。

在Gateway也能定义hostname 也就是domain,如果没有定义hostname的话,就是接受全部流量的意思。

Route讲解

在httproute可以定于哪个path导流到哪个service, 根据下图是把流量导去后端的port 80, 并且使用了nginx的gateway

其实Route层不只是有HTTPRoute, 而且还有TLSRoute , TCPRoute , UDPRoute , GRPCRoute

Gateway多个组件之间的关系

  1. 集群管理员创建 GatewayClass(网关类)
    • 这个 GatewayClass 会指向一个特定的 Gateway Controller(比如 Istio、NGINX、GKE Gateway Controller 等)
    • 它定义了“使用哪个控制器来实现这个类的网关行为”
  2. 开发团队(用户)创建 Gateway(网关)资源
    • 这个 Gateway 会引用前面创建的 GatewayClass
    • 表示“我要用这种类型的网关”
    • 可以定义监听端口、协议、证书等信息(如监听 443/HTTPS
  3. Gateway Controller 会监听这些资源并实现网络配置
    • 控制器看到有新的 Gateway 后,会创建实际的负载均衡器或配置入口流量的资源(比如 Cloud Load Balancer、Envoy 配置等)
  4. 最后,定义路由(如 HTTPRoute)来附加到 Gateway 上
    • 这些路由资源定义“流量如何从 Gateway 转发到具体的服务”
    • 比如:
      • /api 的流量转发到 service A
      • /login 的流量转发到 service B

Gateway和httproute都能set hostname?

是的,这两个都能set hostname,只是gateway 是流量的入口, httproute是流量的分发,下面的set hostname的example

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: istio
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
      hostname: "example.com"   # ← 监听的域名
      tls:
        mode: SIMPLE
        certificateRefs:
          - name: example-cert
            kind: Secret
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: my-route
spec:
  parentRefs:
    - name: my-gateway
  hostnames:
    - "example.com"   # ← 匹配请求中的 Host header
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /app
      backendRefs:
        - name: my-service
          port: 8080

Loading

Facebook评论