Kubernetes ClusterIP 端口深度解析:虛擬服務與流量轉發機制

事情的起因是創建了一個 NodePort 類型 Service,其端口映射關系為 8000:30948/TCP。既然30948是在每個node開的端口,那8000是開在哪的呢?出于好奇回顧了一下K8s的Cluster IP和Service


端口映射關系解析

在 Kubernetes 的 NodePort Service 中,端口配置遵循以下格式:

<ClusterIP 端口>:<NodePort 端口>/<協議>
  • 8000:Service 的 ClusterIP 端口(集群內部訪問端口)
  • 30948:NodePort 端口(節點外部訪問端口)
外部用戶
節點IP:30948
集群內部Pod
Service IP:8000
Service
后端Pod

訪問測試結果

1. 在宿主機上訪問 IP:8000
curl http://<節點IP>:8000

結果:連接失敗
原因:

  • 8000 端口僅在集群內部監聽(通過 Service 的 ClusterIP)
  • 節點操作系統沒有在 8000 端口監聽請求
2. 在宿主機上訪問 IP:30948
curl http://<節點IP>:30948

結果:成功訪問服務
原因:

  • kube-proxy 在所有節點上監聽了 30948 端口
  • 流量會被轉發到 Service 的后端 Pod

技術原理詳解

1. NodePort 工作原理

當創建 NodePort Service 時:

  1. kube-proxy 在所有節點上打開指定端口(30948)

  2. 創建 iptables/IPVS 規則:

    -A KUBE-NODEPORTS -p tcp --dport 30948 -j KUBE-SVC-XXXXXX
    
  3. 流量轉發路徑:

    外部用戶 → 節點IP:30948 → kube-proxy → Service → Pod
    
2. ClusterIP 端口用途
  • 集群內部訪問入口:

    # 在集群內部Pod中訪問
    curl http://my-dep.default.svc.cluster.local:8000
    
  • 服務發現的基礎端口


實際驗證步驟

1. 查看 Service 完整定義
kubectl describe svc my-dep

輸出關鍵部分:

Port:             8000/TCP
TargetPort:       80/TCP  # 后端Pod實際端口
NodePort:         30948/TCP
Endpoints:        10.244.1.2:80,10.244.2.3:80 # 后端Pod IP
2. 測試端口訪問
# 1. 訪問NodePort (應成功)
curl http://<任一節點IP>:30948# 2. 訪問ClusterIP端口 (應失敗)
curl http://<節點IP>:8000# 3. 在集群內部訪問 (在Pod中執行)
kubectl run test --image=busybox -it --rm --restart=Never -- \wget -qO- http://my-dep:8000
3. 檢查節點端口監聽
# 在K8s節點上執行
sudo netstat -tuln | grep 30948
# 應輸出: tcp6  0  0 :::30948  :::*  LISTEN

那么回到最開始的問題,8000端口開在哪呢?

如果你采用的是原生搭建k8s,那么你一定會記得初始化的時候有這樣一個命令

kubeadm init \
--apiserver-advertise-address=172.31.0.4 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

在這里就指定了創建svc和pod的網段

集群內部訪問端口的本質

ClusterIP 端口是 Kubernetes 服務抽象層的核心設計。

請求 10.96.91.238:8000
Client Pod
Service ClusterIP
iptables/IPVS 規則
Pod 1:80
Pod 2:80
Pod 3:80

ClusterIP 端口的三層抽象

1. 虛擬 IP 層 (Service ClusterIP)

  • 非真實接口:ClusterIP (如 10.96.91.238) 是 kube-proxy 創建的虛擬 IP
  • 無端口監聽:節點操作系統上沒有進程真正監聽 8000 端口
  • 內核級攔截:通過 Linux 內核的 netfilter 框架實現流量攔截

2. 規則轉發層 (kube-proxy)

kube-proxy 創建轉發規則(以 iptables 為例):

# 查看 Service 規則鏈
sudo iptables -t nat -L KUBE-SERVICES# 示例輸出
KUBE-SVC-XYZ  tcp  --  anywhere  10.96.91.238  tcp dpt:8000

具體規則細節:

# DNAT 規則
-A KUBE-SVC-XYZ -m statistic --mode random --probability 0.333 -j KUBE-SEP-111
-A KUBE-SVC-XYZ -m statistic --mode random --probability 0.5 -j KUBE-SEP-222
-A KUBE-SVC-XYZ -j KUBE-SEP-333# 終結點規則
-A KUBE-SEP-111 -p tcp -m tcp -j DNAT --to-destination 10.244.1.2:80
-A KUBE-SEP-222 -p tcp -m tcp -j DNAT --to-destination 10.244.1.3:80
-A KUBE-SEP-333 -p tcp -m tcp -j DNAT --to-destination 10.244.2.4:80

