k8s-服務發布基礎

目錄

Service的定義

核心定義

Service 的類型

關鍵組件與機制

工作流程示例

高級特性

?Service工作原理

核心工作原理

標簽選擇器(Label Selector)

Endpoints 對象

網絡代理與負載均衡(kube-proxy)

userspace 模式(已淘汰)

iptables 模式(默認)

IPVS 模式(推薦高性能場景)

Service 類型與流量路由

ClusterIP(默認)

NodePort

LoadBalancer

ExternalName


Service的定義

在 Kubernetes(K8s)中,Service?是一個核心抽象資源,用于為一組具有相同功能的 Pod 提供穩定的網絡訪問入口,并實現服務發現、負載均衡和抽象隔離。

核心定義

  • 邏輯抽象層:Service 將一組動態變化的 Pod(通過標簽選擇器匹配)抽象為一個邏輯服務單元,客戶端無需關心后端 Pod 的具體數量、IP 地址或位置。
  • 穩定訪問入口:為 Pod 分配一個固定的 ClusterIP(虛擬 IP),該 IP 在 Service 生命周期內不變,即使后端 Pod 重建或擴縮容。
  • 負載均衡:自動將客戶端請求分發到匹配的 Pod,支持輪詢(默認)、隨機、會話保持等策略。

Service 的類型

根據網絡訪問方式,Service 分為以下四種類型:

類型訪問范圍適用場景
ClusterIP僅集群內部訪問(默認)內部服務間通信(如微服務調用、數據庫訪問)。
NodePort集群外部通過節點 IP+端口訪問開發測試或臨時暴露服務(需手動指定節點端口,范圍通常為 30000-32767)。
LoadBalancer外部負載均衡器(云環境)生產環境暴露服務,自動創建云廠商的負載均衡器(如 AWS ALB、GCP Load Balancer)。
ExternalName通過 DNS CNAME 映射外部服務訪問集群外部服務(如數據庫、第三方 API),無需在集群內運行 Pod。

關鍵組件與機制

  • 標簽選擇器(Label Selector)
    • 通過?spec.selector?字段匹配 Pod 的標簽(如?app: nginx),動態關聯后端 Pod。
    • 示例:
      apiVersion: v1
      kind: Service
      metadata:name: nginx-service
      spec:selector:app: nginx  # 匹配所有標簽為 app=nginx 的 Podports:- protocol: TCPport: 80    # Service 暴露的端口targetPort: 80  # Pod 的容器端口
    • Endpoints 對象
      • K8s 自動為每個 Service 創建同名的 Endpoints 資源,記錄當前匹配的 Pod IP 和端口。
      • 通過?kubectl get endpoints nginx-service?可查看實時關聯的 Pod。
    • ClusterIP
      • 虛擬 IP,僅在集群內路由有效,由 kube-proxy 通過 iptables/IPVS 實現。
      • 客戶端訪問?ClusterIP:Port?時,請求會被轉發到后端 Pod。
    • DNS 解析
      • 集群內服務可通過?<service-name>.<namespace>.svc.cluster.local?域名訪問(如?nginx-service.default.svc.cluster.local)。
      • 簡化配置,避免硬編碼 IP。

工作流程示例

  1. 創建 Deployment:部署 3 個 Nginx Pod,標簽為?app=nginx
  2. 創建 Service
    apiVersion: v1
    kind: Service
    metadata:name: nginx-service
    spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80
  3. 訪問服務
    • 集群內其他 Pod 可通過?nginx-service:80?或其 ClusterIP 訪問。
    • 若為 NodePort 類型,外部可通過?http://<節點IP>:<節點端口>?訪問。

高級特性

  • 會話保持(Session Affinity)
    • 通過?sessionAffinity: ClientIP?確保同一客戶端請求始終路由到同一 Pod。
  • 外部流量策略
    • externalTrafficPolicy: Local?保留客戶端源 IP,避免經過 NAT 丟失信息(僅 NodePort/LoadBalancer 有效)。
  • 無頭服務(Headless Service)
    • 設置?clusterIP: None,不分配 ClusterIP,直接返回 Pod IP 列表(適用于 StatefulSet 或需要直接訪問 Pod 的場景)。

?Service工作原理

