通过 BackendConfig 配置后端服务

本页面介绍如何使用 Kubernetes Ingress 对象配置 Google Cloud 后端服务的某些属性(即 BackendConfig)。BackendConfig 是自定义资源,用于保存 Google Cloud 功能的配置信息。

概览

在 GKE 集群中,当您创建 Kubernetes Ingress 对象时,GKE 入站控制器会“唤醒”并创建 Google Cloud HTTP(S) 负载平衡器。入站控制器会配置负载平衡器,还会配置与负载平衡器关联的一项或多项后端服务

后端服务的配置信息保存在名为 BackendConfig 的自定义资源中。

要配置后端服务的属性,请执行以下操作:

  1. 创建一个 BackendConfig。
  2. 创建一个 Service,并将它的一个端口与 BackendConfig 关联。
  3. 创建一个 Ingress,并将该 Ingress 与(Service, 端口)对关联。

您可以配置的确切属性取决于您是将 Ingress 用于内部负载平衡还是外部负载平衡。

外部 HTTP(S) 负载平衡器的可配置属性

从 GKE 1.11.3-gke.18 版开始,您可以使用 Ingress 配置后端服务的以下属性:

从 GKE 1.15.3-gke.1 版开始,您可以使用 Ingress 配置后端服务的以下属性:

内部 HTTP(S) 负载平衡器的可配置属性

您可以使用 BackendConfig 来配置内部 HTTP(S) 负载平衡器,以使用另外两个功能:

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 选择默认的 Compute Engine 区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project project-id
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/zone compute-zone
  • 如果您使用的是地区级集群,请设置默认计算地区
    gcloud config set compute/region compute-region
  • gcloud 更新到最新版本:
    gcloud components update

创建一个部署

在创建 BackendConfig 和 Service 之前,您需要创建一个部署。以下是 Deployment 的清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-bsc-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

将此清单复制到名为 my-bsc-deployment.yaml 的文件,然后创建该 Deployment:

kubectl apply -f my-bsc-deployment.yaml

创建 BackendConfig

以下是 BackendConfig 的清单。该清单指定:

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

将此清单复制到名为 my-bsc-backendconfig.yaml 的文件,然后创建该 BackendConfig:

kubectl apply -f my-bsc-backendconfig.yaml

创建 Service

以下是 Service 的清单:

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

在本练习中,您需要注意有关 Service 的以下重要事项:

  • 具有 purpose: bsc-config-demo 标签的任何 Pod 都是 Service 的成员。

  • Service 的 TCP 端口 80 与名为 my-bsc-backendconfig 的 BackendConfig 相关联。这是由 cloud.google.com/backend-config 注释指定的。

  • 发送到 Service 端口 80 的请求被转发到端口 8080 上的一个成员 Pod。

将此清单保存到名为 my-bsc-service.yaml 的文件,然后创建该 Service:

kubectl apply -f my-bsc-service.yaml

创建 Ingress

以下是 Ingress 的清单:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-bsc-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: my-bsc-service
          servicePort: 80

在此清单中,您可以看到传入请求被路由到名为 my-bsc-service 的 Service 的端口 80。

将此清单复制到名为 my-bsc-ingress.yaml 的文件,然后创建该 Ingress:

kubectl apply -f my-bsc-ingress.yaml

等待几分钟,以便入站控制器配置 HTTP(S) 负载平衡器以及关联的后端服务。

查看后端服务

您可以通过使用 get service 命令或查看 Ingress YAML 文件来查看您的后端服务。

如需使用 get service 命令查看您的后端服务,请执行以下操作:

  1. 运行以下命令:

    kubectl get service my-bsc-service
    
  2. 记下输出中显示的节点端口值。例如,在以下输出中,节点端口值为 30936

    NAME             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    my-bsc-service   NodePort   10.83.15.111   none          80:30936/TCP   2m
    
  3. 列出 Cloud 项目中的后端服务:

    gcloud compute backend-services list
    
  4. 在输出中,找到后端服务的名称。此名称是包含您的 Service 节点端口的名称。例如,如果您的节点端口是 30936,那么您的后端服务的名称将类似于:

    NAME
    ...
    k8s-be-30936--078bc860bb6f7a2f
    ...
    
  5. 描述您的后端服务:

    gcloud compute backend-services describe backend-service-name --global
    

    其中 backend-service-name 是后端服务的名称。

    以下输出显示您配置的属性的值:

    connectionDraining: drainingTimeoutSec: 60 ... timeoutSec: 40
    

