配置 Ingress 特性

本页面概述了通过 Google Cloud 上的 Kubernetes Ingress 支持和可配置的内容。Ingress for Google Kubernetes Engine (GKE) 和 Anthos 可提供企业级负载平衡功能,并与您的 Google Cloud VPC 网络紧密集成。

特性比较

下表提供了 Google Cloud 上 Ingress 的受支持特性列表。同时指示推出特性的正式版 (GA) 或 Beta 版

Ingress 类 外部 Ingress 内部 Ingress 多集群 Ingress
Ingress 控制器 集群托管的 Ingress 控制器 Google 托管的 Ingress 控制器
Google Cloud 负载平衡器类型 外部 HTTP(S) 负载平衡器 内部 HTTP(S) 负载平衡器 外部 HTTP(S) 负载平衡器
集群范围 单集群 单集群 多集群
负载平衡器范围 全球 区域 全球
版本支持 全部 GKE 1.16.5+ GKE 1.14+
环境支持 GKE GKE GKE
共享 VPC 支持 GA GA GA
服务注释
容器原生负载平衡 (NEG) GA GA GA
从负载平衡器到后端的 HTTPS GA GA GA
HTTP/2 GA GA
仅限 TLS
GA
Ingress 注释
静态 IP 地址 GA GA GA
基于 Kubernetes Secrets 的证书 GA GA GA
Google 自行管理的 SSL 证书 GA GA GA
Google 代管式 SSL 证书 GA GA
FrontendConfig(Beta 版
SSL 政策 GA
从 HTTP 到 HTTPS 的重定向 Beta 版
1.18.10-gke.600B
BackendConfig
后端服务超时 GA GA GA
Cloud CDN GA GA
连接排空超时 GA GA GA
自定义负载平衡器运行状况检查配置 GA GA GA
Google Cloud Armor 安全政策 GA
1.19.10-gke.700G
Beta 版
HTTP 访问日志记录配置 GA GA\ GA
Identity-Aware Proxy (IAP) GA GA
会话亲和性 GA GA GA
用户定义的请求标头 GA GA

B从指定版本开始,此特性在 Beta 版中可用。所有可用的 GKE 和 Anthos 版本均支持未列出版本的特性。

G从指定版本开始支持将此特性用作 GA。

配置 Ingress 特性

使用默认控制器创建 Ingress 时,您可以使用对 Ingress 对象的注释来选择负载平衡器的类型(外部 HTTP(S) 负载平衡器或内部 HTTP(S) 负载平衡器)。您可以选择是 GKE 创建区域 NEG 还是它通过对每个 Service 对象使用注释来使用实例组。

FrontendConfig 和 BackendConfig 自定义资源定义 (CRD) 允许您进一步自定义负载平衡器。这些 CRD 允许您以分层方式定义其他负载平衡器特性,分层方式比注释更具结构化。如需使用 Ingress(以及这些 CRD),您必须启用 HTTP 负载平衡插件。GKE 集群默认启用了 HTTP 负载平衡;您不得将其停用。

FrontendConfigs 在 Ingress 对象中引用,BackendConfigs 通过 Service 对象引用。多个 Service 或 Ingress 对象可以引用相同的 CRD,以实现配置一致性。FrontendConfig 和 BackendConfig CRD 与其对应的 Ingress 和 Service 资源具有相同的生命周期,并且通常一起部署。

下图说明了具体方法:

  • 对 Ingress 或 MultiClusterIngress 对象的注释引用了 FrontendConfig CRD。FrontendConfig CRD 引用了 Google Cloud SSL 政策。

  • 对 Service 或 MultiClusterService 对象的注释引用了 BackendConfig CRD。BackendConfig CRD 为相应后端服务的运行状况检查指定自定义设置。

BackendConfig 和 FrontendConfig 概览
:BackendConfig 和 FrontendConfig 概览

将 FrontendConfig 与 Ingress 关联

您可以通过对 Ingress 或 MultiClusterIngress 资源的注释来引用 FrontendConfig CRD。FrontendConfig 对应于整个 Ingress/MultiClusterIngress 资源,如以下示例所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    networking.gke.io/v1beta1.FrontendConfig: "frontendconfig"
...

将 BackendConfig 与 Ingress 关联

BackendConfig CRD 通过对 Service 或 MultiClusterService 资源的注释引用。Service 或 MultiClusterService 使用 cloud.google.com/backend-config 注释来指定 BackendConfig 的名称。与 Service 或 MultiClusterService 关联时,BackendConfig 可以确定 Google Cloud 后端服务设置。下面的示例展示了如何将 BackendConfig 附加到 Service 或 MultiClusterService。default 密钥表示当 Ingress 引用 Service 中的所有端口时,这些端口会与 my-backendconfig BackendConfig 关联:

1.16-gke.3+

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/backend-config: '{"default": "my-backendconfig"}'
...

所有受支持的版本

apiVersion: v1
kind: Service
metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "my-backendconfig"}'
...