?Kubernetes(K8s)中的?Service?通過抽象一組動態變化的 Pod,提供穩定的網絡訪問入口和負載均衡能力。其工作原理涉及?標簽選擇、Endpoint 管理、網絡代理(kube-proxy)和負載均衡?等核心機制。

核心工作原理

標簽選擇器(Label Selector)
  • 作用:Service 通過?spec.selector?字段匹配一組 Pod 的標簽(如?app=nginx),動態關聯后端 Pod。
  • 動態性:當匹配的 Pod 數量或 IP 變化時(如擴容、重建),Service 會自動更新關聯的 Endpoint,無需手動干預。
  • 示例
    apiVersion: v1
    kind: Service
    metadata:name: nginx-service
    spec:selector:app: nginx  # 匹配所有標簽為 app=nginx 的 Podports:- protocol: TCPport: 80    # Service 暴露的端口targetPort: 80  # Pod 的容器端口
Endpoints 對象
  • 自動生成:K8s 為每個 Service 創建一個同名的?Endpoints 資源(如?nginx-service),記錄當前匹配的 Pod IP 和端口。
  • 實時更新:當 Pod 狀態變化(如新增、刪除、IP 變更),Endpoints 會同步更新,確保流量始終路由到健康的 Pod。
  • 查看 Endpoints
    kubectl get endpoints nginx-service

? ? ? ? 輸出實例:

NAME            ENDPOINTS                          AGE
nginx-service   10.244.1.3:80,10.244.2.5:80      5m

網絡代理與負載均衡(kube-proxy)

kube-proxy?是運行在每個節點上的網絡代理,負責實現 Service 的負載均衡和流量轉發。它支持三種工作模式:

userspace 模式(已淘汰)
  • 原理:kube-proxy 作為用戶態進程,通過 iptables 捕獲 Service 的 ClusterIP 流量,然后轉發到后端 Pod。
  • 缺點:性能較差(上下文切換開銷大),已逐漸被棄用。
iptables 模式(默認)
  • 原理
    1. kube-proxy 監聽 Service 和 Endpoint 的變化,動態生成 iptables 規則。
    2. 當客戶端訪問 Service 的 ClusterIP 時,iptables 隨機選擇一個后端 Pod IP,并將請求轉發過去。
  • 特點
    • 純內核態轉發,性能較高。
    • 支持基本的輪詢負載均衡。
    • 無法處理會話保持(需通過?sessionAffinity: ClientIP?實現)。
  • 查看 iptables 規則
    kubectl get svc nginx-service -o yaml  # 獲取 ClusterIP
    iptables -t nat -L | grep <ClusterIP>
    ?
IPVS 模式(推薦高性能場景)
  • 原理
    1. kube-proxy 調用 Linux 內核的 IPVS 模塊(基于哈希表的負載均衡器)。
    2. IPVS 支持多種負載均衡算法(如輪詢、加權輪詢、最少連接等),性能優于 iptables。
  • 啟用方式
    • 修改 kube-proxy 啟動參數:--proxy-mode=ipvs
    • 確保節點已加載 IPVS 內核模塊(如?ip_vs_rr,?ip_vs_wrr)。
  • 查看 IPVS 規則
    ipvsadm -Ln

?

Service 類型與流量路由

根據訪問范圍,Service 分為四種類型,其流量路由方式如下:

ClusterIP(默認)
  • 訪問范圍:僅集群內部。
  • 路由過程
    1. 客戶端訪問?nginx-service:80?或 ClusterIP。
    2. kube-proxy 通過 iptables/IPVS 將請求轉發到匹配的 Pod。
  • 適用場景:內部服務間通信(如微服務調用)。

ClusterIP實例:

apiVersion: v1
kind: Service
metadata:name: my-service       # 服務名稱namespace: default     # 命名空間(可選)labels:app: my-app          # 服務標簽
spec:type: ClusterIP        # 指定為ClusterIP類型(默認可省略)selector:app: my-app          # 匹配Pod的標簽ports:- protocol: TCP      # 協議類型(TCP/UDP)port: 80           # 服務暴露的端口(集群內部訪問)targetPort: 8080   # 后端Pod的端口

