發生了一件悲慘的事情,昨天忘了發文,
按規定應該是失格了。。。
但秉持著鐵人的精神,我還是會盡力完賽的 🥹
--- 我是分隔線 ---
前一篇我們介紹了 StatefulSet 與 Headless Service,解釋了如何在 Kubernetes 中運行有狀態服務。但光有 Pod 與 StatefulSet 還不夠 —— Pod 的 IP 會隨著重建而改變,那麼服務之間要怎麼穩定地互相存取呢?
這時候就要登場的角色是 Service。它能為 Pod 提供固定入口,並且幫忙處理流量導向,是 Kubernetes 網路的核心之一。
在這篇文章中,我們會深入了解 Kubernetes Service 的三種主要型態:ClusterIP、NodePort、LoadBalancer,並搭配實作範例,讓你更直觀地理解其運作方式。
下一篇(Day12)我們會進一步探討 DNS 與 Service Discovery,說明 Kubernetes 如何讓服務之間能夠用「名字」彼此找到。
在 Kubernetes 中,Pod 的生命週期是短暫的:當 Pod 被刪除或重新建立時,它的 IP 位址也會隨之改變。這就會帶來一個問題:
👉 其他服務如果直接依賴 Pod IP,就會遇到「找不到 Pod」的情況。
Service 的出現就是為了解決這個問題:
接下來,我們就來看看三種常見的 Service 型態。
三種主要 Service 類型
我們用一個簡單的 nginx Deployment 來示範三種 Service 類型。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
建立後,可以用 kubectl get pods -l app=nginx 確認 Pod 狀態。
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
測試方式:
kubectl exec -it <any-pod> -- curl nginx-clusterip:80
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
測試方式:
curl <NodeIP>:30080
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
測試方式:
kubectl get svc nginx-lb
# 會看到一個 EXTERNAL-IP
curl <EXTERNAL-IP>
類型 存取範圍 適用場景 優點 缺點
ClusterIP 叢集內部 微服務間通訊 簡單、預設 無法對外提供服務
NodePort 外部(NodeIP+Port) 測試、小型服務 不需雲端 LB Port 管理麻煩、功能有限
LoadBalancer 外部(公網 IP) 正式上線服務 自動化、公網入口 依賴雲端或額外工具
在這一篇,我們學會了 Kubernetes Service 的三種基礎型態:ClusterIP、NodePort、LoadBalancer。
👉 下一篇(Day12)我們將探討 DNS 與 Service Discovery,進一步說明 Kubernetes 如何讓服務之間透過「名字」找到彼此。