如果需要同一 Service 内不同端口的唯一 BackendConfig 设置,则可以将特定 BackendConfig 资源明确关联到这些端口。在下面的示例中,ports 键允许明确链接端口:

1.16-gke.3+

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/backend-config: '{"ports": {
    "port-1":"backendconfig-name-1",
    "port-2":"backendconfig-name-2"
    }}'
spec:
  ports:
  - name:service-name-1
    port: service-port-1
    protocol: TCP
    targetPort: 50000
  - name: service-name-2
    port: service-port-2
    protocol: TCP
    targetPort: 8080
...

所有受支持的版本

apiVersion: v1
kind: Service
metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {
    "port-1":"backendconfig-name-1",
    "port-2":"backendconfig-name-2"
    }}'
spec:
  ports:
  - name: service-name-1
    port:  service-port-1
    protocol: TCP
    targetPort: 50000
  - name: service-name-2
    port: >service-port-2
    protocol: TCP
    targetPort:8080
...

port-1 可以通过以下方式引用 Service 中的端口:通过 service-port-1 按数字或者通过 service-name-1 按名称(仅在 GKE 上受支持)。每个端口都映射到一个 Google Cloud 负载平衡器后端服务,该服务允许 Service 中的端口具有不同的配置。

通过 FrontendConfig 参数配置 Ingress 特性

以下部分介绍如何设置 FrontendConfig 以启用特定 Ingress 特性。

SSL 政策

SSL 政策允许您指定一组 TLS 版本和密码,负载平衡器使用这些版本和密码终止来自客户端的 HTTPS 流量。必须先在 GKE 外部创建 SSL 政策。创建后,可以在 FrontendConfig CRD 中引用它。

FrontendConfig 中的 sslPolicy 字段引用与 GKE 集群相同的 Google Cloud 项目中的 SSL 政策名称。它将 SSL 政策附加到目标 HTTPS 代理,后者是 Ingress 为外部 HTTP(S) 负载平衡器创建的。多个 Ingress 资源可以引用同一个 FrontendConfig 资源和 SSL 政策。如果引用的 SSL 政策发生更改,则更改会传播到为 Ingress 创建的外部 HTTP(S)负载平衡器提供支持的 Google Front End (GFE)。

以下 FrontendConfig 清单启用名为 gke-ingress-ssl-policy 的 SSL 政策:

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: my-frontend-config
spec:
  sslPolicy: gke-ingress-ssl-policy

从 HTTP 到 HTTPS 的重定向

外部 HTTP 负载平衡器可以将未加密的 HTTP 请求重定向到使用同一 IP 地址的 HTTPS 负载平衡器。当您在创建启用了从 HTTP 到 HTTPS 的重定向的 Ingress 时,系统会自动创建这两个负载平衡器。对端口 80 上 Ingress 的外部 IP 地址的请求会自动重定向到端口 443 上的同一外部 IP 地址。此功能构建于 Cloud Load Balancing 提供的从 HTTP 到 HTTPS 的重定向之上。

