Kubernetes Service(SVC)網(wǎng)絡(luò)使用及說明
Kubernetes Service(SVC)網(wǎng)絡(luò)
在 Kubernetes(k8s)集群中,Pod 是最小的可部署單元,但 Pod 的生命周期是短暫的,IP 也是動態(tài)分配的。這種特性導(dǎo)致 Pod 之間的網(wǎng)絡(luò)通信變得復(fù)雜。
為了解決這個問題,Kubernetes 引入了 Service(SVC) 資源,它充當(dāng)一組 Pod 的穩(wěn)定訪問入口,使得集群內(nèi)部或外部的訪問更加高效和穩(wěn)定。
本文將深入探討 Kubernetes Service 的網(wǎng)絡(luò)機(jī)制、不同類型及其應(yīng)用場景。
為什么需要 Service?
Kubernetes 中 Pod 可能會被頻繁銷毀和重建,每次重新創(chuàng)建時,其 IP 地址都會改變。
例如,一個微服務(wù)架構(gòu)的 Web 應(yīng)用,frontend 需要訪問 backend,但 backend 的 Pod IP 是動態(tài)變化的,frontend 無法始終知道 backend 的最新 IP。
Service 解決了這個問題,提供了一個 穩(wěn)定的訪問方式:
- Service 具有 固定的 Cluster IP,不會因 Pod 變化而變化。
- Service 通過 標(biāo)簽選擇器(Label Selector) 發(fā)現(xiàn)匹配的 Pod,并自動負(fù)載均衡。
- Service 還可以暴露到集群外部,讓外部應(yīng)用訪問 Kubernetes 內(nèi)部的服務(wù)。
Kubernetes Service 主要組成部分
一個 Service 由以下關(guān)鍵部分組成:
| 組件 | 作用 |
|---|---|
| selector | 通過 Label 選擇匹配的 Pod |
| clusterIP | Service 的內(nèi)部 IP 地址(默認(rèn)自動分配) |
| ports | 定義 Service 暴露的端口 |
| type | Service 的類型,決定了其訪問方式 |
| endpoints | 記錄了與 Service 關(guān)聯(lián)的 Pod 的 IP 和端口 |
Kubernetes Service 類型
類型的對比表格
| Service 類型 | 作用 | 訪問方式 | 適用場景 |
|---|---|---|---|
| ClusterIP(默認(rèn)) | 僅在 集群內(nèi)部 訪問,提供穩(wěn)定的服務(wù)發(fā)現(xiàn) | http://my-service.default.svc.cluster.local | 集群內(nèi)部通信(如微服務(wù)間調(diào)用) |
| NodePort | 在每個 Node 上開放一個固定端口,供外部訪問 | http://<NodeIP>:<NodePort> | 小規(guī)模外部訪問,如開發(fā)測試 |
| LoadBalancer | 在云環(huán)境中創(chuàng)建外部負(fù)載均衡器,自動分配外部 IP | http://<External-IP>:<Port> | 生產(chǎn)環(huán)境對外提供服務(wù) |
| ExternalName | 代理 Kubernetes 內(nèi)部流量到外部域名 | http://my-database.default.svc.cluster.local | 訪問外部數(shù)據(jù)庫或 API |
ClusterIP(默認(rèn)類型)
- 作用:只在 集群內(nèi)部 訪問,提供穩(wěn)定的內(nèi)部服務(wù)發(fā)現(xiàn)。
- 適用場景:集群內(nèi)部服務(wù)通信,例如
backend訪問database。
示例 YAML:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
port: 80:Service 暴露的端口。targetPort: 8080:Pod 內(nèi)部監(jiān)聽的端口。
訪問方式:
curl http://my-service.default.svc.cluster.local
NodePort
- 作用:通過每個 Node 的 固定端口(
30000-32767)訪問,適用于集群外部訪問。 - 適用場景:用于 臨時外部訪問,例如開發(fā)環(huán)境調(diào)試或小規(guī)模部署。
示例 YAML:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
type: NodePort
訪問方式:
curl http://<NodeIP>:30080
LoadBalancer
- 作用:在云環(huán)境(如 AWS、GCP、Azure)中,自動創(chuàng)建外部負(fù)載均衡器,適用于 生產(chǎn)環(huán)境。
- 適用場景:用于對外暴露的服務(wù),如 Web 服務(wù)器、API 服務(wù)器。
示例 YAML:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
訪問方式:獲取 LoadBalancer 分配的外部 IP:
kubectl get svc my-service
ExternalName
- 作用:用于將 Kubernetes 內(nèi)部流量 代理到外部域名,類似于 DNS 記錄。
- 適用場景:例如將
my-databaseService 映射到外部db.example.com。
示例 YAML:
apiVersion: v1 kind: Service metadata: name: my-database spec: type: ExternalName externalName: db.example.com
訪問方式:
curl http://my-database.default.svc.cluster.local
Service 的解析與訪問機(jī)制
Service DNS 解析
Kubernetes 內(nèi)置了 DNS 解析服務(wù),支持以下格式的域名訪問:
<service-name>.<namespace>.svc.cluster.local
例如:
my-service.default.svc.cluster.local
此 DNS 解析由 CoreDNS 組件管理,Pod 內(nèi)部可以直接使用 curl my-service 訪問。
Service 負(fù)載均衡原理
當(dāng)請求發(fā)送到 Service 時,Kubernetes 通過 iptables 或 IPVS 進(jìn)行負(fù)載均衡:
iptables(默認(rèn)):
- 創(chuàng)建
NAT 規(guī)則,將請求隨機(jī)轉(zhuǎn)發(fā)到某個 Pod。 - 適用于 小規(guī)模集群,性能較好。
IPVS(高性能):
- 采用 哈希表 管理規(guī)則,性能比 iptables 更優(yōu)。
- 適用于 大規(guī)模集群,如萬級 Pod 部署。
要啟用 IPVS:
kubectl edit configmap -n kube-system kube-proxy
修改 mode: ipvs,然后重啟 kube-proxy。
Service 與 Ingress 的區(qū)別
| 特性 | Service | Ingress |
|---|---|---|
| 作用 | 連接 Pod 之間的網(wǎng)絡(luò) | 連接外部流量與內(nèi)部 Service |
| 訪問方式 | ClusterIP, NodePort, LoadBalancer | 通過 Ingress Controller 代理 |
| 負(fù)載均衡 | Kubernetes 自帶 | 需要 Ingress Controller |
| 適用場景 | 內(nèi)部通信,或?qū)ν夂唵伪┞?/td> | 復(fù)雜路由、SSL 終結(jié) |
總結(jié)
- Service 解決了 Pod 動態(tài) IP 的問題,提供穩(wěn)定的訪問入口。
- ClusterIP 適用于內(nèi)部通信,NodePort 適用于簡單外部訪問,LoadBalancer 適用于云環(huán)境。
- Service 通過 iptables 或 IPVS 進(jìn)行負(fù)載均衡。
- Service 結(jié)合 Ingress 可實(shí)現(xiàn)更強(qiáng)大的流量管理。
Service 是 Kubernetes 網(wǎng)絡(luò)的核心,理解其工作機(jī)制對于搭建可靠的微服務(wù)架構(gòu)至關(guān)重要!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
keepalived?nopreempt的應(yīng)用場景及說明
文章詳細(xì)介紹了keepalived高可用模式下`nopreempt`非搶占模式的應(yīng)用場景,并探討了不同配置下的VIP故障轉(zhuǎn)移行為,同時,文章還解釋了`notify`腳本的作用,包括觸發(fā)時機(jī)和典型用途2026-01-01
Kubernetes中使用PersistentVolume掛載云盤方式
這篇文章主要介紹了Kubernetes中使用PersistentVolume掛載云盤方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Rainbond調(diào)用Vue?React項目的后端接口
這篇文章主要為大家介紹了Rainbond調(diào)用Vue?React項目的后端接口問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

