iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
DevOps

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

Day13 - Google Kubernetes Engine 基礎 - 使用 Service 暴露服務

前言

上一回我們使用 Pod 將應用程式部屬到 Kubernetes 環境裡,今天會介紹如何透過 Service 元件讓應用程式可以從外部存取。

Service 元件介紹

Service 是 Kubernetes 內部的基礎元件,負責定義如何存取 Pod 規則。不管是內部的溝通,或者是外部的服務暴露,都會使用到 Service 來作為 Pod 的進入點。而根據使用狀況,會使用到不同類型的 Service ,主要有以下三種。

ClusterIP

ClusterIP 是 Service 的默認類型,使內部可以訪問該服務,而外部則無法存取。通常會使用在如後端伺服器這種只允許內部存取的應用。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235lDsDMEzZxb.png

NodePort

NodePort 是一種對外服務的方式,會在所有節點上開放一個連接埠(預設是30000 ~ 32767),發送到該端口的流量就會被轉發到對應服務。因為需要暴露主機位址才能使用,所以大多只用於測試或是 Demo。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235978hHZAc5d.png

LoadBalancer

LoadBalancer 會跟外部的 Load Balancer 服務搭配,是雲端上暴露服務的標準方式。在 GKE 上使用會提供一個外部 IP ,透過此 IP 就能將流量轉發到你的服務上。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235u6pIVoB847.png

透過 Service 暴露服務

就來試著建置 Service 元件,我們會建立一個類型為 LoadBalancer 的 Service,就可以透過 IP 存取服務。

  1. 進入 Cloud Shell 網站,點擊終端機輸入指令

  2. 列出所有的 project ,找到之前所創建專案的 PROJECT_ID

gcloud projects list

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

建置元件的方式一樣透過 yaml 檔來定義。

  1. 建立 myservice.yaml 檔案
cd ~/k8s-test && touch myservice.yaml
  1. 點擊左上 Explorer -> Open Folder -> 選擇 k8s-test 資料夾 -> Open

還記得上回 mypod.yaml 檔案裡設置的 Label,根據標籤可將 Pod 做分群管理,Service 如何把流量導入到正確的 Pod 上,就是使用 Label Selector , 根據設定的標籤來尋找到對應的 Pod。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235BPTmDaETsG.png

  1. 查看 mypod.yaml 檔案裡設置的 Label

https://ithelp.ithome.com.tw/upload/images/20210912/201392356MSSsec9Sq.png

可以看到設置了一個Label app=myapp,所以只要在 Service 的 Label Selector 也設定同樣標籤,就能成功將流量轉發到此 Pod 上。

  1. 點擊myservice.yaml檔案並貼上以下內容

https://ithelp.ithome.com.tw/upload/images/20210912/201392359wKivLBCZz.png

  • myservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: myapp
  • apiVersion
    • 該元件的版本號,根據要建立的元件而定
  • kind
    • 要建立的元件
  • metadata
    • name: 指定 Service 的名稱
  • spec
    • type: 指定 Service 的型別
    • ports
      • protocol: 可以使用 TCP 或 UDP 兩種 Protocol
      • port: 對外部開放的 Port
      • targetPort: 對應到 Pod 的那個 Port
    • selector
      • 根據 Label 找出對應的 Pod
  1. 根據myservice.yaml建立元件
kubectl apply -f myservice.yaml
  1. 使用kubectl get <type>查看 Services 元件。
kubectl get svc

(輸出結果)

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>        443/TCP        24h
myservice    LoadBalancer   10.3.253.46   <pending>     80:30254/TCP   5s

第一個為 kubernetes 內部的 Service 可以忽略。myserviceEXTERNAL-IP欄位顯示是<pending>,需要等待大約2-3分鐘才能拿到IP。

  1. 等待一段時間( 約2-3分鐘 )後查看 Services 元件
kubectl get svc

(輸出結果)

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>          443/TCP        24h
myservice    LoadBalancer   10.3.253.46   34.150.28.184   80:30254/TCP   2m41s

有了外部IP,就能存取服務了。

  1. 開啟瀏覽器,輸入網址後送出
http://<EXTERNAL-IP>

看到伺服器回傳訊息,代表可以存取到 Pod 了。

https://ithelp.ithome.com.tw/upload/images/20210912/20139235gOicrbtalC.png

總結

今天學習到了 Kubernetes 基本的網路元件 Service,有興趣的話可以搜尋 Ingress、Service Mesh 等關鍵字,能夠了解到更多 K8s 網路的解決方案。


上一篇
Day12 - Google Kubernetes Engine 基礎 - Pod 建置
下一篇
Day14 - Google Kubernetes Engine 基礎 - Deployment 介紹
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言