本页面介绍如何使用 Kubernetes Ingress 和 Service 对象配置外部应用负载均衡器,以使用 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
以获取最新版本。
- 了解 Kubernetes Ingress 和 Service 资源。
- 了解外部应用负载均衡器的 HTTP/2 限制。
创建 Deployment
将以下清单复制到名为
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。将清单应用到您的集群:
kubectl apply -f my-deployment.yaml
创建 Service
将以下清单复制到名为
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: 443
、protocol: TCP
和targetPort: 8433
:指定定向到 TCP 端口 443 上的 Service 的流量应路由到其中一个成员 Pod 上的 TCP 端口 8422。
将清单应用到您的集群:
kubectl apply -f my-service.yaml
查看 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
将以下清单复制到名为
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。在本练习中,PodtargetPort
为8443
。将清单应用到您的集群:
kubectl apply -f my-ingress.yaml
Kubernetes Ingress 控制器配置应用负载均衡器时,此命令可能需要几分钟才能完成。
查看 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
列出您的后端服务:
gcloud compute backend-services list
描述您的后端服务:
gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
将
BACKEND_SERVICE_NAME
替换为您的后端服务的名称。输出指定
protocol
为HTTP2
:backends: ... description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}' ... kind: compute#backendService loadBalancingScheme: EXTERNAL protocol: HTTP2 ...
控制台
进入 Google Cloud 控制台中的负载均衡页面。
在名称下,找到您的负载均衡器。
点击负载均衡器的名称以查看后端服务。
验证后端服务的端点协议是否为 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。
后续步骤
使用 Ingress 为应用配置静态 IP 地址和域名。
为 Ingress 负载均衡器配置 SSL 证书。