使用靜態 IP 位址設定網域名稱


本教學課程將示範如何使用 Google Kubernetes Engine (GKE),在靜態外部 IP 位址上將網路應用程式公開到網際網路,並設定指向應用程式的網域名稱。

本教學課程假設您擁有已註冊的網域名稱,例如 example.com

目標

本教學課程將示範以下步驟:

  • 預留應用程式的靜態外部 IP 位址
  • 設定服務輸入資源使用靜態 IP 位址
  • 更新網域名稱的 DNS 記錄來指向應用程式。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 前往 Google Cloud 控制台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。 這可能需要幾分鐘的時間。
  4. Make sure that billing is enabled for your Google Cloud project.

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud 包含在 gcloud CLI 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 安裝 kubectl
    gcloud components install kubectl

從 GitHub 複製程式碼範例:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app/manifests 

設定 gcloud 指令列工具的預設設定

如要節省在 gcloud 指令列工具中輸入專案 IDCompute Engine 區域選項的時間,可以採用預設設定:
 gcloud config set project project-id gcloud config set compute/zone compute-zone

建立叢集

建立叢集:

gcloud container clusters create-auto domain-test 

部署網頁應用程式

下列資訊清單說明執行範例網路應用程式容器映像檔的部署:

apiVersion: apps/v1 kind: Deployment metadata:   name: helloweb   labels:     app: hello spec:   selector:     matchLabels:       app: hello       tier: web   template:     metadata:       labels:         app: hello         tier: web     spec:       containers:       - name: hello-app         image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0         ports:         - containerPort: 8080         resources:           requests:             cpu: 200m

建立 Deployment:

kubectl apply -f helloweb-deployment.yaml 

公開應用程式

您可以使用下列任一方法,在 GKE 上公開應用程式:

如要進一步瞭解各方法的優缺點,請參閱「使用 Ingress 設定外部應用程式負載平衡器」。

使用服務

如要確保應用程式具有靜態外部 IP 位址,您必須預留靜態 IP 位址

如果您選擇使用服務公開應用程式,則必須建立地區性 IP 位址。全球 IP 位址僅適用於 Ingress 資源類型,下節將有說明。

如要使用服務,請在 us-central1 地區中建立名為 helloweb-ip 的靜態 IP 位址:

gcloud

gcloud compute addresses create helloweb-ip --region us-central1 

找出您建立的靜態 IP 位址:

gcloud compute addresses describe helloweb-ip --region us-central1 

輸出結果會與下列內容相似:

... address: 203.0.113.32 ... 

設定連接器

附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

apiVersion: compute.cnrm.cloud.google.com/v1beta1 kind: ComputeAddress metadata:   name: helloweb-ip spec:   location: us-central1

將資訊清單儲存為 compute-address-regional.yaml

將資訊清單套用至叢集:

  kubectl apply -f compute-address-regional.yaml 

找出您建立的靜態 IP 位址:

  kubectl get computeaddress helloweb-ip -o jsonpath='{.spec.address}' 

下列資訊清單說明 LoadBalancer 類型的服務,這項服務會建立外部直通網路負載平衡器,以外部 IP 位址公開 Pod。

YOUR.IP.ADDRESS.HERE 替換為靜態 IP 位址:

apiVersion: v1 kind: Service metadata:   name: helloweb   labels:     app: hello spec:   selector:     app: hello     tier: web   ports:   - port: 80     targetPort: 8080   type: LoadBalancer   loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

建立 Service:

kubectl apply -f helloweb-service-static-ip.yaml 

查看與負載平衡器相關聯的預留 IP 位址:

kubectl get service 

輸出結果會與下列內容相似:

NAME               CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE helloweb           10.31.254.176   203.0.113.32     80:30690/TCP     54s 

使用 Ingress

如果選擇使用輸入公開應用程式,您必須預留全域靜態 IP 位址。使用 kubernetes.io/ingress.global-static-ip-name 註解指定全域 IP 位址。

如要向區域中的用戶端和服務公開應用程式,請在部署 GKE 的內部 Ingress 資源時,使用區域靜態內部 IP 位址,並提供必要註解

如要瞭解如何使用 Ingress 將應用程式公開到網際網路,請參閱使用 Ingress 設定外部應用程式負載平衡器

