使用政策配置网关资源


本页面介绍如何配置您在 Google Kubernetes Engine (GKE) 集群中部署网关时 GKE 创建的负载均衡器。

为 GKE 集群或一组 GKE 集群部署网关时,GatewayClass 配置决定了 GKE 创建的负载均衡器。系统已使用默认设置预先配置此代管式负载均衡器,您可以使用政策进行修改。

通过将政策附加到网关、服务或 ServiceImport(在多集群网关的上下文中),您可以自定义网关资源以满足您的基础架构或应用要求。应用或修改政策后,您无需删除或重新创建网关、路由或服务资源,该政策由网关控制器处理,并且底层负载均衡器资源是根据(新)政策进行(重新)配置的。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

GKE Gateway Controller 要求

  • 对于标准版,需要 GKE 1.24 或更高版本。
  • 对于 Autopilot,需要 GKE 1.26 或更高版本。
  • Google Cloud CLI 407.0.0 版或更高版本。
  • VPC 原生集群支持 Gateway API。
  • 如果您使用的是内部 GatewayClass,则必须启用代理专用子网
  • 集群必须启用 HttpLoadBalancing 插件。
  • 如果您使用的是 Istio,则必须将 Istio 升级到以下版本之一:
    • 1.15.2 或更高版本
    • 1.14.5 或更高版本
    • 1.13.9 或更高版本。

限制和局限

除了 GKE 网关控制器限制和局限之外,以下限制还适用于应用于网关资源的政策:

  • GCPGatewayPolicy 资源只能关联到 gateway.networking.k8s.io Gateway

  • GCPGatewayPolicy 资源必须与目标 Gateway 位于同一命名空间中。

  • 使用单集群网关时,GCPBackendPolicyHealthCheckPolicy 资源必须引用 Service 资源。 使用多集群网关时,GCPBackendPolicyHealthCheckPolicy 资源必须引用 ServiceImport 资源。

  • HealthCheckPolicyGCPBackendPolicy 资源必须与目标 ServiceServiceImport 资源位于同一命名空间中。

  • GCPBackendPolicyHealthCheckPolicy 资源的结构方式使其只能引用一个后端服务。

为区域级内部网关配置全球访问权限

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

如需使用内部网关启用全球访问权限,请将政策关联到网关资源。

以下 GCPGatewayPolicy 清单启用地区内部网关以实现全球访问权限:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: default
spec:
  default:
    allowGlobalAccess: true
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-gateway

配置 SSL 政策以保护客户端到负载均衡器的流量

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

如需保护客户端到负载均衡器的流量,请将政策名称添加到 GCPGatewayPolicy,以配置 SSL 政策。默认情况下,网关未定义并关联任何 SSL 政策。

确保在 GCPGatewayPolicy 中引用该政策之前创建 SSL 政策

以下 GCPGatewayPolicy 清单指定了名为 gke-gateway-ssl-policy 的安全政策:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: team1
spec:
  default:
    sslPolicy: gke-gateway-ssl-policy
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-gateway

配置健康检查

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

您可以使用 HealthCheckPolicy 控制负载均衡器的健康检查设置。每种类型的健康检查(httphttpsgrpchttp2)都有一组可以定义的参数,Google Cloud 会为每个后端服务创建唯一的健康检查 GKE 服务。

以下 HealthCheckPolicy 清单显示了配置健康检查政策时可用的所有字段:

服务

apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: lb-healthcheck
  namespace: lb-service-namespace
spec:
  default:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTHY_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    logConfig:
      enabled: ENABLED
    config:
      type: PROTOCOL
      httpHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      httpsHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      grpcHealthCheck:
        grpcServiceName: GRPC_SERVICE_NAME
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
      http2HealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: lb-healthcheck
  namespace: lb-service-namespace
spec:
  default:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTHY_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    logConfig:
      enabled: ENABLED
    config:
      type: PROTOCOL
      httpHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      httpsHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      grpcHealthCheck:
        grpcServiceName: GRPC_SERVICE_NAME
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
      http2HealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