如需支持 HTTP 到 HTTPS 重定向,必须配置 Ingress 以同时提供 HTTP 和 HTTPS 流量。如果停用 HTTP 或 HTTPS,则重定向将不起作用。

从 HTTP 到 HTTPS 的重定向是使用 FrontendConfig CRD 中的 redirectToHttps 字段配置的。系统会对整个 Ingress 资源启用重定向功能,以便 Ingress 引用的所有 Service 都将启用 HTTPS 重定向功能。

以下 FrontendConfig 清单允许从 HTTP 到 HTTPS 的重定向。 将 spec.redirectToHttps.enabled 字段设置为 true 以启用 HTTPS 重定向功能。spec.responseCodeName 字段为可选字段。 如果省略此项,则系统会使用 301 Moved Permanently 重定向。

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: my-frontend-config
spec:
  redirectToHttps:
    enabled: true
    responseCodeName: response-code

response-code 替换为以下项之一:

  • MOVED_PERMANENTLY_DEFAULT,用于返回 301 重定向响应代码(如果未指定 responseCodeName,则默认为此项)。
  • FOUND,用于返回 302 重定向响应代码。
  • SEE_OTHER,用于返回 303 重定向响应代码。
  • TEMPORARY_REDIRECT,用于返回 307 重定向响应代码。
  • PERMANENT_REDIRECT,用于返回 308 重定向响应代码。

启用重定向功能后,Ingress 控制器会创建一个负载平衡器,如为外部 HTTP(S) 负载平衡器设置从 HTTP 到 HTTPS 的重定向中所述,如下图所示:

仅限重定向的外部 HTTP 负载平衡器,其中包含转发规则、目标 HTTP 代理,以及使用后端服务重定向到完整 HTTPS 负载平衡器的网址映射

通过 BackendConfig 参数配置 Ingress 特性

以下部分演示如何设置 BackendConfig 以启用特定 Ingress 特性。系统会不断协调对 BackendConfig 资源的更改,因此您无需删除并重新创建 Ingress 就可以看到 BackendConfig 的更改反映出来。

如需了解 BackendConfig 限制,请参阅限制部分。

后端服务超时

您可以使用 BackendConfig 来设置后端服务超时时间段(以秒为单位)。如果未指定值,则默认值为 30 秒。

以下 BackendConfig 清单指定 40 秒的超时:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  timeoutSec: 40

Cloud CDN

您可以使用 BackendConfig 来启用Cloud CDN

以下 BackendConfig 清单显示了启用 Cloud CDN 时可用的所有字段:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  cdn:
    enabled: cdnEnabled
    cachePolicy:
      includeHost: includeHost
      includeProtocol: includeProtocol
      includeQueryString: includeQueryString
      queryStringBlacklist: queryStringBlacklist
      queryStringWhitelist: queryStringWhitelist

替换以下内容:

  • cdnEnabled:如果设置为 true,则会为此 Ingress 后端启用 Cloud CDN。
  • includeHost:如果设置为 true,则会分别缓存对不同主机的请求。
  • includeProtocol:如果设置为 true,则会分别缓存 HTTP 和 HTTPS 请求。
  • includeQueryString:如果设置为 true,则会根据 queryStringBlacklistqueryStringWhitelist 将查询字符串参数包含在缓存键中。如果两者都未设置,则包括整个查询字符串。如果设置为 false,则会从缓存键中排除整个缓存字符串。
  • queryStringBlacklist:指定含有要从缓存键中排除的查询字符串参数名称的字符串数组。包括所有其他参数。您可以指定 queryStringBlacklistqueryStringWhitelist,但不能同时指定这两者。
  • queryStringWhitelist:指定含有要包含在缓存键中的查询字符串参数名称的字符串数组。排除所有其他参数。您可以指定 queryStringBlacklistqueryStringWhitelist,但不能同时指定这两者。

