Kubernetes從入門到精通-服務發現Service

一、為什么需要 Service?

  • Pod 的動態性:?Pod 是 Kubernetes 調度的基本單位。它們可能因為故障、滾動更新、擴縮容等原因隨時被創建或銷毀。

  • Pod IP 的不穩定性:?每個 Pod 都有自己的 IP 地址,但當 Pod 重建時,IP 地址會改變。

  • 訪問需求:?集群內部的其他應用(前端訪問后端)、集群外部用戶(訪問 Web 應用)需要一種穩定可靠的方式來訪問一組提供相同功能的 Pod。

二、Service 是什么?

1.定義

? ? ? ?Service 是 Kubernetes 中的一個 API 對象,它定義了一組 Pod 的邏輯集合以及訪問這組 Pod 的策略(通常通過標簽選擇器?selector)。service主要解決Pod的動態變化,提供統一的訪問入口。

2.核心功能

  • 穩定訪問端點:?為動態變化的 Pod 集合提供一個虛擬的、穩定的?IP 地址 (ClusterIP) 或 DNS 名稱。

  • 負載均衡:?基于iptables或者ipvs,將到達 Service 的請求自動分發到其后端健康的 Pod 上。

  • 服務發現:基于標簽管理器關聯后端的Pod列表?讓其他應用能夠輕松地找到并連接到這組 Pod。

3.endpoints對象

? ? ? ?由 Kubernetes?自動創建和管理(通常無需手動操作),與同名的 Service 關聯,存儲了當前匹配 Service 標簽選擇器的所有健康 Pod 的 IP:Port?列表,Service 的負載均衡器就是基于這個列表進行流量轉發的

三、service類型以及是用場景

1.ClusterIP

1.1 用途

? ? ? ?默認類型,為 Service 分配一個集群內部的虛擬 IP (VIP),僅限集群內部的其他 Pod 或 Service 訪問,用于后端服務間的內部通信(如前端訪問后端 API、數據庫訪問)。

1.2 示例代碼
[root@master-1 service]# cat 01-svc-ClusterIP.yaml 
apiVersion: v1
kind: Service
metadata:name: myweb-service
spec:# 聲明Service的類型,主要有:ClusterIP, NodePort, LoadBalancer.#    ClusterIP:#       k8s集群內部使用的類型,僅供K8S集群內部訪問,外部無法訪問。默認值。#    NodePort:#       在ClusterIP基礎之上,監聽了所有的worker節點的端口號,可供K8s集群外部訪問。#    LoadBalancer:#       適合在公有云上對k8s集群外部暴露應用。type: ClusterIP# 聲明標簽選擇器,即該svc資源關聯哪些Pod,并將其加入到ep列表selector:apps: web# 配置端口映射ports:# 指定Service服務本身的端口號- port: 8888# 后端Pod提供服務的端口號targetPort: 80
[root@master-1 service]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment            
metadata:name: nginx
spec:replicas: 3#基于標簽關聯pod,會關聯apps=test或者apps=prod的podselector:matchExpressions:- key: appsvalues: - "test"- "web"operator: Intemplate:metadata:#為pod設置了兩個標簽labels:apps: webspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent#部署
[root@master-1 service]# kubectl apply -f .
#查看pod,service,endpoints
[root@master-1 service]# kubectl get pods,svc,endpoints -o wide
1.3?驗證結果

? ? ? ?如圖所示,該Service自動生成了集群內部專用的虛擬IP地址(ClusterIP)和端口。

? ? ? ?使用該ClusterIP地址(10.0.0.69:8888)成功訪問到了集群內部署的Web業務服務。

2.?NodePort

2.1 用途

? ? ? ?k8s集群外部訪問,NodePort機制在ClusterIP基礎上,將服務以<節點IP>:<靜態端口>的形式暴露到集群外部,該端口可自動分配(30000-32767)或手動指定。端口范圍可以在api-server中查看。

查看端口范圍:

