將運行在一組 Pod 上的應用程式公開為網路服務的方法。換句話說,由於 Pod 創建好後,並無法直接與外界溝通,所以我們需要在 Pod 前面再接一層橋樑,確保每次想存取應用程式時,都能連結到正在運行的 Pod。

另一個原因是,應該可以發現Pod的生命週期是非常動態的。以應用程式升級(rollout)為例, Deployment 會先創建新的 Pod 去取代現有的 Pod ,也因此我們需要一個中間橋樑,來確保使用者(end user)或是其他應用服務,可以在該應用程式升級時,仍可以連到該應用程式中可用的 Pod。

基本YAML file設定

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort # 指定Service的類別
  ports:
	- port: 3000 # 創建的Service的Cluster IP,是哪個port去對應到targetPort
		targetPort: 3000 # 指定要連接的Pod之port number
	  nodePort: 30390 # Type為NodePort時,指定Node是哪一個port去對應到targetPort
    protocol: TCP # 支援TCP與UDP兩種protocl
  selector:
    app: my-deployment # 必須要跟欲連接的服務之Label一致 ([deployment設定點此](<https://relic-beast-cc3.notion.site/Deployments-b5bfb081b40d466d8aa9a8ab23af2cdb>))

Type

Service 有幾個不同的類型,以不同的方式將應用程式與外界串連起來,下面就來看這幾種連接方式:

ClusterIP

為默認的類型,讓 Kubernetes Cluster 中的其他服務,可以透過這個 ClusterIp 訪問到正在運行的Pods。相對的,外部無法直接訪問,不過可以使用 Kubernetes Proxy 來訪問它。

在每次創建 Service 時, Kubernetes 就會預設一組 Virtual IP 給 Service 。除非我們指定想要的 Virtual IP ,否則 Kubernetes 每次產生的 Service 物件都會被隨機指定一組 Virtual IP。

使用場景

有幾種情況可以使用 Kubernetes Proxy 來訪問您的服務:

由於此方法要求您用已授權用戶運行 kubectl ,因此不應該使用此方法將服務公開到網上或將其用於 Production 環境。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c6b84e07-bd5b-4b7a-8f2b-5e1dfbd2d2fa/K8s-service.jpg

NodePort

創建一個 NodePort ,讓在 Kubernetes Cluster 外但在同一個 Node 上的其他服務或使用者,可以透過這個 NodePort 直接訪問到 Kubernetes Cluster 內正在運行中的 Pods 。 NodePort 會在節點(Node, VM)上打開一個特定的端口,並且發送到此端口的任何流量都將轉發到該服務。

在 Kubernetes 預設的 Service 中, Service 可以指定的 nodePort 只有30000~32767,如果我們需要修改可以指定的 nodePort range ,可以在 Node 一開始創建中指定。

這種方法有許多缺點