3. 真實端點層 (Pod)

  • 實際端口監聽:在 Pod 內部的容器端口(如配置的 80 端口)

  • Endpoint 對象管理

    apiVersion: v1
    kind: Endpoints
    metadata:name: my-dep
    subsets:
    - addresses:- ip: 10.244.1.2- ip: 10.244.1.3- ip: 10.244.2.4ports:- port: 80protocol: TCP
    

流量轉發全路徑

當集群內部客戶端訪問 10.96.91.238:8000 時:

  1. 客戶端發起請求

    resp, err := http.Get("http://10.96.91.238:8000")
    
  2. 內核網絡棧攔截

    • 目標 IP 匹配 Service CIDR (如 10.96.0.0/16)
    • 進入 KUBE-SERVICES
  3. DNAT 轉換

    • 根據 iptables 規則
    • 目標 IP:Port 被替換為 Pod IP:Port (如 10.244.1.2:80)
  4. 路由到目標 Pod

    • 通過 CNI 插件創建的網絡路由
    • 流量進入 Pod 網絡命名空間
  5. 容器接收請求

    • 容器內進程監聽 80 端口
    • 處理請求并返回響應

與 NodePort 的關鍵區別

特性ClusterIP 端口 (8000)NodePort 端口 (30948)
可見性僅集群內部可見可從集群外部訪問
實現層級內核網絡棧 (L3/L4)用戶空間監聽 (L4)
監聽位置無真實監聽,僅規則kube-proxy 進程真實監聽
訪問控制受網絡策略控制受節點防火墻控制
性能開銷低(內核轉發)中(用戶態轉發)
數據包變化目標地址被修改目標地址不變

查看內核規則

在任意節點執行:

# 查看NAT表規則
sudo iptables -t nat -L KUBE-SERVICES -n --line-numbers# 查找Service規則
sudo iptables -t nat -L KUBE-SVC-$(kubectl get svc my-dep -o jsonpath='{.spec.ports[0].name}') -n

為什么需要 ClusterIP

  1. 穩定訪問端點
    Pod 可能隨時重建,但 Service IP 保持不變

  2. 負載均衡
    自動將流量分發到多個后端 Pod

  3. 服務發現
    通過 DNS 名稱解耦服務位置

  4. 流量策略
    支持會話保持、流量權重等高級特性

  5. 安全隔離
    默認僅集群內部可訪問,減少攻擊面

生產環境實踐

  1. 避免直接使用 NodePort 配合 Ingress 或 LoadBalancer 使用:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:name: my-ingress
    spec:rules:- http:paths:- path: /pathType: Prefixbackend:service:name: my-depport:number: 8000  # 使用ClusterIP端口
    
  2. 自定義 NodePort 范圍 修改 apiserver 配置:

    apiServer:extraArgs:service-node-port-range: "30000-35000"
    
  3. 防火墻規則 僅開放必要的 NodePort 端口:

    sudo ufw allow 30948/tcp
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84404.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++左值與右值及引用的總結

前言 在C中&#xff0c;理解左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是掌握現代C核心特性的關鍵。左值通常指代具名的、持久存在的對象&#xff0c;可以取地址&#xff1b;而右值則是臨時的、即將銷毀的值&#xff0c;如字面量或表達式結果。…

學習記錄:DAY31

Java課設&#xff1a;數字水印處理與解析器開發 前言 想養成寫日記的習慣真不容易。最近比較懶散&#xff0c;復習不想復&#xff0c;項目又做完了&#xff0c;處于一種能干些什么&#xff0c;但是不太想干&#xff0c;但是不干些什么又渾身難受的處境。其實完全就不是勻不出…

Linux系統部署KES

1、安裝準備 1.版本說明V008R006C009B0014 V008&#xff1a;是version產品的大版本。 R006&#xff1a;是release產品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build開發過程中的構建版本2.硬件要求 #安全版和企業版 內存&#xff1a;1GB 以上 硬盤&#xf…

系統模塊與功能設計框架

系統模塊與功能設計框架&#xff0c;嚴格遵循專業架構設計原則&#xff0c;基于行業標準&#xff08;如微服務架構、DDD領域驅動設計&#xff09;構建。設計采用分層解耦模式&#xff0c;確保可擴展性和可維護性&#xff0c;適用于電商、企業服務、數字平臺等中大型系統。 系統…

MySQL中【正則表達式】用法

MySQL 中正則表達式通過 REGEXP 或 RLIKE 操作符實現&#xff08;兩者等價&#xff09;&#xff0c;用于在 WHERE 子句中進行復雜的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基礎語法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程學習之自我一致性

自我一致性 &#xff08;Self-consistency&#xff09; 概念&#xff1a;該技術通過對同一問題采樣不同的推理路徑&#xff0c;并通過多數投票選擇最一致的答案&#xff0c;來解決大語言模型&#xff08;LLM&#xff09;輸出的可變性問題。通過使用不同的溫度&#xff08;temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9總結(利與弊)