2.2 示例代碼
[root@master-1 service]# cat 02-svc-NodePort.yaml 
apiVersion: v1
kind: Service
metadata:name: myweb-nodeport
spec:# 指定svc的類型為NodePort,也就是在默認的ClusterIP基礎之上多監聽所有worker節點的端口而已。type: NodePort# 基于標簽選擇器關聯Podselector:apps: web# 配置端口映射ports:# 指定Service服務本身的端口號- port: 8888# 后端Pod提供服務的端口號targetPort: 80# 如果是NodePort類型,可以指定NodePort監聽的端口號,若不指定,則隨機生成。nodePort: 30080#端口范圍以上提供了查詢方法,可以修改,修改api-server啟動時的參數.#nodePort: 8080#部署
[root@master-1 service]# kubectl apply -f 02-svc-NodePort.yaml
service/myweb-nodeport created
#查看
[root@master-1 service]# kubectl get pods,svc,endpoints -o wide

2.3 驗證結果

? ? ? ?如圖所示,該Service除了創建集群內部的ClusterIP和端口外,還開放了指定的NodePort端口30080用于外部訪問。

? ? ? ?通過任意節點IP加NodePort端口(如192.168.91.21:30080)均可成功訪問部署的Web業務服務。

? ? ?通過外部瀏覽器訪問(http://192.168.91.22:30080/),也可以成功訪問到web業務。

3.LoadBalance

3.1 用途

? ? ? ?在?NodePort?基礎上,利用云提供商的基礎設施(如 AWS ELB, GCP Load Balancer, Azure LB)自動創建一個外部負載均衡器。該負載均衡器會將外部流量導向?NodePort?Service (進而到 Pod)。通常用于公有云上向公網暴露服務。

3.2 示例代碼
#01 創建loadbalancer的service
[root@master-1 service]# cat 03-services-LoadBalance.yaml 
kind: Service
apiVersion: v1
metadata:name: svc-loadbalancer
spec:# 指定service類型為LoadBalancer,注意,一般用于云環境type: LoadBalancerselector:app: webports:- protocol: TCPport: 80targetPort: 80nodePort: 30080#02 配置云環境的應用負載均衡器
#添加監聽器規則,比如訪問負載均衡器的80端口,反向代理到30080端口。
#簡而言之,就是訪問云環境的應用服務器的哪個端口,把他反向代理到K8S集群的node端口為30080即可。#03 用戶訪問應用負載均衡器的端口
#用戶直接訪問云環境應用服務器的80端口即可,請求會自動轉發到云環境nodePort的30080端口。

4.ExternalName

4.1 用途

? ? ? ?將 Service 映射到一個外部 DNS 名稱?(如?my.database.example.com)。不創建任何代理或負載均衡。通過訪問該 Service 的 DNS 名稱,解析到外部服務的 DNS 名稱。

4.2 示例代碼
[root@master-1 service]# cat 04-svc-ExternalName.yaml 
apiVersion: v1
kind: Service
metadata:name: svc-externalname
spec:# svc類型type: ExternalName# 指定外部域名externalName: www.baidu.com[root@master-1 service]# kubectl apply -f 04-svc-ExternalName.yaml
[root@master-1 service]# kubectl get svc svc-externalname
NAME               TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)   AGE
svc-externalname   ExternalName   <none>       www.baidu.com   <none>    98s#啟動容器后訪問名為"svc-externalname"的svc,請求會被cname到"www.baidu.com"的A記錄

5.類型對比

類型訪問范圍適用場景依賴條件
ClusterIP僅集群內部微服務間通信
NodePort集群外部開發測試/臨時暴露節點防火墻開放端口
LoadBalancer公網訪問生產環境云集群云廠商支持
ExternalName集群內部集成外部服務(如RDS)DNS 插件

四、?Service底層原理

1.?Service 工作流程

  • Endpoint 控制器:監控 Pod 狀態,更新 Service 關聯的 Endpoints 列表。

  • kube-proxy:監聽 Service/Endpoint 變化,生成代理規則。

  • 流量轉發

    • iptables 模式:默認,通過 NAT 規則轉發(適合小規模集群)。

    • IPVS 模式:基于哈希表,支持 RR/LC/WRR 等算法,萬級服務性能更優。

2.kube-proxy的工作模式

2.1 定義

? ?kube-proxy?是運行在每個 Node 上的網絡代理組件,是實現集群內部的服務發現和負載均衡的關鍵。它監聽 API Server 的 Service 和 Endpoint 變化,并配置本機的網絡規則將流量路由到正確的后端 Pod。kube-proxy 支持多種工作模式,每種模式都有其特點和適用場景。

