配置 GatewayAPI Gateway

前提条件

请确保您已阅读安装文档后再继续操作。

通过 Web 控制台配置

  1. 进入 Alauda Container Platform -> Networking -> Gateways

  2. 点击 Create Gateway 按钮

  3. Create Gateway 页面选择 GatewayClass 下的 envoy-gateway-operator-cpaas-default,将显示以下配置选项:

    字段说明YAML 路径
    Name名称gateway: .metadata.name
    envoygateway: .metadata.name
    GatewayClass使用的 GatewayClassgateway: .spec.gatewayClassName
    Service Type服务类型envoygateway: .spec.provider.kubernetes.envoyService.type
    Service Annotation服务注解envoygateway: .spec.provider.kubernetes.envoyService.annotations
    Resource Limits部署资源限制envoygateway: .spec.provider.kubernetes.envoyDeployment.container.resources
    Replicas部署副本数envoygateway: .spec.provider.kubernetes.envoyService.replicas
    Node Labels部署节点标签envoygateway: .spec.provider.kubernetes.envoyService.nodeSelector
    Listener监听器gateway: .spec.listeners
    WARNING

    Web 控制台表单仅支持由 EnvoyGatewayCtl 创建的 GatewayClasses。对于其他 GatewayClasses,请使用 YAML 编辑器。

    NOTE

    使用 EnvoyGatewayCtl 创建的 GatewayClass 时,Web 控制台会自动创建一个与 Gateway 名称和命名空间匹配的配套 envoyproxy 资源

通过 YAML 配置

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: demo
  namespace: demo
spec:
  infrastructure:
    parametersRef:
      group: gateway.envoyproxy.io
      kind: EnvoyProxy
      name: demo
  gatewayClassName: envoy-gateway-operator-cpaas-default
  listeners:
    - name: http
      port: 80
      hostname: a.com
      protocol: HTTP
      allowedRoutes:
        namespaces:
          from: Same
    - name: https
      port: 443
      hostname: a.com
      protocol: HTTPS
      allowedRoutes:
        namespaces:
          from: Same
      tls:
        mode: Terminate
        certificateRefs:
          - name: demo-tls
    - name: tcp
      port: 8080
      protocol: TCP
      allowedRoutes:
        namespaces:
          from: Same
    - name: udp
      port: 8080
      protocol: UDP
      allowedRoutes:
        namespaces:
          from: Same
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: demo
  namespace: demo
spec:
  provider:
    kubernetes:
      envoyService:
        type: ClusterIP
      envoyDeployment:
        replicas: 1
        container:
          imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
          resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: '1'
              memory: 1Gi
    type: Kubernetes
  1. 配套 envoyproxy
  2. 指定所属的 GatewayClass
  3. 监听器
  4. 监听器主机名
  5. 监听器支持的类型
  6. 监听器允许的命名空间
  7. TLS 配置
  8. 配套 envoyproxy 的名称
  9. 服务类型
  10. 请保持并勿修改默认的镜像仓库
  11. envoy-proxy 实例 的资源配置
  12. 请保持并勿修改

介绍

服务类型

服务类型本质上配置了网关的暴露方式。共有三种模式:LoadBalancer、NodePort 和 ClusterIP。

LoadBalancer(推荐

优点是使用方便,且具备高可用的负载均衡能力。 要使用 LoadBalancer,集群必须支持 LoadBalancer,可以通过MetalLB启用。

NodePort

优点是不依赖任何外部组件。

但使用 NodePort 有以下缺点:

  • 只能用于节点数少于 16 的集群,否则网关状态可能异常。
  • 使用 NodePort 时,Kubernetes 会分配与服务端口不同的 NodePort 端口号。访问时必须使用 NodePort 端口号,而非服务端口。
  • 服务可通过集群中任意节点 IP 访问,存在潜在安全风险。
使用 NodePort 时如何获取正确端口
kubectl get svc -n ${ENVOYGATEWAYCTL_NS} -l gateway.envoyproxy.io/owning-gateway-name=${GATEWAY_NAME} -o=jsonpath='{.items[0].spec.ports[?(@.port==${PORT})].nodePort}'

输出即为 NodePort 端口号。

ClusterIP

如果不需要外部暴露,非常方便。

监听器

监听器定义了网关监听的端口和协议。 在 HTTP 或 HTTPS 协议下,不同的主机名可视为不同的监听器。

不能创建端口、协议或主机名冲突的监听器。

Gateway 中必须至少创建一个监听器。

监听器支持的类型

每个监听器根据协议支持不同的路由类型:

监听器协议支持的路由类型
HTTPHTTPRoute
HTTPSHTTPRoute, GRPCRoute
TLSTLSRoute
TCPTCPRoute
UDPUDPRoute

配置路由时,确保路由类型与监听器协议匹配。例如,不能将 HTTPRoute 附加到 TCP 监听器。

允许的路由命名空间

默认情况下,路由只能附加到同一命名空间的 Gateway。若允许跨命名空间路由,需要通过 allowedRoutes 字段指定允许附加路由的命名空间。

详情请参考附加到其他命名空间创建的 Gateway

TLS

默认只能使用同一命名空间创建的 secret,否则请参考使用其他命名空间创建的 secret

默认使用 Terminate 模式,其他模式请参考ssl passthrough

主机名

监听器中的主机名是同协议监听器的唯一标识,不能在网关中添加或更新冲突的监听器。

监听器主机名与路由主机名的交集规则

请求到达时,会匹配监听器主机名与路由主机名的交集,只有交集中的主机名用于流量路由。

监听器主机名路由主机名交集结果示例
无主机名无主机名匹配所有主机接受任何传入的 Host 头
无主机名有主机名(如 api.example.com全部路由主机名仅匹配 api.example.com 的请求
有主机名(如 api.example.com无主机名全部监听器主机名仅匹配 api.example.com 的请求
有主机名(如 api.example.com有完全匹配的主机名(如 api.example.com精确匹配主机名仅匹配 api.example.com 的请求
有通配符(如 *.example.com有匹配的主机名(如 api.example.comweb.example.com匹配具体主机名匹配 api.example.comweb.example.com 的请求
有主机名(如 api.example.com有不匹配的主机名(如 web.example.com无交集 - 路由状态异常路由无法处理流量
NOTE

通配符(*)执行后缀匹配。例如,*.example.com 匹配 foo.example.combar.example.com,但不匹配 example.com

WARNING

无交集时,路由状态异常,无法处理流量。

配套 EnvoyProxy

Envoy Gateway 提供了不同粒度的网关部署控制方式。建议为每个 Gateway 创建专用的 EnvoyProxy 资源,并通过 Gateway 的 .spec.infrastructure.parametersRef 字段引用。

这种一对一映射方式能更好地隔离并细粒度控制部署配置,如副本数、资源和调度约束。

其他部署配置方式请参考 deployment-mode

镜像仓库

这是默认值,会被当前集群的实际镜像仓库替换,请勿修改。

下一步

配置 GatewayAPI Route