如何建立名為 helloweb-ip 的全球靜態 IP 位址:

gcloud

gcloud compute addresses create helloweb-ip --global 

找出您建立的靜態 IP 位址:

gcloud compute addresses describe helloweb-ip --global 

輸出結果會與下列內容相似:

... address: 203.0.113.32 ... 

設定連接器

附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

apiVersion: compute.cnrm.cloud.google.com/v1beta1 kind: ComputeAddress metadata:   name: helloweb-ip spec:   location: global

將資訊清單儲存為 compute-address-global.yaml

將資訊清單套用至叢集:

  kubectl apply -f compute-address-global.yaml 

下列資訊清單說明 Ingress,該 Ingress 會透過兩種資源,在靜態 IP 上公開網路應用程式:

  • 具有 type:NodePortService
  • 已設定服務名稱與靜態 IP 註解的 Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata:   name: helloweb   annotations:     kubernetes.io/ingress.global-static-ip-name: helloweb-ip   labels:     app: hello spec:   defaultBackend:     service:       name: helloweb-backend       port:         number: 8080 --- apiVersion: v1 kind: Service metadata:   name: helloweb-backend   labels:     app: hello spec:   type: NodePort   selector:     app: hello     tier: web   ports:   - port: 8080     targetPort: 8080

kubernetes.io/ingress.global-static-ip-name 註解指定要與負載平衡器相關聯的全域 IP 位址資源名稱。

將資訊清單套用至叢集:

kubectl apply -f helloweb-ingress-static-ip.yaml 

查看與負載平衡器相關聯的 IP 位址:

kubectl get ingress 

輸出內容類似如下

NAME       HOSTS     ADDRESS          PORTS     AGE helloweb   *         203.0.113.32     80        4m 

查看預留的靜態 IP 位址

若要驗證負載平衡器的設定正確無誤,您可以使用網路瀏覽器造訪 IP 位址,或使用 curl

curl http://203.0.113.32/ 

輸出結果會與下列內容相似:

Hello, world! Hostname: helloweb-3766687455-8lvqv 

設定網域名稱記錄

如要讓查詢網域名稱 (例如 example.com) 或子網域名稱 (例如 blog.example.com) 的瀏覽器指向預留的靜態 IP 位址,您必須更新網域名稱的 DNS (網域名稱伺服器) 記錄。

您必須為網域或子網域名稱建立「A」 (位址) 類型的 DNS 記錄,並使用預留的 IP 位址設定 DNS 記錄的值。

網域的 DNS 記錄是由網域名稱伺服器所管理。網域名稱伺服器可能是您註冊網域的「註冊商」、Cloud DNS 等 DNS 服務,或其他第三方供應商。

  • 如果網域名稱伺服器是 Cloud DNS:請按照 Cloud DNS 快速入門指南操作,使用應用程式的預留 IP 位址來設定網域名稱的 DNS A 記錄。

  • 如果網域名稱伺服器是其他供應商:請參閱 DNS 供應商的文件,瞭解如何設定 DNS A 記錄來設定網域名稱。如果您選擇改用 Cloud DNS,請參閱「遷移至 Cloud DNS」。

造訪您的網域名稱

如要驗證網域名稱的 DNS A 記錄是否會解析成預留的 IP 位址,請造訪您的網域名稱。

如要進行網域名稱 A 記錄的 DNS 查詢,請執行 host 指令:

host example.com 

輸出結果會與下列內容相似:

example.com has address 203.0.113.32 

現在,您可以將網路瀏覽器指向網域名稱,並造訪您的網站。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  1. 刪除 Service 和 Ingress:

    kubectl delete ingress,service -l app=hello 
  2. 釋出預留的靜態 IP。刪除負載平衡器之後,已預留但未使用的 IP 位址就會按未使用的 IP 位址價格計費。

    • 如果您使用服務:

      gcloud compute addresses delete helloweb-ip --region us-central1 
    • 如果您使用 Ingress:

      gcloud compute addresses delete helloweb-ip --global 
  3. 刪除範例應用程式:

    kubectl delete -f helloweb-deployment.yaml 
  4. 刪除叢集:

    gcloud container clusters delete domain-test 

後續步驟