2.2 工作模式
01 iptables?模式 (默認)

工作流程:

  • kube-proxy 使用?iptables?規則配置 Linux 內核的 netfilter 包過濾框架。
  • 當請求到達 Service 的 ClusterIP:Port?時,iptables?規則會進行 DNAT (目標地址轉換),將目標 IP:Port?修改為隨機選擇的一個后端 Pod 的 IP:Port。

優點:?效率高,工作在操作系統內核層。

缺點:

  • 規則數量龐大(尤其是 Service 和 Pod 很多時),可能影響性能。
  • 負載均衡算法單一(默認是隨機)。
  • 不支持更高級的負載均衡策略(如會話保持、最少連接)。
  • 如果第一個選中的 Pod 無響應,不會自動重試其他 Pod(除非應用層重試)。

02?ipvs?模式 (推薦)

? ? ? ?kube-proxy 使用 Linux 內核的?IP Virtual Server?模塊,IPVS 是 L4 負載均衡器,專門設計用于高性能負載均衡。

優點:

  • 性能最高:?比 iptables 模式具有更低的延遲和更高的吞吐量,尤其在大規模集群中優勢明顯。
  • 支持多種負載均衡算法:?rr?(輪詢),?lc?(最少連接),?dh?(目標地址哈希),?sh?(源地址哈希),?sed?(最短預期延遲),?nq?(永不排隊)。
  • 支持會話保持:?通過?sh?(源地址哈希) 算法實現。

  • 更高效的數據結構:?規則數量與 Service/Endpoint 數量呈線性關系,而非像 iptables 那樣可能是指數關系。

缺點:

  • 需要 Linux 內核支持 IPVS 模塊 (現代內核通常已支持)。
03 工作模式切換
#修改kube-proxy配置文件
[root@node-1 ~]# cat >/etc/kubernetes/cfg/kube-proxy.yaml<<EOF
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 192.168.91.21
clientConnection:kubeconfig: /etc/kubernetes/cfg/kube-proxy.kubeconfig
clusterCIDR: 10.0.0.0/24
healthzBindAddress: 192.168.91.21:10256
kind: KubeProxyConfiguration
metricsBindAddress: 192.168.91.21:10249
mode: "ipvs"
EOF#切換工作模式mode: "ipvs" 或者 mode: "iptables"
#修改完后重啟kube-proxy
[root@node-1 bin]# systemctl restart kube-proxy 

? ? ? 重啟后重新部署web應用,如下圖,發現service基于rr輪詢的方式分發流量到pod

五、常見問題排查

1.無法通過 Service 訪問 Pod

  • 檢查 Service?selector?是否與 Pod?labels?匹配 。

kubectl describe svc <service-name>
kubectl get pods --show-labels
  • 檢查 Endpoints 對象是否包含預期的 Pod IP,空的 Endpoints 意味著 selector 不匹配或 Pod 未就緒 (readinessProbe?失敗)。
kubectl get endpoints <service-name>
  • 檢查 Pod 是否正常運行且監聽目標端口
kubectl logs <pod-name>
kubectl exec -it <pod-name> -- netstat -tuln 
kubectl exec -it <pod-name> -- ss -tuln
  • 檢查 Pod 的?readinessProbe?是否配置正確且通過。
  • 檢查 kube-proxy 是否在所有節點正常運行。
systemctl status kube-proxy 
kubectl get pods -n kube-system -l component=kube-proxy
  • 檢查節點防火墻規則 (如果使用?iptables/ipvs?模式)。

2.NodePort 無法從外部訪問

  • 檢查 NodePort Service 是否已創建?
#看?PORT(S)?列是否有?80:3xxxx/TCP
kubectl get svc -A
  • 確認使用的 Node IP 和 NodePort 正確。

  • 檢查節點的防火墻/安全組是否允許外部訪問該 NodePort。

  • 檢查 kube-proxy 是否在節點上正常運行

六、總結

優先使用 DNS 進行服務發現:避免環境變量的順序依賴問題。

內部服務使用?ClusterIP:除非有特殊需求,否則這是最安全、最標準的內部通信方式

外部訪問:

  • 開發/測試:NodePort
  • 公有云生產環境:LoadBalancer?(通常配合 Ingress Controller 處理 L7 流量)。
  • 需要暴露多個 HTTP 服務:使用?Ingress?+?ClusterIP?Service。