您还可以从 Ingress YAML 文件中找到后端服务。设置好负载平衡器之后,Ingress 控制器会添加带有命名空间、服务名称和服务端口的注释。

如需使用 Ingress YAML 文件查看您的后端服务,请执行以下操作:

  1. 打开 Ingress YAML 文件。
  2. 查看 ingress.kubernetes.io/backends 部分。例如:

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

    其中:

    • "k8s1-27fde173-default-my-bsc-service-80-8d4ca500":"HEALTHY" 针对与 my-bsc-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 表示后端运行状况良好。

设置客户端 IP 粘性

您可以使用 BackendConfig 配置客户端 IP 粘性

要进行此练习,您需要一个 VPC 原生集群。客户端 IP 亲和性仅适用于网络端点组支持的 Service,并且网络端点组需要 VPC 原生集群。

如需设置客户端 IP 亲和性,请在 BackendConfig 清单中将 affinityType 设置为 "CLIENT_IP"

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-bsc-backendconfig
spec:
  timeoutSec: 40
  connectionDraining:
    drainingTimeoutSec: 60
  sessionAffinity:
    affinityType: "CLIENT_IP"

在您的 Service 清单中,添加 cloud.google.com/neg: '{"ingress": true}' 注释:

kind: Service
metadata:
  name: my-bsc-service
  labels:
    purpose: bsc-config-demo
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
...

配置 HTTP 访问日志记录

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

如需配置访问日志记录,请使用 BackendConfig 中的 logging 字段。请注意,如果您的 GKE 版本默认访问日志记录“启用”,则无需 logging 字段即可启用日志记录。在 GKE 1.18 之前的所有版本中,访问日志记录默认为“启用”,但从 1.16.8-gke.10 开始作为可配置字段公开。如需了解版本支持规范,请参阅 logging 参考文档

以下 BackendConfig 启用访问日志记录,并将采样率设置为指定 Ingress 资源 HTTP 请求的 50%。sampleRate 是可选字段,但如果已配置,则必须设置 enable: true,否则将被解读为 enable: false

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

您可以使用 BackendConfig 配置生成的 Cookie 粘性

要进行此练习,您需要一个 VPC 原生集群。生成的 Cookie 亲和性仅适用于网络端点组支持的 Service,并且网络端点组需要 VPC 原生集群。

如需设置生成的 Cookie 亲和性,请在 BackendConfig 清单中将 affinityType 设置为 "GENERATED_COOKIE"。您还可以使用 affinityCookieTtlSec 设置 Cookie 的时间段。

sessionAffinity:
  affinityType: "GENERATED_COOKIE"
  affinityCookieTtlSec: 50

在您的 Service 清单中,添加 cloud.google.com/neg: '{"ingress": true}' 注释:

kind: Service
metadata:
  name: my-bsc-service
  labels:
    purpose: bsc-config-demo
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
...

设置用户定义的请求标头

如果您使用 Ingress 进行外部负载平衡,则可以使用 BackendConfig 来配置用户定义的请求标头

如需启用用户定义的请求标头,您需要在 BackendConfig 资源的 customRequestHeaders 属性中指定标头列表。负载平衡器会将标头添加到其转发到后端的请求。

customRequestHeaders:
  headers:
  - "X-Client-Region:{client_region}"
  - "X-Client-City:{client_city}"
  - "X-Client-CityLatLong:{client_city_lat_long}"

在您的 Service 清单中,添加 cloud.google.com/neg: '{"ingress": true}' 注释:

kind: Service
metadata:
  name: my-bsc-service
  labels:
    purpose: bsc-config-demo
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
...

设置连接排空

您可以使用 BackendConfig 配置生成的 Cookie 粘性

connectionDraining:
  drainingTimeoutSec: 60

清理

完成本页中的练习后,请按照以下步骤移除资源,以防止您的帐号产生不必要的费用:

删除您针对此练习创建的 Kubernetes 对象:

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

后续步骤