NodePort
  • 訪問范圍:外部通過節點 IP + 端口訪問。
  • 路由過程
    1. 客戶端訪問?<節點IP>:<NodePort>(如?192.168.1.100:30080)。
    2. 節點上的 iptables/IPVS 將請求轉發到 Service 的 ClusterIP,再路由到 Pod。
  • 特點
    • NodePort 范圍默認 30000-32767。
    • 外部流量需手動配置負載均衡器(如 Nginx)分發到多個節點。

NodePort實例:

apiVersion: v1
kind: Service
metadata:name: my-nodeport-servicenamespace: defaultlabels:app: my-app
spec:type: NodePort        # 指定為NodePort類型selector:app: my-app         # 匹配Pod的標簽ports:- protocol: TCPport: 80          # 服務內部端口(供集群內部訪問)targetPort: 8080  # 后端Pod的端口nodePort: 30080   # 節點上暴露的端口(可選,默認自動分配30000-32767)

LoadBalancer
  • 訪問范圍:外部通過云廠商負載均衡器訪問。
  • 路由過程
    1. 創建 Service 時指定?type: LoadBalancer
    2. 云控制器(Cloud Controller Manager)自動創建外部負載均衡器(如 AWS ALB)。
    3. 外部流量通過負載均衡器分發到節點,再路由到 Pod。
  • 適用場景:生產環境暴露服務。

loadBalancer實例:

apiVersion: v1
kind: Service
metadata:name: my-loadbalancer-servicenamespace: defaultlabels:app: my-appannotations:# 可選:云服務商特定的注解(如AWS、GKE)service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:type: LoadBalancer       # 指定為LoadBalancer類型selector:app: my-app            # 匹配Pod的標簽ports:- protocol: TCPport: 80             # 服務暴露的端口(負載均衡器端口)targetPort: 8080     # 后端Pod的端口nodePort: 30080      # 可選:自動分配的NodePort(LoadBalancer依賴NodePort實現)externalTrafficPolicy: Cluster  # 可選:Cluster(默認)或Local

ExternalName
  • 訪問范圍:通過 DNS CNAME 映射外部服務。
  • 路由過程
    1. 客戶端訪問 Service 的 DNS 名稱(如?my-db.default.svc.cluster.local)。
    2. DNS 解析返回外部服務的 CNAME(如?mysql.example.com)。
  • 適用場景:訪問集群外部數據庫或 API。

?創建101命名空間所需要的yaml文件

[root@k8s-master opt]# cat myapp01.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp01namespace: test01
spec:replicas: 1selector: #標簽選擇器matchLabels: #匹配的標簽為app: myapp01release: canarytemplate:metadata:labels:app: myapp01 #和上面的myapp要匹配release: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v1ports:- name: http01containerPort: 80
[root@k8s-master opt]# cat myapp-svc-extername01.yaml 
kind: Service
apiVersion: v1
metadata:name: myapp-svcname02namespace: test01
spec:type: ExternalNameexternalName: myapp-svc02.test02.svc.cluster.local
[root@k8s-master opt]# cat myapp-svc-headless01.yaml 
apiVersion: v1
kind: Service
metadata:name: myapp-svc01namespace: test01
spec:selector:app: myapp01 #挑選的pod還是myapp01。一個pod可以有多個servicerelease: canaryclusterIP: None #None表示是無頭serviceports:- port: 39320 #service ip中的端口targetPort: 80 #容器ip中的端口

?創建102命名空間所需要的yaml文件

[root@k8s-master opt]# cat myapp-svc-headless02.yaml 
apiVersion: v1
kind: Service
metadata:name: myapp-svc02namespace: test02
spec:selector:app: myapp02 #挑選的pod還是myapp。一個pod可以有多個servicerelease: canaryclusterIP: None #None表示是無頭serviceports:- port: 39320 #service ip中的端口targetPort: 80 #容器ip中的端口
[root@k8s-master opt]# cat myapp-svc-extername02.yaml 
kind: Service
apiVersion: v1
metadata:name: myapp-svcname01namespace: test02
spec:type: ExternalNameexternalName: myapp-svc01.test01.svc.cluster.local
[root@k8s-master opt]# cat myapp02.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp02namespace: test02
spec:replicas: 1selector: #標簽選擇器matchLabels: #匹配的標簽為app: myapp02release: canarytemplate:metadata:labels:app: myapp02 #和上面的myapp要匹配release: canaryspec:containers:- name: myapp02image: ikubernetes/myapp:v1ports:- name: http02containerPort: 80