展开以下部分即可看到通过 Ingress 部署 Cloud CDN,然后验证应用内容是否缓存的示例。

连接排空超时

您可以使用 BackendConfig 来配置连接排空超时。连接排空超时是指等待连接排空的时间(以秒为单位)。在指定的超时持续时间内,系统会为对已移除后端发出的现有请求留出一定的时间,让这些请求可以完成。负载平衡器不会向已移除的后端发送新请求。达到超时持续时间之后,系统会关闭与该后端的所有剩余连接。超时持续时间可以介于 0 到 3600 秒之间。默认值为 0,此值也会停用连接排空。

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

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  connectionDraining:
    drainingTimeoutSec: 60

自定义运行状况检查配置

通过 Ingress 进行部署时,GKE 有多种方法配置 Google Cloud 负载平衡器运行状况检查。如需详细了解 GKE Ingress 如何部署运行状况检查,请参阅 Ingress 运行状况检查

一种方法是通过 BackendConfig 明确配置运行状况检查。如果设置了这些参数,则它们将取代 Kubernetes 就绪性探测设置和运行状况检查默认值。

您可以配置多个 GKE 服务,以将同一个 BackendConfig 作为可重复使用的模板引用。对于 healthCheck 参数,系统会为与每个 GKE 服务对应的每个后端服务创建唯一的 Google Cloud 运行状况检查。

以下 BackendConfig 清单显示了配置 BackendConfig 运行状况检查时可用的所有字段:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  healthCheck:
    checkIntervalSec: interval
    timeoutSec: timeout
    healthyThreshold: health-threshold
    unhealthyThreshold: unhealthy-threshold
    type: protocol
    requestPath: path
    port: port

请替换以下内容:

  • interval:为每个运行状况检查探测器指定 check-interval(以秒为单位)。这是指从探测器检查开始到下一次检查开始的时间。如果您省略此参数,则会使用 Google Cloud 默认值 5 秒。如需其他实现详情,请参阅多重探测和频率
  • timeout:指定 Google Cloud 等待探测响应的时间量。timeout 的值必须小于或等于 interval。该时间以秒为单位。每个探测都要求在探测超时之前传送 HTTP 200 (OK) 响应代码。
  • health-thresholdunhealthy-threshold:指定至少一个探测器必须进行的成功或失败顺序连接尝试次数,以便将运行状况从运行状况良好更改为运行状况不佳,反之亦然。如果您省略其中一个参数,Google Cloud 会使用默认值 2。
  • protocol:指定探测系统用于运行状况检查的协议BackendConfig 仅支持使用 HTTP、HTTPS 或 HTTP2 协议来创建运行状况检查。如需了解详情,请参阅 HTTP、HTTPS、HTTP/2 成功标准。您不能省略此参数。
  • path:对于 HTTP、HTTPS 或 HTTP2 运行状况检查,指定探测系统应连接到的 request-path。如果您省略此参数,Google Cloud 将使用默认值 /
  • port使用端口号指定端口。如果您省略此参数,Google Cloud 将使用默认值 80。使用容器原生负载平衡时,探测系统会连接到服务 Pod 的 IP 地址。否则,运行状况检查探测将连接到正在运行服务 Pod 的节点的 IP 地址。

Google Cloud Armor 安全政策

Google Cloud Armor 安全政策有助于保护您的负载平衡应用免遭 Web 攻击。配置 Google Cloud Armor 安全政策后,您可以使用 BackendConfig 来引用该政策。

将安全政策的名称添加到 BackendConfig。以下 BackendConfig 清单指定了名为 example-security-policy 的安全政策:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  namespace: cloud-armor-how-to
  name: my-backendconfig
spec:
  securityPolicy:
    name: "example-security-policy"

HTTP 访问日志记录

Ingress 可以将来自客户端的所有 HTTP 请求记录到 Cloud Logging 中。您可以通过使用 BackendConfig 以及设置访问日志记录采样率来启用和停用访问日志记录

