- 在 Kubernetes 中,
Service
是一種抽象的方式,用于將一組 Pod 進行連接并暴露給外部或集群內部訪問。 - 它的主要目的是通過提供穩定的 IP 地址和端口來允許其他服務或客戶端與一組 Pod 進行通信。
Service 類型
Kubernetes 中 Service
有四種主要類型,分別是:
- ClusterIP (默認類型)
- NodePort
- LoadBalancer
- ExternalName
各種類型的區別
1. ClusterIP
- 作用:這是默認的
Service
類型,主要用于集群內部的訪問。它為Service
分配一個集群內的 IP 地址。 - 訪問范圍:僅限于 Kubernetes 集群內部的其他 Pod 可以訪問該 Service,不能從外部直接訪問。
- 適用場景:用于集群內部服務之間的通信,例如微服務架構中的內部通信。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: ClusterIPselector:app: my-appports:- port: 80targetPort: 8080
2. NodePort
- 作用:通過為每個 Node 分配一個端口號(
NodePort
)來暴露 Service,從而可以通過集群中任意 Node 的 IP 和指定端口訪問 Service。 - 訪問范圍:可以從集群外部通過
<NodeIP>:<NodePort>
的方式訪問服務。通常會與ClusterIP
配合使用,前者處理集群內部流量,后者則暴露端口給外部。 - 適用場景:適用于需要從外部訪問 Kubernetes 集群內服務的場景,比如開發測試環境。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: NodePortselector:app: my-appports:- port: 80targetPort: 8080nodePort: 30007 # 端口號通常在 30000-32767 之間
3. LoadBalancer
- 作用:為
Service
提供一個外部負載均衡器(例如 AWS ELB、GCP Load Balancer 等)。當使用LoadBalancer
類型時,Kubernetes 會自動請求云服務提供商來創建一個負載均衡器并將流量轉發到集群中的Service
。 - 訪問范圍:可以通過外部負載均衡器的 IP 地址或域名訪問集群中的 Service。
- 適用場景:適用于需要高可用、可伸縮、并且從外部可以訪問的服務,如生產環境中的 Web 應用。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: LoadBalancerselector:app: my-appports:- port: 80targetPort: 8080
4. ExternalName
- 作用:通過一個 CNAME 記錄,將
Service
映射到外部的 DNS 名稱。這意味著該Service
不會指向集群內的 Pod,而是指向外部的某個 DNS 記錄。 - 訪問范圍:用于從 Kubernetes 集群內部訪問外部服務。
- 適用場景:適用于需要將外部服務映射到集群內部的場景,例如訪問外部的數據庫或 API 服務。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: ExternalNameexternalName: example.com # 外部 DNS 名稱
總結:ClusterIP、NodePort 和 LoadBalancer 的區別
類型 | 訪問范圍 | 適用場景 | 是否支持外部訪問 | 使用場景例子 |
---|---|---|---|---|
ClusterIP | 集群內部訪問 | 集群內服務間的通信 | 否 | 微服務之間的內部通信 |
NodePort | 集群內外訪問,外部通過 Node IP 和端口訪問 | 需要從集群外部訪問服務 | 是 | 測試環境或開發環境中訪問服務 |
LoadBalancer | 集群內外訪問,提供外部負載均衡器 | 從外部訪問服務,需要高可用、負載均衡 | 是 | 生產環境中需要外部訪問的 Web 應用 |
ExternalName | 外部 DNS 名稱映射 | 將外部服務映射為 Kubernetes 內部服務 | 是 | 訪問外部的數據庫或 API 服務 |
小結
- ClusterIP:只限內部訪問,適合內部服務通信。
- NodePort:允許外部通過指定端口訪問集群,適合開發測試環境。
- LoadBalancer:提供外部負載均衡器,適合生產環境。
- ExternalName:通過外部 DNS 名稱訪問服務,適合連接外部資源。
https://github.com/0voice