本頁說明如何使用 Kubernetes Ingress 和 Service 物件,設定外部應用程式負載平衡器,以使用 HTTP/2 與後端服務通訊。
總覽
應用程式負載平衡器是用戶端與應用程式間的 Proxy。用戶端可以使用 HTTP/1.1 或 HTTP/2 與負載平衡器 Proxy 進行通訊。但是,負載平衡器 Proxy 與應用程式間的連結預設使用 HTTP/1.1。如果您在 Google Kubernetes Engine (GKE) Pod 中執行的應用程式能夠接收 HTTP/2 要求,則您可以將外部負載平衡器設定為使用 HTTP/2 將要求轉發給您的應用程式。
在本練習中,您將建立部署、服務和 Ingress。您會在服務清單中新增 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
網路應用程式副本的部署。將資訊清單套用至叢集:
kubectl apply -f my-deployment.yaml
建立服務
將下列資訊清單複製到名為
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 類型的服務。app: echoheaders
:指定具有這個標籤的任何 Pod 都是 Service 的成員。cloud.google.com/app-protocols
:指定my-port
應使用 HTTP/2 通訊協定。port: 443
、protocol: TCP
和targetPort: 8433
:指定導向 TCP 通訊埠 443 上服務的流量,應轉送到其中一個成員 Pod 中的 TCP 通訊埠 8443。
將資訊清單套用至叢集:
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,該 Ingress 會指定傳入要求傳送至
echoheaders
Service 的成員 Pod。要求會轉送到echoheaders
服務資訊清單中指定的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 控制台的「Load balancing」(負載平衡) 頁面。
在名稱下,找到負載平衡器。
按一下負載平衡器的名稱以查看您的後端服務。
驗證後端服務的端點協議是否為 HTTP/2。
呼叫您的服務
請稍候幾分鐘,讓 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 憑證。