要配置访问日志记录,请使用 BackendConfig 中的 logging 字段。如果省略 logging,则访问日志记录将采用默认行为。这取决于 GKE 版本。

您可以配置以下字段:

  • enable:如果设置为 true,系统将为此 Ingress 启用访问日志记录功能,并且日志可在 Cloud Logging 中获得。否则,系统会为此 Ingress 停用访问日志记录。
  • sampleRate:指定一个介于 0.0 到 1.0 之间的值,其中 0.0 表示不记录数据包,1.0 表示记录所有数据包。只有当 enable 设置为 true 时,此字段才相关。sampleRate 是可选字段,但如果已配置,则必须设置 enable: true,否则将被解读为 enable: false

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

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  logging:
    enable: true
    sampleRate: 0.5

Identity-Aware Proxy

要为 Identity-Aware Proxy IAP 配置 BackendConfig,您需要将 enabledsecretName 值指定为 BackendConfig 中的 iap 块。要指定这些值,请确保您拥有 compute.backendServices.update 权限

以下 BackendConfig 清单启用 Identity-Aware Proxy:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name:  my-backendconfig
spec:
  iap:
    enabled: true
    oauthclientCredentials:
      secretName: my-secret

如需查看完整说明,请参阅 IAP 文档中的为 GKE 启用 IAP

会话亲和性

您可以使用 BackendConfig 将会话亲和性设置为客户端 IP 或生成的 Cookie。

客户端 IP 亲和性

要使用 BackendConfig 设置客户端 IP 亲和性,请将 affinityType 设置为 "CLIENT_IP",如以下示例所示:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  sessionAffinity:
    affinityType: "CLIENT_IP"

要使用 BackendConfig 设置生成的 Cookie 亲和性,请在 BackendConfig 清单中将 affinityType 设置为GENERATED_COOKIE。您还可以使用 affinityCookieTtlSec 来设置 Cookie 保持活动的时间段。

以下清单将亲和性类型设置为生成的 Cookie 并为 Cookie 设置 50 秒的 TTL:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  sessionAffinity:
    affinityType: "GENERATED_COOKIE"
    affinityCookieTtlSec: 50

用户定义的请求标头

您可以使用 BackendConfig 来配置用户定义的请求标头。负载平衡器会将您指定的标头添加至它转发到后端的请求。

要启用用户定义的请求标头,您需要在 BackendConfig 资源的 customRequestHeaders 属性中指定标头列表。您可以将每个标头指定为 header-name:header-value 字符串。

以下 BackendConfig 清单添加了三个请求标头:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  customRequestHeaders:
    headers:
    - "X-Client-Region:{client_region}"
    - "X-Client-City:{client_city}"
    - "X-Client-CityLatLong:{client_city_lat_long}"

练习:使用后端服务设置 Ingress 超时

以下练习展示了使用具有 BackendConfig 资源的 Ingress 配置超时和连接排空所需的步骤。

要配置 Ingress 的后端属性,请完成以下任务:

  1. 创建一个 Deployment
  2. 创建 BackendConfig
  3. 创建一个 Service,并将它的一个端口与 BackendConfig 关联
  4. 创建一个 Ingress,并将该 Ingress 与(Service, 端口)对关联
  5. 验证后端服务的属性
  6. 清理.

创建 Deployment

在创建 BackendConfig 和 Service 之前,您需要创建一个 Deployment

以下示例清单适用于名为 my-deployment.yaml 的 Deployment:

# my-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      purpose: bsc-config-demo
  replicas: 2
  template:
    metadata:
      labels:
        purpose: bsc-config-demo
    spec:
      containers:
      - name: hello-app-container
        image: gcr.io/google-samples/hello-app:1.0

通过运行以下命令以创建 Deployment:

kubectl apply -f my-deployment.yaml

创建 BackendConfig

使用 BackendConfig 指定要使用的 Ingress 特性。

