首页 公告 项目 RSS

开始使用 Kubernetes Gateway API

June 12, 2024 本文有 833 个字 需要花费 2 分钟阅读

简介

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