替换以下内容:

  • INTERVAL:为每个健康检查探测器指定 check-interval(以秒为单位)。这是指从探测器检查开始到其下一次检查开始的时间。如果您省略此参数,则使用 Google Cloud 默认值 5 秒。如需了解详情,请参阅多重探测和频率
  • TIMEOUT 指定了 Google Cloud 等待探测响应的时间量。TIMEOUT 的值必须小于或等于 INTERVAL。该时间以秒为单位。每个探测都要求在探测超时之前传送 HTTP 200 (OK) 响应代码。
  • HEALTHY_THRESHOLDUNHEALTHY_THRESHOLD:指定至少一个探测器必须进行的成功或失败顺序连接尝试次数,以将健康状况从健康更改为不健康,或从不健康更改为健康。如果您省略其中一个参数,则使用 Google Cloud 默认值 2。
  • PROTOCOL:指定探测系统用于健康检查的协议。如需了解详情,请参阅 HTTP、HTTPS、HTTP/2 成功标准gRPC 成功标准。此参数必不可少。
  • ENABLED:指定日志记录是已启用还是已停用。
  • PORT_SPECIFICATION:指定健康检查使用固定端口 (USE_FIXED_PORT)、指定端口 (USE_NAMED_PORT) 还是服务端口 (USE_SERVING_PORT)。如果未指定,健康检查将遵循 portportName 字段中指定的行为。如果未指定 portportName,则此字段默认为 USE_SERVING_PORT
  • PATH:指定探测系统应为 HTTP、HTTPS 或 HTTP2 健康检查连接的 request-path。如果省略此参数,则使用 Google Cloud 默认值 /
  • PORT:HealthCheckPolicy 仅支持使用端口号指定负载均衡器的健康检查端口。如果省略此参数,则使用 Google Cloud 默认值 80。由于负载均衡器将探测直接发送到 Pod 的 IP 地址,因此您应该选择与服务 Pod 的 containerPort 匹配的端口,即使 containerPort 被 Service 的 targetPort 引用也是如此。您并非只能使用 Service 的 targetPort 引用的 containerPorts
  • PORT_NAME:指定 InstanceGroup.NamedPort.name 中定义的端口名称。如果同时定义了 portportName,则 Google Cloud 会首先考虑 port 值。
  • HOST:健康检查请求中主机标头的值。此值使用主机名的 RFC 1123 定义,但不允许使用数字 IP 地址。如果未指定或留空,则此值默认为健康检查的 IP 地址。
  • REQUEST_PATH:指定健康检查请求的请求路径。如果未指定或留空,则默认为 /
  • RESPONSE:指定要与响应数据开头匹配的字节。如果未指定或留空,GKE 会将所有响应解读为健康。响应数据只能为 ASCII 字符。
  • PROXY_HEADER:指定代理标头类型。您可以使用 NONEPROXY_V1。默认值为 NONE
  • GRPC_SERVICE_NAME:gRPC Service 的可选名称。省略此字段可指定所有 Service。

如需详细了解 HealthCheckPolicy 字段,请参阅 healthChecks 参考文档

配置 Google Cloud Armor 安全政策以保护您的后端服务

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

通过将安全政策的名称添加到 GCPBackendPolicy 来配置 Google Cloud Armor 安全政策,以保护您的后端服务。默认情况下,网关没有定义并关联任何 Google Cloud Armor 安全政策。

确保在 GCPBackendPolicy 中引用该政策之前创建 Google Cloud Armor 安全政策

以下 GCPBackendPolicy 清单指定了名为 example-security-policy 的安全政策:

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    securityPolicy: example-security-policy
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    securityPolicy: example-security-policy
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

配置 IAP

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

Identity-Aware Proxy (IAP) 对与 HTTPRoute 关联的后端服务强制执行访问权限控制政策。借助此强制执行措施,只有分配了正确 Identity and Access Management (IAM) 角色且经过身份验证的用户或应用才能访问这些后端服务。

默认情况下,系统不会将任何 IAP 应用于您的后端服务,您需要在 GCPBackendPolicy 中明确配置 IAP。

