iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 26

Day26 - 替 Kubernetes 服務掛上心愛的 Domain

前言

現在我們可以使用 Service 的外部 IP 取得服務,但若要正式將服務公開,需要掛上 Domain Name 方便他人存取,今天就來介紹如何在 GKE 上使用 Domain Name 公開服務。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235vfblMorRfm.png

公開服務方式

在 GKE 上主要有兩種方式可以公開服務

  • Service of type loadBalancer
  • Ingress

使用 Service 時 GKE 會創建一個 TCP Network Load Balancer , 並且賦予一個 Regional IP ,只要將 Domain Name 掛到 Load Balancer 的 IP 上,就能成功公開服務。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235qOWDEsH9au.png

Ingress 是一種 Kubernetes 元件,可將外部 HTTP(S) 流量導入到內部 Service,使用 Ingress 時 GKE 會創建一個 HTTP(S) Load Balancer ,並且賦予一個 Global IP ,同樣的只要將 Domain Name 掛到此 IP 上,就能成功公開服務。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235eRKwXaUNhb.png

更多詳細內容可以查看 Configuring domain names with static IP addresses

針對上述兩種方式,大多情況我們都會使用 Ingress 來公開服務,不僅可以將外部流量入口集中在同個元件,Ingress Routing Rule 也能用來應對複雜的流量轉發需求。所以今天的 Lab 會以 Ingress 的方式來實作。

建立 Static IP 以及 Domain Name

預設情況下, Ingress 創建的 Load Balancer IP 是會浮動的,若需要綁定 Domain Name ,需要先建立 Static IP,並將其跟 Ingress 綁定,下面就來實際操作看看。

  1. 進入 Cloud Shell 網站

  2. 點擊倒三角形->點選專案的 PROJECT_ID,開啟專案 Terminal

因為有 Dev 、 Stage 、 Production 三種環境,所以可以準備三組不同的 Static IP。

  1. 建立 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
  1. 列出所有 IP
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 紀錄。

  1. 在 DNS 上設定 A Record 對應到不同 Domain Name

https://ithelp.ithome.com.tw/upload/images/20210926/20139235w2DPcjmHyG.png

設定完成後, DNS 會需要一段時間才會生效,可以用 nslookup 指令查詢看看。

  1. 檢查 DNS 是否運作成功
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 代表運作成功。

建立 Ingress Controller

接著就來準備 Ingrss 設置,我們會在之前的 Helm Chart 裡建立相關 yaml 檔案。

  1. 在 Helm chart 建立 ingress.yaml 檔案
cd ~/webapp && touch templates/ingress.yaml
  1. 點擊左上 Explorer -> Open Folder -> 選擇 webapp 資料夾 -> Open

  1. 點擊 templates/ingress.yaml 檔案並以下面內容取代

https://ithelp.ithome.com.tw/upload/images/20210926/20139235n5yO6PVTgJ.png

  • 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。

  1. 在不同 values 檔案並貼上以下內容,並將 <your domain name> 改成你的 Domain Name

https://ithelp.ithome.com.tw/upload/images/20210926/20139235JZL0Bvq7GJ.png

  • values.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-dev-ip
  domain: <your dev domain name>

https://ithelp.ithome.com.tw/upload/images/20210926/20139235ZmGxY2VcZ6.png

  • values.stage.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-stage-ip
  domain: <your stage domain name>

https://ithelp.ithome.com.tw/upload/images/20210926/20139235WXTE03YJU0.png

  • values.production.yaml 修改部分
  service:
    type: NodePort
    port: 80

ingress:
  ip: webapp-prod-ip
  domain: <your production domain name>

使用 Ingress 時需要將 Service Type 改為 NodePort

  1. 更新 Helm Chart
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 是否成功建立。

  1. 檢查 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 做綁定,到瀏覽器測試看看。

  1. 到瀏覽器輸入網址
<your dev domain name>

成功透過 Domain Name 取得服務。

https://ithelp.ithome.com.tw/upload/images/20210926/20139235vfJ8aTsMOH.png

有可能出現 404. That’s an error.,可以等待一段時間再嘗試看看。


上一篇
Day25 - 如何安全的把 Kubernetes Secret 儲存到 Git Repository
下一篇
Day27 - 在 Kubernetes Ingress 掛上 Google SSL 憑證
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言