这个名为 my-backendconfig.yaml 的 BackendConfig 清单指定了以下内容:

  • 超时时间为 40 秒。
  • 连接排空超时为 60 秒。
# my-backendconfig.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  timeoutSec: 40
  connectionDraining:
    drainingTimeoutSec: 60

如需查看可使用 BackendConfig 设置的特性的完整列表,请参阅特性表的 BackendConfig 部分。

运行以下命令以创建 BackendConfig:

kubectl apply -f my-backendconfig.yaml

创建 Service

即使 Service 具有多个端口,BackendConfig 也会与单个 Service-Port 组合相对应。每个端口都可以与单个 BackendConfig CRD 相关联。如果 Ingress 引用了某一 Service 端口,并且该 Service 端口与 BackendConfig 相关联,则 HTTP(S) 负载平衡后端服务会从 BackendConfig 中获取其部分配置。

以下是一个名为 my-service.yaml 的 Service 清单文件示例:

# my-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    purpose: bsc-config-demo
  annotations:
    cloud.google.com/backend-config: '{"ports": {"80":"my-backendconfig"}}'
    cloud.google.com/neg: '{"ingress": true}'
spec:
  type: ClusterIP
  selector:
    purpose: bsc-config-demo
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080

cloud.google.com/backend-config 注释指定端口与 BackendConfig 对象之间的映射。在 my-service.yaml 中:

  • 具有 purpose: bsc-config-demo 标签的任何 Pod 都是 Service 的成员。
  • Service 的 TCP 端口 80 与名为 my-backendconfig 的 BackendConfig 相关联。这是由 cloud.google.com/backend-config 注释指定的。
  • 发送到 Service 端口 80 的请求被转发到端口 8080 上的一个成员 Pod。

要创建 Service,请运行以下命令:

kubectl apply -f my-service.yaml

创建 Ingress

以下是一个名为 my-ingress.yaml. 的 Ingress 清单。在此示例中,传入请求路由到名为 my-service 的 Service 的端口 80。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: my-service
            port:
              number: 80

要创建 Ingress,请运行以下命令:

kubectl apply -f my-ingress.yaml

等待几分钟,让 Ingress 控制器配置 HTTP(S) 负载平衡和关联的后端服务。此操作完成后,将 Ingress 配置为使用 40 秒超时,并将连接排空超时设置为 60 秒。

验证后端服务属性

您可以通过 BackendConfig 验证是否已应用正确的负载平衡器设置。为此,请确定 Ingress 已部署的后端服务并检查其设置,以验证它们是否与 Deployment 清单匹配。

首先,描述列出与 Ingress 关联的后端服务的 my-ingress 资源和过滤条件。例如:

kubectl describe ingress my-ingress | grep ingress.kubernetes.io/backends

您将看到如下所示的输出:

ingress.kubernetes.io/backends: '{"k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY","k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY"}

输出会提供后端服务的相关信息。例如,此注释包含两个后端服务:

  • "k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY" 针对与 my-service Kubernetes Service 关联的后端服务提供相关信息。
    • k8s1-27fde173 是用于描述集群的哈希值。
    • default 是 Kubernetes 命名空间。
    • HEALTHY 表示后端运行状况良好。
  • "k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY" 针对与默认后端(404 服务器)关联的后端服务提供相关信息。
    • k8s1-27fde173 是用于描述集群的哈希值。
    • kube-system 是命名空间。
    • default-http-backend 是 Kubernetes Service 名称。
    • 80 是主机端口。
    • HEALTHY 表示后端运行状况良好。

接下来,使用 gcloud 检查与 my-service 关联的后端服务。过滤 "drainingTimeoutSec""timeoutSec",以确认是否已在 Google Cloud 负载平衡器控制层面中设置它们。例如:

# Optionally, set a variable
export BES=k8s1-27fde173-default-my-service-80-8d4ca500

# Filter for drainingTimeoutSec and timeoutSec
gcloud compute backend-services describe ${BES} --global | grep -e "drainingTimeoutSec" -e "timeoutSec"