凡事都有兩面性。在大廠上班也不例外。今天找開發定位問題&#xff0c;從一個接口人不斷溯源到另一個 接口人。有時候&#xff0c;不知道是誰的責任填。將工作內容分的很細&#xff0c;每個人負責其中的一小塊。我清楚的意識到&#xff0c;自己就是個可以隨時替換的螺絲釘&…

數據集-目標檢測系列- 口紅嘴唇 數據集 lips >> DataBall

貴在堅持&#xff01; * 相關項目 1&#xff09;數據集可視化項目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;數據集訓練、推理相關項目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[論文閱讀] 人工智能+項目管理 | 當 PMBOK 遇見 AI:傳統項目管理框架的破局之路

當PMBOK遇見AI&#xff1a;傳統項目管理框架的“AI適配指南” 論文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7關閉防火墻、Linux開啟關閉防火墻

文章目錄 一、firewalld開啟、關閉防火墻1、查看防火墻狀態 一、firewalld開啟、關閉防火墻 以下命令在linux系統CentOS7中操作開啟關閉防火墻 # 查詢防火墻狀態 systemctl status firewalld.service # 開啟防火墻 systemctl start firewalld.service # 開機自啟動防火墻 syste…

Spring是如何實現無代理對象的循環依賴

無代理對象的循環依賴 什么是循環依賴解決方案實現方式測試驗證 引入代理對象的影響創建代理對象問題分析 源碼見&#xff1a;mini-spring 什么是循環依賴 循環依賴是指在對象創建過程中&#xff0c;兩個或多個對象相互依賴&#xff0c;導致創建過程陷入死循環。以下通過一個簡…

Android 之 kotlin 語言學習筆記三(Kotlin-Java 互操作)

參考官方文檔&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬關鍵字 不要使用 Kotlin 的任何硬關鍵字作為方法的名稱 或字段。允許使用 Kotlin 的軟關鍵字、修飾符關鍵字和特殊標識…

從 GreenPlum 到鏡舟數據庫:杭銀消費金融湖倉一體轉型實踐

作者&#xff1a;吳岐詩&#xff0c;杭銀消費金融大數據應用開發工程師 本文整理自杭銀消費金融大數據應用開發工程師在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合數據湖與數倉的創新之路 在數字金融時代&#xff0c;數據已成為金融機構的核心競爭力。杭銀消費金…

Bean 作用域有哪些?如何答出技術深度?

導語&#xff1a; Spring 面試繞不開 Bean 的作用域問題&#xff0c;這是面試官考察候選人對 Spring 框架理解深度的常見方式。本文將圍繞“Spring 中的 Bean 作用域”展開&#xff0c;結合典型面試題及實戰場景&#xff0c;幫你厘清重點&#xff0c;打破模板式回答&#xff0c…

基于 Spring Boot 策略模式的短信服務提供商動態切換實現

一、整體設計思路 為了實現在短信服務提供商變更時,不修改現有代碼就能無縫切換到新服務實現,可采用策略模式結合依賴注入以及配置中心化管理的方式來設計軟件系統。 二、 具體實現步驟 1. 定義統一接口(以短信服務為例,接口命名為 SmsService) 創建一個抽象的接口,用…

解決SQL Server SQL語句性能問題(9)——SQL語句改寫(1)

9.4. SQL語句改寫 目前主流關系庫的高版本中,特別是作為主流商業關系庫的SQL Server來講,大部分場景中,同一語義和結果集的SQL語句,其不同寫法并不會影響CBO為SQL語句生成和選擇最合適、最高效的查詢計劃。但少數情況下,不同寫法的同一語義和結果集的SQL語句,CBO也許會為…

設計模式復習小結

1.容易忘得設計原則 接口隔離&#xff1a;指接口中的功能太雜則可以拆分一下。防止實現類實現了接口后自動依賴了一些不需要的功能。不同功能拆分成不同的接口。 里氏代換&#xff1a;強調父類能出現的地方&#xff0c;子類一定能正常跑。 迪米特法則&#xff1a;又稱最少知…

昇騰CANN集合通信技術解讀——細粒度分級流水算法

隨著AI技術的演進&#xff0c;模型的計算復雜度和參數量呈現幾何級數增長&#xff0c;這使得傳統單機單卡部署在算力供給與顯存容量方面顯得力不從心&#xff0c;從而直接推動了分布式訓練/推理技術的快速發展。今年年初爆火的DeepSeek在訓練及推理Prefill階段采用了分級流水Al…

水泥廠自動化升級利器:Devicenet轉Modbus rtu協議轉換網關

在水泥廠的生產流程中&#xff0c;工業自動化網關起著至關重要的作用&#xff0c;尤其是JH-DVN-RTU疆鴻智能Devicenet轉Modbus rtu協議轉換網關&#xff0c;為水泥廠實現高效生產與精準控制提供了有力支持。 水泥廠設備眾多&#xff0c;其中不少設備采用Devicenet協議。Devicen…