使用靜態 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
    

後續步驟