驗證:

##查看test01容器的ip地址
[root@k8s-master opt]# ku get pods -n test01 -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
myapp01-696c886d6b-bbvrn   1/1     Running   0          30m   10.244.36.80   k8s-node1   <none>           <none>##登陸到test02命名空間的容器,訪問test01容器的ip
[root@k8s-master opt]# ku exec -it myapp02-55ffcd5f64-xmgq8 -n test02 -- sh
/ # ping 10.244.36.80
PING 10.244.36.80 (10.244.36.80): 56 data bytes
64 bytes from 10.244.36.80: seq=0 ttl=63 time=0.059 ms
64 bytes from 10.244.36.80: seq=1 ttl=63 time=0.121 ms

?

?

?

?

?

?

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

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

相關文章

洛谷P1514 [NOIP 2010 提高組] 引水入城

洛谷P1514 [NOIP 2010 提高組] 引水入城 洛谷題目傳送門 題目背景 NOIP2010 提高組 T4 題目描述 在一個遙遠的國度&#xff0c;一側是風景秀美的湖泊&#xff0c;另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊&#xff0c;剛好構成一個 NNN 行 MMM 列的矩形&#xff…

【unity小技巧】國內Unity6下載安裝和一些Unity6新功能使用介紹

文章目錄前言一、安裝1、國外下載2、國內下載二、常用的新功能變化1、官方推薦使用inputsystem進行輸入控制2、修復了InputSystem命名錯誤導致listen被遮擋的bug3、自帶去除unity啟動畫面logo功能4、unity官方的behavior行為樹插件5、linearVelocity代替過時的velocity方法6、隨…

Rust 中字符串類型區別解析

在 Rust 中&#xff0c;"hello" 和 String::from("hello") 都表示字符串&#xff0c;但它們在內存表示、所有權和可變性上有本質區別&#xff1a;1. 類型與內存表示"hello" (字符串字面量)&#xff1a;類型為 &str&#xff08;字符串切片引用…

springMVC05-異常處理器

在 SpringMVC 中&#xff0c;異常處理是一個非常重要的功能&#xff0c;它可以讓你優雅地處理程序拋出的各種異常&#xff0c;向用戶展示友好的提示&#xff0c;而不是顯示一堆報錯信息&#xff08;如 500 頁面&#xff09;。一、SpringMVC的異常處理器返回的是ModelAndView&am…

安裝 Elasticsearch IK 分詞器

安裝 Elasticsearch IK 分詞器&#xff08;手動 .zip/.zip 安裝&#xff09; IK 分詞器&#xff08;IK Analysis&#xff09;是 Elasticsearch 最常用的中文分詞插件&#xff0c;支持 細粒度分詞&#xff08;ik_max_word&#xff09; 和 智能切分&#xff08;ik_smart&#xf…

數據庫系統原理實驗1:創建數據庫、數據表及單表查詢

一、實驗目的1&#xff0e;掌握在SQL Server中使用對象資源管理器和SQL命令創建數據庫與修改數據庫的方法。2&#xff0e;掌握在SQL Server中使用對象資源管理器或者SQL命令創建數據表和修改數據表的方法&#xff08;以SQL命令為重點&#xff09;。3&#xff0e;掌握無條件查詢…

【STM32】ADC模數轉換基本原理(提供完整實例代碼)

這篇文章是嵌入式中我通過大量資料 整合成了一份 系統完整、層次清晰的 ADC 模數轉換原理解析 文檔。 這里系統地梳理了 STM32F1 系列 ADC 模數轉換的核心資料&#xff0c;包括&#xff1a; 1.原理 特性 2.通道配置 3.模式選擇&#xff08;單次/連續/掃描&#xff09; 4.關鍵寄…

圖神經網絡 gnn 應用到道路網絡拓撲結構與交通碳排放相關性。,拓撲指標量化、時空關聯模型及演化機制分析

針對您提出的“道路網絡拓撲結構與交通碳排放相關框架&#xff0c;以下結合研究目標、數據與方法進行系統性深化設計&#xff0c;重點強化拓撲指標量化、時空關聯模型及演化機制分析&#xff1a;一、核心研究問題深化 靜態關聯&#xff1a;不同拓撲結構&#xff08;方格網/環射…

