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

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

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

部署網頁應用程式

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

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

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