現在我們可以使用 Service 的外部 IP 取得服務,但若要正式將服務公開,需要掛上 Domain Name 方便他人存取,今天就來介紹如何在 GKE 上使用 Domain Name 公開服務。
在 GKE 上主要有兩種方式可以公開服務
使用 Service 時 GKE 會創建一個 TCP Network Load Balancer
, 並且賦予一個 Regional IP
,只要將 Domain Name 掛到 Load Balancer 的 IP 上,就能成功公開服務。
Ingress 是一種 Kubernetes 元件,可將外部 HTTP(S) 流量導入到內部 Service,使用 Ingress 時 GKE 會創建一個 HTTP(S) Load Balancer
,並且賦予一個 Global IP
,同樣的只要將 Domain Name 掛到此 IP 上,就能成功公開服務。
更多詳細內容可以查看 Configuring domain names with static IP addresses
針對上述兩種方式,大多情況我們都會使用 Ingress 來公開服務,不僅可以將外部流量入口集中在同個元件,Ingress Routing Rule 也能用來應對複雜的流量轉發需求。所以今天的 Lab 會以 Ingress 的方式來實作。
預設情況下, Ingress 創建的 Load Balancer IP 是會浮動的,若需要綁定 Domain Name ,需要先建立 Static IP,並將其跟 Ingress 綁定,下面就來實際操作看看。
進入 Cloud Shell 網站
點擊倒三角形->點選專案的 PROJECT_ID
,開啟專案 Terminal
因為有 Dev 、 Stage 、 Production 三種環境,所以可以準備三組不同的 Static IP。
gcloud compute addresses create webapp-dev-ip --global
gcloud compute addresses create webapp-stg-ip --global
gcloud compute addresses create webapp-prod-ip --global
gcloud compute addresses list
(輸出結果)
NAME: webapp-dev-ip
ADDRESS/RANGE: 35.186.239.22
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
NAME: webapp-prod-ip
ADDRESS/RANGE: 34.117.112.72
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
NAME: webapp-stg-ip
ADDRESS/RANGE: 34.96.76.172
TYPE: EXTERNAL
PURPOSE:
NETWORK:
REGION:
SUBNET:
STATUS: RESERVED
接著就可以將 IP 綁定,此步驟需要先有自己的一組 Domain Name,筆者選用的是 GoDaddy 來管理 DNS 紀錄。
A Record
對應到不同 Domain Name設定完成後, DNS 會需要一段時間才會生效,可以用 nslookup
指令查詢看看。
nslookup <one of your domain>
(輸出結果)
Server: 169.254.169.254
Address: 169.254.169.254#53
Non-authoritative answer:
Name: dev.uccuz.online
Address: 35.186.239.22
有回應 IP Address 代表運作成功。
接著就來準備 Ingrss 設置,我們會在之前的 Helm Chart 裡建立相關 yaml 檔案。
ingress.yaml
檔案cd ~/webapp && touch templates/ingress.yaml
Explorer -> Open Folder -> 選擇 webapp 資料夾 -> Open
templates/ingress.yaml
檔案並以下面內容取代apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Release.Name }}
annotations:
kubernetes.io/ingress.global-static-ip-name: {{ .Values.ingress.ip }}
spec:
rules:
- host: "{{ .Values.ingress.domain }}"
http:
paths:
- path: /
backend:
serviceName: {{ .Release.Name }}
servicePort: 80
{{ .Values.ingress.ip }}
以及 {{ .Values.ingress.domain }}
需要在 values 檔案中配置
之前的章節我們針對不同環境建立各自的 values 檔案,這裡就可以設置不同的 IP 以及 Domain Name。
<your domain name>
改成你的 Domain Name service:
type: NodePort
port: 80
ingress:
ip: webapp-dev-ip
domain: <your dev domain name>
service:
type: NodePort
port: 80
ingress:
ip: webapp-stage-ip
domain: <your stage domain name>
service:
type: NodePort
port: 80
ingress:
ip: webapp-prod-ip
domain: <your production domain name>
使用 Ingress 時需要將 Service Type 改為 NodePort
cd ~/webapp
helm upgrade webapp-dev .
(輸出結果)
Release "webapp-dev" has been upgraded. Happy Helming!
NAME: webapp-dev
LAST DEPLOYED: Sat Sep 25 16:45:00 2021
NAMESPACE: default
STATUS: deployed
REVISION: 3
TEST SUITE: None
部屬完成後,可以檢查 Ingress 是否成功建立。
kubectl get ingress
(輸出結果)
NAME CLASS HOSTS ADDRESS PORTS AGE
webapp-dev <none> dev.uccuz.online 35.186.239.22 80 93s
可以看到 Ingress 已經與 Domain Name 以及 IP Address 做綁定,到瀏覽器測試看看。
<your dev domain name>
成功透過 Domain Name 取得服務。
有可能出現 404. That’s an error.,可以等待一段時間再嘗試看看。