7.6 優先隊列| dijkstra | hash | rust

lc1337pair存入&#xff0c;lambda sort后取出&#xff0c;最開始想用hash&#xff0c;寫一半感覺寫復雜了class Solution {public:vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {int m mat.size();int n mat[0].size();vector<pair…

最新 HarmonyOS API 20 知識庫 重磅推出

最新 HarmonyOS API 20 知識庫 重磅推出 前言 最近整理下 華為開發者聯盟最新的 API 20的鴻蒙應用開發文檔&#xff0c;這次的API 20 相比較之前的文檔&#xff0c;要多了不少內容&#xff0c;目前整理后是9000千多篇&#xff0c;不容易呀。 如何使用 基于騰訊的知識庫工具 …

uniapp 監聽物理返回按鈕

import {onShow,onHide,onLoad,onReady,onBackPress} from "dcloudio/uni-app"onBackPress((e) > {showLog("返回按鈕觸發")if(e.frombackbutton){//開始干活}})參數說明屬性類型說明fromString觸發返回行為的來源&#xff1a;backbutton——左上角導航…

多線程(2)

多線程&#xff08;2&#xff09; &#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&am…

網關助力航天噴涂:Devicenet與Modbus TCP的“跨界對話“

在航空航天領域&#xff0c;飛機、航天器的制造過程有著極高的精度與安全性要求。以飛機、航天器表面噴涂作業為例&#xff0c;不僅要進行嚴格的防腐蝕處理&#xff0c;而且對表面光滑度要求極高&#xff0c;這直接關系到飛行器的空氣動力學性能和使用壽命。為確保作業安全與質…

從傳統項目管理到敏捷DevOps:如何轉向使用DevOps看板工具進行工作流管理

在DevOps實踐中&#xff0c;DevOps看板工具成為了開發與運維團隊之間高效協作的關鍵。隨著企業對敏捷開發和持續交付的需求日益增長&#xff0c;DevOps看板工具通過可視化的管理方法&#xff0c;幫助團隊在繁雜的任務中保持高效的工作節奏和清晰的進度跟蹤。 具體而言&#xff…

【leetcode100】下一個排列

1、題目描述 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整數數組的 下一個排列 是指其整數的下一個字典序更大的排列。更正…

Flink-Source算子狀態恢復分析

背景 修改 source 算子 kafka_old_topic 消費任務運行一段時間后&#xff0c;暫停狀態并保留。然后將 uid 和 topic 都改了&#xff0c;消費者 offset 會從 earliest 開始。 // before FlinkKafkaConsumer consumer KafkaConfig.getConsumer("kafka_old_topic");…

IDEA中application.yml配置文件不自動提示解決辦法

今天在自己的電腦上使用IDEA的時候&#xff0c;發現在application配置文件里面輸入配置項的時候沒有提示&#xff0c;網上找了一圈也沒解決&#xff0c;最后自己試出來了。 解決辦法&#xff1a; 鼠標移動到配置文件上&#xff0c;單擊右鍵-重寫文件類型、選擇YAML(捆綁)&#…

Vite 完整功能詳解與 Vue 項目實戰指南

Vite 完整功能詳解與 Vue 項目實戰指南 Vite 是下一代前端開發工具&#xff0c;由 Vue 作者尤雨溪開發&#xff0c;提供極速的開發體驗和高效的生產構建。以下是完整功能解析和實戰示例&#xff1a;一、Vite 核心功能亮點閃電般冷啟動 基于原生 ES 模塊&#xff08;ESM&#xf…

Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解

&#x1f4d8;Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解&#x1f516; 收藏 點贊 關注&#xff0c;掌握 Vue 3 路由參數監聽中的隱藏陷阱&#xff0c;避免詳情頁、嵌套路由頁誤觸發重復請求&#xff01;&#x1f9e9; 一、問題背景 在 Vue 3 項目中&#xff0c…

前端 項目更新通知 (plugin-web-update-notification)

項目版本更新迭代時&#xff0c;需提示用戶更新系統&#xff0c;不然早時間不更新對用戶體驗很不好&#xff0c;所以在每次部署后需要提示用戶&#xff0c;刷新靜態資源。推薦插件 plugin-web-update-notification .具體配置 vite.config.js文件中 import { webUpdateNotice …