上一回我們使用 Pod 將應用程式部屬到 Kubernetes 環境裡,今天會介紹如何透過 Service 元件讓應用程式可以從外部存取。
Service 是 Kubernetes 內部的基礎元件,負責定義如何存取 Pod 規則。不管是內部的溝通,或者是外部的服務暴露,都會使用到 Service 來作為 Pod 的進入點。而根據使用狀況,會使用到不同類型的 Service ,主要有以下三種。
ClusterIP 是 Service 的默認類型,使內部可以訪問該服務,而外部則無法存取。通常會使用在如後端伺服器這種只允許內部存取的應用。
NodePort 是一種對外服務的方式,會在所有節點上開放一個連接埠(預設是30000 ~ 32767),發送到該端口的流量就會被轉發到對應服務。因為需要暴露主機位址才能使用,所以大多只用於測試或是 Demo。
LoadBalancer 會跟外部的 Load Balancer 服務搭配,是雲端上暴露服務的標準方式。在 GKE 上使用會提供一個外部 IP ,透過此 IP 就能將流量轉發到你的服務上。
就來試著建置 Service 元件,我們會建立一個類型為 LoadBalancer
的 Service,就可以透過 IP 存取服務。
進入 Cloud Shell 網站,點擊終端機輸入指令
列出所有的 project ,找到之前所創建專案的 PROJECT_ID
gcloud projects list
PROJECT_ID
,開啟專案 Terminal建置元件的方式一樣透過 yaml 檔來定義。
myservice.yaml
檔案cd ~/k8s-test && touch myservice.yaml
還記得上回 mypod.yaml
檔案裡設置的 Label,根據標籤可將 Pod 做分群管理,Service 如何把流量導入到正確的 Pod 上,就是使用 Label Selector , 根據設定的標籤來尋找到對應的 Pod。
mypod.yaml
檔案裡設置的 Label可以看到設置了一個Label app=myapp
,所以只要在 Service 的 Label Selector 也設定同樣標籤,就能成功將流量轉發到此 Pod 上。
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
spec
ports
selector
myservice.yaml
建立元件kubectl apply -f myservice.yaml
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 可以忽略。myservice
的EXTERNAL-IP
欄位顯示是<pending>
,需要等待大約2-3分鐘才能拿到IP。
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,就能存取服務了。
http://<EXTERNAL-IP>
看到伺服器回傳訊息,代表可以存取到 Pod 了。
今天學習到了 Kubernetes 基本的網路元件 Service,有興趣的話可以搜尋 Ingress、Service Mesh 等關鍵字,能夠了解到更多 K8s 網路的解決方案。