将 HTTP/2 与 Ingress 搭配使用来实现负载均衡


本页面介绍如何使用 Kubernetes IngressService 对象配置外部应用负载均衡器,以使用 HTTP/2 与后端服务进行通信。

概览

应用负载均衡器充当您的客户端和应用之间的代理。客户端可以使用 HTTP/1.1 或 HTTP/2 与负载均衡器代理进行通信。但是,从负载均衡器代理到应用的连接默认使用 HTTP/1.1。如果在 Google Kubernetes Engine (GKE) Pod 中运行的应用能够接收 HTTP/2 请求,则可以将外部负载均衡器配置为在向应用转发请求时使用 HTTP/2。

在本练习中,您将创建 Deployment、Service 和 Ingress。您在 Service 清单中添加了一个 cloud.google.com/app-protocols 注释,指定负载均衡器应使用 HTTP/2 与您的应用进行通信。 然后,调用服务并验证应用已收到 HTTP/2 请求。

准备工作

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

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

创建 Deployment

  1. 将以下清单复制到名为 my-deployment.yaml 的文件中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echoheaders
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: echoheaders
      template:
        metadata:
          labels:
            app: echoheaders
        spec:
          containers:
          - name: echoheaders
            image: registry.k8s.io/echoserver:1.10
            ports:
            - containerPort: 8443
    

    此清单描述了一个具有 echoheaders Web 应用的两个副本的 Deployment。

  2. 将清单应用到您的集群:

    kubectl apply -f my-deployment.yaml
    

创建 Service

  1. 将以下清单复制到名为 my-service.yaml 的文件中:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
      name: echoheaders
      labels:
        app: echoheaders
    spec:
      type: NodePort
      ports:
      - port: 443
        targetPort: 8443
        protocol: TCP
        name: my-port
      selector:
        app: echoheaders
    

    此清单描述了具有以下属性的 Service:

    • type: NodePort:指定这是 NodePort 类型的 Service。
    • app: echoheaders:指定具有此标签的任何 Pod 都是 Service 的成员。
    • cloud.google.com/app-protocols:指定 my-port 应使用 HTTP/2 协议。
    • port: 443protocol: TCPtargetPort: 8433:指定定向到 TCP 端口 443 上的 Service 的流量应路由到其中一个成员 Pod 上的 TCP 端口 8422。
  2. 将清单应用到您的集群:

    kubectl apply -f my-service.yaml
    
  3. 查看 Service:

    kubectl get service echoheaders --output yaml
    

    输出类似于以下内容:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
        ...
      labels:
        app: echoheaders
      name: echoheaders
      ...
    spec:
      clusterIP: 10.39.251.148
      ...
      ports:
      - name: my-port
        nodePort: 30647
        port: 443
        protocol: TCP
        targetPort: 8443
      selector:
        app: echoheaders
      ...
      type: NodePort
    ...
    

创建 Ingress

  1. 将以下清单复制到名为 my-ingress.yaml 的文件中:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echomap
    spec:
      defaultBackend:
        service:
          name: echoheaders
          port:
            number: 443
    

    此清单描述了一个 Ingress,指定传入请求会发送到 echoheaders Service 的成员 Pod。请求会路由到在 echoheaders Service 清单中指定的 targetPort 上的 Pod。在本练习中,Pod targetPort8443

  2. 将清单应用到您的集群:

    kubectl apply -f my-ingress.yaml
    

    Kubernetes Ingress 控制器配置应用负载均衡器时,此命令可能需要几分钟才能完成。

  3. 查看 Ingress:

    kubectl get ingress echomap --output yaml
    

    输出类似于以下内容:

    kind: Ingress
    metadata:
      ...
      name: echomap
      ...
    spec:
      backend:
        serviceName: echoheaders
        servicePort: 443
    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.2
    

    在此输出中,Ingress 的 IP 地址为 203.0.113.2

测试负载均衡器

gcloud

  1. 列出您的后端服务:

    gcloud compute backend-services list
    
  2. 描述您的后端服务:

    gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
    

    BACKEND_SERVICE_NAME 替换为您的后端服务的名称。

    输出指定 protocolHTTP2

    backends:
    ...
    description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}'
    ...
    kind: compute#backendService
    loadBalancingScheme: EXTERNAL
    protocol: HTTP2
    ...
    

控制台

  1. 进入 Google Cloud 控制台中的负载均衡页面。

    进入“负载均衡”

  2. 名称下,找到您的负载均衡器。

  3. 点击负载均衡器的名称以查看后端服务。

  4. 验证后端服务的端点协议是否为 HTTP/2

调用 Service

等待几分钟,让 GKE 配置负载均衡器和后端服务,然后在浏览器的地址栏中输入负载均衡器的外部 IP 地址。

输出类似于以下内容:

Hostname: echoheaders-7886d5bc68-xnrwj
...
Request Information:
  ...
  method=GET
  real path=/
  query=
  request_version=2
  request_scheme=https
  ...

Request Headers:
  ...
  x-forwarded-for=[YOUR_IP_ADDRESS], 203.0.113.2
  x-forwarded-proto=http
...

此输出有关从负载均衡器到 Pod 的请求的信息:

  • request_version=2:表示负载均衡器与 Pod 之间的请求使用了 HTTP/2。
  • x-forwarded-proto=http:表示浏览器与负载均衡器之间的请求使用了 HTTP 1.1,而不是 HTTP/2。

后续步骤