使用?ipvs?代理模式:?尤其是在大型集群或需要高性能、多種負載均衡算法、會話保持時。

合理使用?Headless Service?主要用于 StatefulSets 或需要直接訪問所有 Pod IP 的場景。

配置?readinessProbe?確保 Service 只將流量路由到真正準備好接收請求的 Pod。

利用 Network Policies:?在 Service 之上實施網絡層面的安全控制。

監控:?監控 Service 的 Endpoints 變化、DNS 解析延遲、kube-proxy 狀態等。

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

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

相關文章

Milvus 資源調度系統的核心部分:「查詢節點」「資源組」「數據庫」

Milvus 的資源管理分為三層&#xff1a;查詢節點、資源組和 數據庫。 查詢節點&#xff1a;處理查詢任務的組件。它在物理機或容器&#xff08;如 Kubernetes 中的 pod&#xff09;上運行。 資源組&#xff1a;查詢節點的集合&#xff0c;充當邏輯組件&#xff08;數據庫和 C…

我的第一個開源項目:用Python搭建輕量級靜態網頁服務器—— 零基礎也能實現的Web開發初體驗

一、為什么選擇靜態服務器&#xff1f; 極簡高效&#xff1a;無需數據庫或復雜后端邏輯&#xff0c;適合展示簡歷、作品集等靜態內容 學習曲線平緩&#xff1a;是理解HTTP協議和Web服務原理的最佳入門方式 資源消耗低&#xff1a;單文件Python腳本即可運行&#xff0c;內存占…

github 圖床使用免費CDN加速(jsdelivr)

github做圖床大部分人都知道&#xff0c;但是國內訪問速度不穩定&#xff0c;所以使用jsdelivr加速。 jsdelivr是什么呢&#xff1f;它是一個免費、快速和可信賴的CDN加速服務&#xff0c;直接集成在github中的&#xff0c;無需額外操作即可使用。 本文分兩部份&#xff0c;最…

lte高階調制和AMC

文章目錄 LTE高階調制AMC LTE高階調制 首先什么是調制?調制是把通信系統中的基帶信號&#xff08;低頻&#xff09;轉化成適合信道傳輸的高頻信號的過程。 波長&#xff08;λ&#xff09;與頻率&#xff08;f&#xff09; 基本關系&#xff1a; λc/f&#xff0c;λc/f&…

shardingsphere5.2.1與SpringBoot3.X的版本沖突問題

1.先說一下我的版本配置與遇到的問題 問題產生的依賴和版本&#xff1a; 主要依賴依賴版本jdk17SpringBoot 3.3.13shardingsphere-jdbc 5.2.1 問題產生的原因&#xff1a; 主要就是shardingsphere-jdbc 與SpringBoot版本沖突&#xff0c;因為Spring Boot 需要 SnakeYAML 庫來解…

FPGA控制88E1512 PHY芯片完成網絡通信

一、88E1512分析 本文不對88E1512進行詳細解析&#xff0c;僅對調試過程中重點使用的幾個寄存器進行說明。 1.1 MDIO時序分析 根據手冊&#xff0c;MDIO時序中&#xff0c;mdc時鐘最高為12Mhz。占空比和建立保持時間要求可以觀察上述表格。 MDIO的讀數據時序圖如下&#xff1a…

Ai大模型 - ocr圖像識別形成結構化數據(pp-ocr+nlp結合) 以及訓練微調實現方案(初稿)

全局目錄,一步到位 功能流程第一階段 基于現有條件進行 調研,測試與評估1.1 ocr深度學習模型 pp-ocr1.2 nlp結構化模型1.3 硬件要求: 第二階段 模型訓練微調2.1 更換ocr-GPU模型, 下載相關環境2.2 nlp模型 語義訓練2.3 最低硬件要求:2.4 樣本數據: (重點)2.5 進一步增強模型能力…

【Linux】軟硬鏈接,動靜態庫

目錄 一、認識一下常用指令 1、建立一個軟鏈接 2、建立一個硬鏈接 3、刪除文件的第二種方式&#xff1a;刪除鏈接unlink指令 二、什么是硬鏈接&#xff1f; 三、軟硬鏈接的原理&#xff1a; 四、應用場景 1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行…

