Envoy Gateway 任务

前提条件

  1. 配置 EnvoyGatewayCtl
  2. 配置 Gateway
  3. 配置 Route

介绍

在 Gateway API 中应用配置变更时,主要有三种方式:

  1. 直接修改 HTTP/TCP/UDP Route 或 Gateway
  2. 通过 Gateway ApiEnvoy Gateway 提供的 PolicyAttachment 进行修改。
  3. envoy-gateway instance 的全局配置层面进行修改。

HTTP/TCP/UDP Route

通过 TargetRefs 的 PolicyAttachment

Envoy Gateway 提供了丰富的自定义策略机制,可以通过 Gateway API 的 PolicyAttachment 模型附加到网关资源上。

Envoy Gateway 的策略分为多种类型,包括安全策略、流量管理策略等。这些策略可以应用于不同层级的资源,如 Gateway、HTTPRoute 或 Service。

Gateway API 的 PolicyAttachment 机制允许用户以声明式方式将策略附加到网关资源上。该机制通过 targetRefs 字段实现,指定策略应用的目标资源。例如,可以将策略附加到特定的 Gateway、HTTPRoute 或 Service。

Envoy Gateway 支持的策略类型包括:

策略类型描述
ClientTrafficPolicy与客户端到代理通信路径相关的配置,包括超时、重试、保持连接设置等参数。
BackendTrafficPolicy与代理到后端通信路径相关的配置,包括超时、重试、保持连接设置等参数。
SecurityPolicy与安全机制和控制相关的配置,如认证和授权。

通过 PolicyAttachment 机制,用户可以灵活地添加、修改或删除策略,而无需修改核心资源定义,实现关注点分离和更好的资源管理。

全局配置

envoy-gateway instance 本身相关的配置,或与所有网关相关的全局级别配置,属于该 envoy-gateway instance,例如部署模式或后端路由。

我们建议使用 EnvoyGatewayCtl 来管理这些全局配置。

Route 配置的常见任务

功能CR描述
认证envoygateway:SecurityPolicy 授权
CORSgatewayapi:HTTPRoute 跨域资源共享
头部修改gatewayapi:HTTPRoute HTTP 头部修改
HTTP 重定向gatewayapi:HTTPRoute HTTP 重定向
L7 超时gatewayapi:HTTPRoute 请求超时
会话亲和性gatewayapi:HTTPRoute 会话亲和性/粘性会话
L7 保持连接envoygateway:ClientTrafficPolicy L7 保持连接超时设置
L4 保持连接envoygateway:ClientTrafficPolicy L4 TCP 保持连接设置
URL 重写gatewayapi:HTTPRoute URL 重写
重试gatewayapi:HTTPRoute 或 envoygateway:BackendTrafficPolicy 通过 HTTPRoute 配置请求重试
通过 EnvoyGateway 配置请求重试
GZip 压缩envoygateway:BackendTrafficPolicy HTTP 压缩

高级配置

OpenTelemetry(Otel)

请按照 OpenTelemetry 集成 中的说明操作,但使用 EnvoyGatewayCtl 修改 envoy-gateway-config

如何附加到其他命名空间创建的 Listener

在 Gateway 的 listener 配置中,需要指定允许哪些命名空间附加 Routes。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  listeners:
    - name: http-80
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: All # 不限制
    - name: http-81
      protocol: HTTP
      port: 81
      allowedRoutes:
        namespaces:
          from: Same # 仅允许同一命名空间内的 routes
    - name: http-82
      protocol: HTTP
      port: 82
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels:
              team: frontend # 仅允许标签为 team=frontend 的命名空间内的 routes

详情请参考 跨命名空间路由

如何使用其他命名空间创建的证书

要使用其他命名空间创建的证书,需要在证书所在命名空间创建一个 ReferenceGrant。请参照 跨命名空间证书引用referencegrant 的说明操作。

NOTE

不能指定单个 secret 资源,必须允许整个命名空间

如何使用 SSL passthrough

请参考以下文档说明:

如何更改 SSL 密码套件

请参考 自定义网关 TLS 参数 的说明

cat <<EOF | kubectl apply -f -
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: ClientTrafficPolicy
metadata:
  name: enforce-tls-13
  namespace: default
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: eg
  tls:
    minVersion: "1.3"
EOF

ClientTrafficPolicy 中的 .spec.tlsclienttlssettings

使用 NodePort Service 时如何指定 NodePort

使用 NodePort 服务时,kubernetes 会为每个服务端口分配一个 NodePort 端口号。通过节点 IP 访问服务时,应使用对应的 NodePort 端口号,而非服务端口。

有两种方式处理:

手动获取 NodePort 分配,详见 从 svc 端口获取 nodeport

EnvoyProxy 配置中手动指定 NodePort,而非让 Kubernetes 自动分配。

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: demo
spec:
  ipFamily: DualStack
  provider:
    kubernetes:
      envoyDeployment:
        container:
          imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
      envoyService:
        patch:
          type: StrategicMerge
          value:
            spec:
              ports:
                - nodeport: 31888
                  port: 80
        type: NodePort
    type: Kubernetes
  1. 使用 patch 字段对生成的 service 资源进行补丁,指定 NodePort
NOTE

NodePort 只能在特定范围内,通常为 30000-32767。如果希望 Gateway listener 端口和 NodePort 一致,则 listener 端口也必须在 NodePort 范围内。

如何在 EnvoyGateway 中添加 Pod 注解

添加 pod 注解

如何为 envoy-gateway-operator 设置 NodeSelector 和 Tolerations

更新 Subscription 资源

# nodeSelector 和 tolerations 示例
kubectl patch subscription envoy-gateway-operator  -n envoy-gateway-operator   --type='merge' -p '
{
  "spec": {
    "config": {
      "nodeSelector": {
        "node-role.kubernetes.io/infra": ""
      },
      "tolerations": [
        {
          "effect": "NoSchedule",
          "key": "node-role.kubernetes.io/infra",
          "operator": "Equal",
          "value": "reserved"
        }
      ]
    }
  }
}'

如何为 envoy-gateway 设置 NodeSelector 和 Tolerations

更新 EnvoyGatewayCtl 资源

# 默认情况下 $NAME=cpaas-default,$NS=envoy-gateway-operator
kubectl patch envoygatewayctl $NAME -n $NS --type='merge' -p '
{
  "spec": {
    "deployment": {
      "pod": {
        "nodeSelector": {
          "node-role.kubernetes.io/infra": ""
        },
        "tolerations": [
          {
            "effect": "NoSchedule",
            "key": "node-role.kubernetes.io/infra",
            "operator": "Equal",
            "value": "reserved"
          }
        ]
      }
    }
  }
}'

如何为 envoy-proxy 设置 NodeSelector 和 Tolerations

更新 EnvoyProxy 资源

kubectl patch envoyproxy $NAME -n $NS --type='merge' -p '
{
  "spec": {
    "provider": {
      "kubernetes": {
        "envoyDeployment": {
          "pod": {
            "nodeSelector": {
              "node-role.kubernetes.io/infra": ""
            },
            "tolerations": [
              {
                "effect": "NoSchedule",
                "key": "node-role.kubernetes.io/infra",
                "operator": "Equal",
                "value": "reserved"
              }
            ]
          }
        }
      }
    }
  }
}'

更多配置

请参考 EnvoyGateway 任务