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

本教學課程將示範如何在靜態外部 IP 位址上,將網路應用程式公開到網際網路,並設定網域名稱的 DNS 記錄以指向應用程式。

本教學課程假設您擁有已註冊的網域名稱 (例如 example.com)。如果您尚未註冊網域名稱,可以透過 Google Domains 或選擇其他的網域註冊商來註冊網域名稱。

目標

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

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

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

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

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

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

為了節省您在 gcloud 指令列工具中輸入專案 IDgcloud選項的時間,建議您採用以下預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

建立 GKE 叢集

建立一個名為 domain-test 的容器叢集來部署網路應用程式:

gcloud container clusters create domain-test

步驟 1:部署網路應用程式

如要部署範例網路應用程式,請將下列的資訊清單儲存為 helloweb-deployment.yaml

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: gcr.io/google-samples/hello-app:1.0
        ports:
        - containerPort: 8080

接著執行下列指令來建立部署:

kubectl apply -f helloweb-deployment.yaml

步驟 2:公開應用程式

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

如要進一步瞭解每個方法的優缺點,請參閱 HTTP 負載平衡教學課程

步驟 2(a):使用服務

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

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

如要在 us-central1 地區建立名為 helloweb-ip 的靜態 IP 位址,請執行下列指令:

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

如要找出您建立的靜態 IP 位址,請執行下列指令:

gcloud compute addresses describe helloweb-ip --region us-central1
輸出:
address: 203.0.113.32
...

請使用下列資訊清單,建立名為 helloweb- service.yaml 的資訊清單檔案來說明服務。將 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"

然後建立服務:

kubectl apply -f helloweb-service.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

步驟 2(b):使用輸入

如果選擇使用輸入,透過建立 HTTP(S) 負載平衡器來公開應用程式,您必須預留全域靜態 IP 位址。地區性 IP 位址無法與輸入搭配使用。

如要進一步瞭解如何使用輸入將應用程式公開到網際網路,請參閱使用輸入設定 HTTP 負載平衡教學課程。

如要建立名為 helloweb-ip 的全域靜態 IP 位址,請執行下列指令:

gcloud compute addresses create helloweb-ip --global

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

gcloud compute addresses describe helloweb-ip --global
輸出:
address: 203.0.113.32
...

如要使用輸入在靜態 IP 上公開網路應用程式,您必須部署兩種資源:

  1. type:NodePortService
  2. 已設定服務名稱與靜態 IP 註解的 Ingress

使用下列資訊清單來建立名為 helloweb-ingress.yaml 的資訊清單檔案,說明下列兩種資源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  backend:
    serviceName: helloweb-backend
    servicePort: 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 註解指定要與 HTTP(S) 負載平衡器相關聯的全域 IP 位址資源名稱。

helloweb-ingress.yaml 資訊清單檔案套用到叢集:

kubectl apply -f helloweb-ingress.yaml
輸出:
ingress "helloweb" created
service "helloweb-backend" created

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

kubectl get ingress
輸出:
NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

步驟 3:造訪預留的靜態 IP 位址

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

curl http://203.0.113.32
輸出:
Hello, world!
Hostname: helloweb-3766687455-8lvqv

步驟 4:設定網域名稱記錄

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

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

網域的 DNS 記錄是由網域名稱伺服器所管理。網域名稱伺服器可能是註冊網域的位置 (也就是您的「註冊商」),或是 DNS 服務 (例如 Google Cloud DNS),或其他第三方供應商。

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

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

步驟 5:造訪您的網域名稱

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

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

host example.com
輸出:
example.com has address 203.0.113.32

此時,您可以將網路瀏覽器指向網域名稱,並造訪您的網站!

清理

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 刪除負載平衡的資源:

    kubectl delete ingress,service -l app=hello

  2. 釋出預留的靜態 IP。刪除負載平衡器之後,已預留但未使用的 IP 位址就不再免費,且需要按未使用的 IP 位址價格計費。請執行下列指令以釋出靜態 IP 資源:

    • 如果您是按照「步驟 2(a)」進行操作:

      gcloud compute addresses delete helloweb-ip --region us-central1
    • 如果您是按照「步驟 2(b)」進行操作:

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

    kubectl delete -f helloweb-deployment.yaml

  4. 等待負載平衡器刪除,也就是看見系統輸出以下指令的結果 (輸出內容不應顯示名稱中包含「helloweb」的轉送規則):

    gcloud compute forwarding-rules list

  5. 刪除容器叢集:

    gcloud container clusters delete domain-test

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 教學課程