VRR(可變刷新率)和QMS(快速媒體切換)

&#x1f527; 一、技術原理的本質區別 技術VRR (可變刷新率)QMS (快速媒體切換)核心目標消除動態幀率波動導致的畫面撕裂/卡頓消除靜態幀率切換時的黑屏中斷工作機制實時調整顯示器刷新率&#xff08;Hz&#xff09;匹配GPU輸出幀率&#xff08;FPS&#xff09;→ 動態延長/縮…

GO 語言學習 之 Map

map 是 Go 語言中非常重要的數據結構&#xff0c;常用于需要快速查找、統計或分組數據的場景。 map定義&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 創建一個 mapm2 : make(map[int]string) // 創建一個 map m3…

什么是可觀測性?監控、日志、追蹤三者之間有什么區別?

一、引言&#xff1a;為什么現代系統需要“看得見”&#xff1f; 你是否遇到過這樣的情況&#xff1a;系統運行突然變慢&#xff0c;但沒人知道問題出在哪&#xff1f;隨著微服務、云原生架構的普及&#xff0c;系統的復雜度越來越高&#xff0c;傳統的“靠經驗判斷”已經無法…

扣子(coze)實戰|自動搬運+改寫+歸檔!自媒體矩陣終極方案

今天給大家分享的是用coze做一個工作流來自動提取抖音/小紅書視頻文案及改寫并傳入到飛書多維表格&#xff0c;我們先來看案例 上傳視頻鏈接即可一鍵生成&#xff0c;廢話不多說&#xff0c;上教程~ 一、整體工作流如下&#xff1a; 二、開發思路&#xff1a; 三、詳細工作流分…

K8s環境下基于Nginx WebDAV與TLS/SSL的文件上傳下載部署指南

#作者&#xff1a;閆乾苓 文章目錄 1.問題及背景2.方案說明3.部署步驟3.1 制作TLS/SSL私有證書3.2 創建訪問nginx賬戶密碼文件并創建secret3.3 為TLS/SSL私有證書創建secret3.4 為Nginx 配置文件創建confimap3.5 使用deployment&#xff0c;svc部署nginx3.6 客戶端curl上傳下載…

【Day 7-N17】Python函數(1)——函數定義、位置參數調用函數、關鍵字參數調用函數、函數的默認值

挑戰14天學會Python&#xff0c;第7天學習筆記&#xff01;加油&#xff01; 一、概述 函數&#xff08;Function&#xff09;是 Python 中用于封裝可重用代碼塊的基本結構。通過定義函數&#xff0c;我們可以將復雜邏輯拆分為更小、更易管理的單元&#xff0c;并通過參數傳遞…

STM32 驅動 ADS1015 單端 差分 多通道模式 ADC 轉換

文章目錄 一、ADS1015簡介二、引腳功能三、寄存器介紹1.Conversion Register 轉化數據存放寄存器2.Config Register 配置寄存器 四、IIC時序1.寫寄存器2.讀寄存器 五、程序六、實驗現象1.單端模式2.差分模式3.偽多通道模式 一、ADS1015簡介 ADS1015 是一款由德州儀器&#xff…

RabbitMQ 消費冪等性與消息重放實現

一、冪等性實現 1.1 什么是冪等性&#xff1f; 冪等性是指同一條消息無論被消費多少次&#xff0c;業務結果都只生效一次&#xff0c;防止重復扣款、重復發貨等問題。 RabbitMQ 的投遞模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消費者處理失敗或者沒有及…

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

【HarmonyOS 5】鴻蒙TEE&#xff08;可信執行環境&#xff09;詳解 一、TEE是什么&#xff1f; 1、TEE的定義&#xff1a; 可信執行環境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;簡稱TEE&#xff0c;是存在于智能手機、平板或任意移動設備主處理器…

算法: 冒泡排序

冒泡排序是一種簡單的排序算法&#xff0c;通過相鄰元素的比較和交換&#xff0c;使較大的元素逐漸"浮"到數組末尾。 時間復雜度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空間復雜度:O(1) 穩定性:穩定 應用場景/前提條件 適用于小規模數據對幾乎已排序的數據效率較高…

基于SpringBoot的家電銷售展示平臺

源碼編號&#xff1a;S567 源碼名稱&#xff1a;基于SpringBoot的家電銷售展示平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;14 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…