Service
什麼是 Service
在 Kubernetes 中,一個應用程式通常會運行在多個 Pod 中。每個 Pod 都有自己的 IP 地址,這些 IP 地址是動態分配的,當 Pod 重新啟動或是被重新調度時,IP 可能會改變。這會使得應用程式之間的通信變得困難。這時,Service 就派上用場了。
Kubernetes Service 提供了一個固定的 IP 地址和 DNS 名稱,來抽象出一組 Pod。這組 Pod 可以是相同應用程式的多個副本。Service 通過標籤選擇器來動態地將流量導向這些 Pod,實現了負載均衡。
Service 類型
ClusterIP
ClusterIP 是 Kubernetes 中的預設 Service 類型。它在集群內部創建一個虛擬 IP 地址,這個地址只能在集群內部訪問。這適用於內部應用之間的通信,例如前端應用需要訪問後端服 務,或是微服務架構中的服務互相調用。
YAML 檔案範例
網路請求順序:
- 客戶端發起請求:客戶端(可能是集群內的其他 Pod)發起一個 HTTP 或 HTTPS 請求,目標是這個 Service 的 ClusterIP 地址和指定的端口(80 或 443)。
- Service 轉發請求:Service 收到請求後,會根據 selector(在這個例子中是 app: nginx)選擇一個或多個匹配的 Pod。然後,Service 會將請求轉發到這些 Pod 的 targetPort(在這個例子中是 80 或 443)。
- Pod 處理請求:被選擇的 Pod 收到請求後,會進行處理,然後回傳結果。這個 Pod 應該啟動一個 Web 服務,例如 Nginx,並且在 targetPort 上監聽請求。
- Service 回傳結果:Service 收到 Pod 的回傳結果後,會將結果回傳給原來的客戶端。
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
app: nginx # 標籤是 app: nginx 的 pods
type: ClusterIP # 預設是 ClusterIp,其他還有 NodePort, LoadBalancer, ExternalName
ports:
- name: http
port: 80 # Service 對外開放的 port
targetPort: 80 # Pod 的 port
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
NodePort
NodePort 會在每個節點上開放一個特定的端口,從而允許外部流量進入集群並路由到相應的服務。這適合在開發和測試環境中,或者在沒有雲提供商負載均衡器的情況下,讓外部用戶直接訪問應用。
YAML 檔案範例
網路請求順序:
- 客戶端發起請求:客戶端(可能是集群外的用戶)發起一個 HTTP 或 HTTPS 請求,目標是節點的 IP 地址和指定的 NodePort(例如 30080 或 30443)。
- 節點轉發請求:節點收到請求後,會將請求轉發到 Service 的 ClusterIP 地址和指定的 port(例如 80 或 443)。
- Service 轉發請求:Service 收到請求後,會根據 selector(在這個例子中是 app: nginx)選擇一個或多個匹配的 Pod。然後,Service 會將請求轉發到這些 Pod 的 targetPort(在這個例子中是 80 或 443)。
- Pod 處理請求:被選擇的 Pod 收到請求後,會進行處理,然後回傳結果。這個 Pod 應該啟動一個 Web 服務,例如 Nginx,並且在 targetPort 上監聽請求。
- Service 回傳結果:Service 收到 Pod 的回傳結果後,會將結果回傳給原來的客戶端。
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
app: nginx
type: NodePort
ports:
- name: http
port: 80 # Service 對外開放的 port
targetPort: 80 # Pod 的 port
nodePort: 30080 # 節點上開放的 port,範圍是 30000-32767
protocol: TCP
- name: https
port: 443
targetPort: 443
nodePort: 30443
protocol: TCP
LoadBalancer
LoadBalancer 類型的 Service 會向雲提供商(如 AWS、GCP、Azure)請求創建一個外部的負載均衡器,並分配一個公開的 IP 地址。這適合在生產環境中,允許外部流量可靠地進入應用。通常用於需要高可用性的服務,且需要雲提供商的負載均衡功能。
YAML 檔案範例
網路請求順序:
- 客戶端發起請求:客戶端(可能是集群外的用戶)發起一個 HTTP 或 HTTPS 請求,目標是負載均衡器的 IP 地址和指定的 port(例如 80 或 443)。
- 負載均衡器轉發請求:負載均衡器收到請求後,會將請求轉發到 Service 的 ClusterIP 地址和指定的 port(例如 80 或 443)。
- Service 轉發請求:Service 收到請求後,會根據 selector(在這個例子中是 app: nginx)選擇一個或多個匹配的 Pod。然後,Service 會將請求轉發到這些 Pod 的 targetPort(在這個例子中是 80 或 443)。
- Pod 處理請求:被選擇的 Pod 收到請求後,會進行處理,然後回傳結果。這個 Pod 應該啟動一個 Web 服務,例如 Nginx,並且在 targetPort 上監聽請求。
- Service 回傳結果:Service 收到 Pod 的回傳結果後,會將結果回傳給原來的客戶端。
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80 # Service 對外開放的 port
targetPort: 80 # Pod 的 port
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
ExternalName
ExternalName 服務會將請求重定向到指定的外部 DNS 名稱。這適合用於集群內的服務需要訪問外部服務,例如第三方 API 或外部數據庫,而不需要暴露內部服務的 IP 地址。
YAML 檔案範例
apiVersion: v1
kind: Service
metadata:
name: service
spec:
type: ExternalName
externalName: example.com