如需使用网关配置 IAP,请执行以下操作:

  1. 为 GKE 启用 IAP 请勿配置后端(配置 BackendConfig),因为 BackendConfig 仅在 Ingress 部署中有效。

  2. 为 IAP 创建 Secret:

    1. 转到“凭据”页面。按钮:转到“凭据”页面。

    2. 点击客户端的名称并下载 OAuth 客户端文件。

    3. 从 OAuth 客户端文件中,将 OAuth Secret 复制到剪贴板。

    4. 创建名为 iap-secret.txt 的文件。

    5. 使用以下命令将 OAuth Secret 粘贴到 iap-secret.txt 文件中:

      echo -n CLIENT_SECRET > iap-secret.txt
      kubectl create secret generic SECRET_NAME --from-file=key=iap-secret.txt
      
  3. 如需指定引用 Secret 的 IAP 政策,请执行以下操作:

    1. 创建以下 GCPBackendPolicy 清单,分别替换 SECRET_NAMECLIENT_ID。将清单保存为 backend-policy.yaml

      服务

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: ""
          kind: Service
          name: lb-service
      

      多集群服务

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: net.gke.io
          kind: ServiceImport
          name: lb-service
      
    2. 应用 backend-policy.yaml 清单:

      kubectl apply -f backend-policy.yaml
      
  4. 验证配置:

    1. 使用 IAP 创建 GCPBackendPolicy 后,确认已应用该政策:

      kubectl get gcpbackendpolicy
      

      输出类似于以下内容:

      NAME             AGE
      backend-policy   45m
      
    2. 如需了解更多详情,请使用 describe 命令:

      kubectl describe gcpbackendpolicy
      

      输出类似于以下内容:

      Name:         backend-policy
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPBackendPolicy
      Metadata:
        Creation Timestamp:  2023-05-27T06:45:32Z
        Generation:          2
        Resource Version:    19780077
        UID:                 f4f60a3b-4bb2-4e12-8748-d3b310d9c8e5
      Spec:
        Default:
          Iap:
            Client ID:  441323991697-luotsrnpboij65ebfr13hlcpm5a4heke.apps.googleusercontent.com
            Enabled:    true
            oauth2ClientSecret:
              Name:  my-iap-secret
        Target Ref:
          Group:
          Kind:   Service
          Name:   lb-service
      Status:
        Conditions:
          Last Transition Time:  2023-05-27T06:48:25Z
          Message:
          Reason:                Attached
          Status:                True
          Type:                  Attached
      Events:
        Type     Reason  Age                 From                   Message
        ----     ------  ----                ----                   -------
        Normal   ADD     46m                 sc-gateway-controller  default/backend-policy
        Normal   SYNC    44s (x15 over 43m)  sc-gateway-controller  Application of GCPGatewayPolicy "default/backend-policy" was a success
      

配置后端服务超时

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

以下 GCPBackendPolicy 清单指定了 40 秒的后端服务超时时间段。timeoutSec 字段默认为 30 秒。

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    timeoutSec: 40
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    timeoutSec: 40
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

配置会话亲和性

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

您可以根据以下条件配置会话亲和性

  • 客户端 IP 地址
  • 生成的 Cookie

以下 GCPBackendPolicy 清单基于客户端 IP 地址指定会话亲和性:

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: CLIENT_IP
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: CLIENT_IP
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

以下 GCPBackendPolicy 清单基于生成的 Cookie 指定会话亲和性,并将 Cookie TTL 配置为 50 秒:

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: GENERATED_COOKIE
      cookieTtlSec: 50
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: GENERATED_COOKIE
      cookieTtlSec: 50
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

您可以使用以下 sessionAffinity.type 选项:CLIENT_IPCLIENT_IP_PROTOCLIENT_IP_PORT_PROTOGENERATED_COOKIEHEADER_FIELDHTTP_COOKIENONE

配置连接排空超时

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

您可以使用 GCPBackendPolicy 配置连接排空超时。连接排空超时是指等待连接排空的时间(以秒为单位)。超时持续时间可以介于 0 到 3600 秒之间。 默认值为 0,此值也会停用连接排空。

以下 GCPBackendPolicy 清单指定 60 秒的连接排空超时:

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    connectionDraining:
      drainingTimeoutSec: 60
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    connectionDraining:
      drainingTimeoutSec: 60
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

在指定的超时持续时间内,GKE 会等待对已移除后端发出的现有请求完成。负载均衡器不会向已移除的后端发送新请求。达到超时持续时间之后,GKE 会关闭与该后端的所有剩余连接。

配置 HTTP 访问日志记录

本部分介绍运行 1.24 或更高版本的 GKE 集群提供的功能。

网关可以将来自客户端的所有 HTTP 请求记录到 Cloud Logging 中。

您可以使用 GCPBackendPolicy 启用和停用访问日志记录。您还可以配置访问日志记录采样率。

如需配置访问日志记录,请使用 GCPBackendPolicy 中的 logging 字段。如果省略 logging,则访问日志记录默认处于停用状态。

以下 GCPBackendPolicy 清单启用访问日志记录,并将采样率设置为指定 Service 资源 HTTP 请求的 50%。

服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    logging:
      enabled: true
      sampleRate: 500000
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多集群服务

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    logging:
      enabled: true
      sampleRate: 500000
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

此清单包含以下字段:

  • enable: true:启用访问日志记录。Logging 中提供日志。
  • sampleRate: 500000:指定记录 50% 的数据包。您可以使用介于 0 到 1000000 之间的值。GKE 通过除以 1000000,将此值转换为 [0, 1] 范围内的浮点值。只有当 enable 设置为 true 时,此字段才相关。sampleRate 是可选字段,但如果已配置,则必须设置 enable: true。如果 enable 设置为 true 但未提供 sampleRate,则 GKE 会将 enable 设置为 false

后续步骤