输出:

  drainingTimeoutSec: 60
  timeoutSec: 40

如果在输出中看到 drainingTimeoutSectimeoutSec,则确认它们的值已通过 BackendConfig 正确设置。

清理

为了防止您的帐号产生不必要的费用,请删除您为此练习创建的 Kubernetes 对象:

kubectl delete ingress my-ingress
kubectl delete service my-service
kubectl delete backendconfig my-backendconfig
kubectl delete deployment my-deployment

BackendConfig 限制

BackendConfig 存在以下限制:

  • 一个(Service,端口)对只能使用一个 BackendConfig,即使多个 Ingress 对象都引用该(Service,端口)对也是如此。这意味着,引用相同(Service,端口)对的所有 Ingress 对象都必须对 Cloud Armor、IAP 和 Cloud CDN 使用相同的配置。

  • 无法为同一 HTTP(S) 负载平衡后端服务启用 IAP 和 Cloud CDN。这意味着您不能在同一 BackendConfig 中同时配置 IAP 和 Cloud CDN。

  • 您必须使用 kubectl 1.7 或更高版本与 BackendConfig 进行交互。

移除在 FrontendConfig 或 BackendConfig 中指定的配置

要撤消某个 Ingress 特性,必须在 FrontendConfig 或 BackendConfig CRD 中明确停用特性配置。Ingress 控制器仅与这些 CRD 中指定的配置协调。

要清除或停用先前启用的配置,请将字段的值设置为空字符串 ("") 或布尔值 false,具体取决于字段类型。

以下 BackendConfig 清单会停用 Google Cloud Armor 安全政策和 Cloud CDN:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  cdn:
    enabled: false
  securityPolicy:
    name: ""

删除 FrontendConfig 或 BackendConfig

FrontendConfig

如需删除 FrontendConfig,请按照下列步骤进行操作:

  1. 从 Ingress 清单中的 networking.gke.io/v1beta1.FrontendConfig 注释中移除 FrontendConfig 的名称。

  2. 将更改后的 Ingress 清单应用到集群。例如,使用 kubectl apply

  3. 删除 FrontendConfig。例如,使用 kubectl delete frontendconfig config my-frontendconfig

BackendConfig

如需删除 BackedConfig,请按照下列步骤进行操作:

  1. 从 Service 清单中的 cloud.google.com/backend-config 注释中移除 BackendConfig 的名称。

  2. 将更改后的 Service 清单应用到集群。例如,使用 kubectl apply

  3. 删除 BackendConfig。例如,使用 kubectl delete backendconfig my-backendconfig

问题排查

找不到 BackendConfig

如果在 Service 注释中指定了 Service 端口的 BackendConfig,但找不到实际 BackendConfig 资源,那么就会发生这种错误。 如果您尚未创建 BackendConfig 资源,或在错误的命名空间中创建了该资源,或在 Service 注释中拼错了引用,那么就会发生这种情况。

要评估 Kubernetes 事件,请运行以下命令:

kubectl get event

以下类型的输出表示找不到 BackendConfig:

KIND    ... SOURCE
Ingress ... loadbalancer-controller

MESSAGE
Error during sync: error getting BackendConfig for port 80 on service "default/my-service":
no BackendConfig for service port exists

找不到安全政策

Ingress 对象创建完毕后,如果安全政策未与负载平衡器服务正确关联,请评估 Kubernetes 事件以了解是否存在配置错误。如果 BackendConfig 指定了不存在的政策,则系统会定期发出警告事件。如需解决此问题,请确保在 BackendConfig 中按名称指定正确的安全政策。

要评估 Kubernetes 事件,请运行以下命令:

kubectl get event

以下类型的输出表示找不到安全政策:

KIND    ... SOURCE
Ingress ... loadbalancer-controller

MESSAGE
Error during sync: The given security policy "my-policy" does not exist.

后续步骤