Kubernetes Service 介紹

Service 主要用途之一就是用來服務應用程式。舉例來說,當群集內的服務(如:資料庫、web server等)因意外重新開機後,每個POD中的IP可能會因此而改變,但應用程式卻需要透過已知的IP來進行連線,但卻會因為IP的改變,而導致服務失效,因此,便有Service來讓這些服務間溝通不因為IP改變而中斷。

service 的概念非常簡單,將整個IP地址與連線的方法給分層次處理,透過綁定特定應用程式,並自行追蹤與更新應用程式的IP(類似DNS功能),對外提供FQDN給應用程式來連線。

ClusterIP

ClusterIP 的意思就是只有集群內的應用程式可以透過該組 FQDN 去存取背後的服務。
在此情況下,除了透過kubernetes去部屬的應用程式外,預設情況下都沒有辦法透過該FQDN去存取,即使你直接使用了kubernetes dns來問到對應的IP地址也沒有辦法。

NodePort

NodePort 本身包含了 ClusterIP 的能力,此外多提供了一種能力讓非集群的應用程式也有辦法存取集群內的應用程式。
舉例來說,我們可以部屬多個網頁伺服器,然後透過 NodePort 的方式讓外部的電腦(瀏覽器)來存取這些在 kubernetes 集群內的網頁伺服器。

由前面我們知道,kubernetes service 務提供的 FQDN 只能供集群內的應用程式去存取。
那要如何達到非集群的應用程式也能夠存取集群內的應用程式?
這邊就如同其字面NodePort一樣,任何非集群內的應用程式都可以透過存取集群節點上的特定Port轉而存取到集群內的應用服務。

範例

  • 部屬 Nginx與Ubuntu
$kubectl apply -f services/deployment/nginx.yml
deployment.apps/k8s-nginx created
vortex-dev:04:16:17 [~/go/src/github.com/hwchiu/kubeDemo](master)vagrant
$kubectl apply -f services/application/ubuntu.yml
pod/ubuntu created
  • 部屬Cluster IP
$kubectl apply -f services/service/nginx-cluster.yml
service/k8s-nginx-cluster created

// services/service/nginx-cluster.yml 檔案的內容

apiVersion: v1
kind: Service
metadata:
  name: k8s-nginx-cluster
  labels:
    run: k8s-nginx-cluster
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: k8s-nginx
  • 測試
$kubectl exec ubuntu curl -- -s k8s-nginx-cluster.default

參考資料