032.核心組件-kube-proxy

来源:https://www.cnblogs.com/itzgr/archive/2020/03/18/12516505.html
-Advertisement-
Play Games

一 kube-proxy原理 1.1 kube-proxy概述 Kubernetes為了支持集群的水平擴展、高可用性,抽象出了Service的概念。Service是對一組Pod的抽象,它會根據訪問策略(如負載均衡策略)來訪問這組Pod。Kubernetes在創建Service時會為Service分配 ...


一 kube-proxy原理

1.1 kube-proxy概述

Kubernetes為了支持集群的水平擴展、高可用性,抽象出了Service的概念。Service是對一組Pod的抽象,它會根據訪問策略(如負載均衡策略)來訪問這組Pod。Kubernetes在創建Service時會為Service分配一個虛擬的IP地址,客戶端通過訪問這個虛擬的IP地址來訪問服務,Service則負責將請求轉發到後端的Pod上。 Service作用類似反向代理,但與普通的反向代理有一些不同:首先,它的IP地址是虛擬的,預設情況無法從外面訪問;其次,它的部署和啟停是由Kubernetes統一自動管理的。 然而,Service是一個抽象概念,而真正提供Service功能的是kube-proxy服務進程。在Kubernetes集群的每個Node上都會運行一個kube-proxy服務進程,可以簡單理解此進程是Service的透明代理兼負載均衡器,其核心功能是將到某個Service的訪問請求轉發到後端的多個Pod實例上。 此外,Service的ClusterIP與NodePort等概念是kube-proxy服務通過iptables的NAT轉換實現的,kube-proxy在運行過程中動態創建與Service相關的iptables規則,這些規則實現了將訪問服務(ClusterIP或NodePort)的請求負載分發到後端Pod的功能。 由於iptables機制針對的是本地的kube-proxy埠,所以在每個Node上都要運行kube-proxy組件。這樣一來,在Kubernetes集群內部,才可以在任意Node上發起對Service的訪問請求。 綜上所述,由於kube-proxy的作用,在Service的調用過程中客戶端無須關心後端有幾個Pod,中間過程的通信、負載均衡及故障恢復都是透明的。

二 kube-proxy模式

2.1 userspace模式

起初,kube-proxy進程是一個真實的TCP/UDP代理,類似HAProxy,負責從Service到Pod的訪問流量的轉發,這種模式被稱為userspace(用戶空間代理)模式。 clipboard 如圖所示,當某個Pod以ClusterIP方式訪問某個Service的時候,這個流量會被Pod所在本機的iptables轉發到本機的kube-proxy進程,然後由kube-proxy建立起到後端Pod的TCP/UDP連接,隨後將請求轉發到某個後端Pod上,併在這個過程中實現負載均衡功能。 ClusterIP與NodePort的實現原理,以及kube-proxy與APIServer的交互過程,如下圖所示: clipboard 提示:如上為舊版kube-proxy與APIServer的交互過程。

2.2 iptables模式

如圖所示,Kubernetes從1.2版本開始,將iptables作為kube-proxy的預設模式。iptables模式下的kube-proxy不再起到Proxy的作用,其核心功能:通過API Server的Watch介面實時跟蹤Service與Endpoint的變更信息,並更新對應的iptables規則,Client的請求流量則通過iptables的NAT機制“直接路由”到目標Pod。 clipboard 根據Kubernetes的網路模型,一個Node上的Pod與其他Node上的Pod應該能夠直接建立雙向的TCP/IP通信通道,所以如果直接修改iptables規則,則也可以實現kube-proxy的功能,只不過後者更加高端,因為是全自動模式的。 與第1代的userspace模式相比,iptables模式完全工作在內核態,不用再經過用戶態的kube-proxy中轉,因而性能更強。 iptables模式雖然實現起來簡單,但存在無法避免的缺陷:在集群中的Service和Pod大量增加以後,iptables中的規則會急速膨脹,導致性能顯著下降,在某些極端情況下甚至會出現規則丟失的情況,並且這種故障難以重現與排查,於是Kubernetes從1.8版本開始引入第3代的IPVS(IPVirtualServer)模式。 kube-proxy針對Service和Pod創建的一些主要的iptables規則如下。
  • KUBE-CLUSTER-IP:在masquerade-all=true或clusterCIDR指定的情況下對ServiceClusterIP地址進行偽裝,以解決數據包欺騙問題。
  • KUBE-EXTERNAL-IP:將數據包偽裝成Service的外部IP地址。
  • KUBE-LOAD-BALANCER、KUBE-LOAD-BALANCERLOCAL:偽裝LoadBalancer類型的Service流量。
  • KUBE-NODE-PORT-TCP、KUBE-NODE-PORT-LOCALTCP、KUBE-NODE-PORTUDP、KUBE-NODE-PORT-LOCAL-UDP:偽裝NodePort類型的Service流量。

2.3 IPVS模式

clipboard 如圖所示。IPVS在Kubernetes1.11中升級為GA穩定版。iptables與IPVS雖然都是基於Netfilter實現的,但因為定位不同,二者有著本質的差別:iptables是為防火牆而設計的;IPVS則專門用於高性能負載均衡,並使用更高效的數據結構(Hash表),允許幾乎無限的規模擴張,因此被kube-proxy採納為第三代模式。 與iptables相比,IPVS擁有以下明顯優勢:
  1. 為大型集群提供了更好的可擴展性和性能;
  2. 支持比iptables更複雜的複製均衡演算法(最小負載、最少連接、加權等);
  3. 支持伺服器健康檢查和連接重試等功能;
  4. 可以動態修改ipset的集合,即使iptables的規則正在使用這個集合。
由於IPVS無法提供包過濾、airpin-masqueradetricks(地址偽裝)、SNAT等功能,因此在某些場景(如NodePort的實現)下還要與iptables搭配使用。 在IPVS模式下,kube-proxy又做了重要的升級,即使用iptables的擴展ipset,而不是直接調用iptables來生成規則鏈。iptables規則鏈是一個線性的數據結構,ipset則引入了帶索引的數據結構,因此當規則很多時,也可以很高效地查找和匹配。 可以將ipset簡單理解為一個IP(段)的集合,這個集合的內容可以是IP地址、IP網段、埠等,iptables可以直接添加規則對這個“可變的集合”進行操作,這樣做的好處在於可以大大減少iptables規則的數量,從而減少性能損耗。假設要禁止上萬個IP訪問我們的伺服器,則用iptables的話,就需要一條一條地添加規則,會在iptables中生成大量的規則;但是用ipset的話,只需將相關的IP地址(網段)加入ipset集合中即可,這樣只需設置少量的iptables規則即可實現目標。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET 5 Preview 1 發佈 去年年底,我們發佈了.NET Core 3.0和3.1.這些版本添加了桌面應用程式模型Windows Forms(WinForms)和WPF,ASP.NET Blazor用於構建SPA應用程式和用於構建分散式應用和服務的gRPC模板、用於與gRPC對話豐富的客 ...
  • At the end of last year, we shipped .NET Core 3.0 and 3.1. These versions added the desktop app models Windows Forms (WinForms) and WPF, ASP.NET Blazo ...
  • 1. 死鎖問題出現 2. 死鎖的成因 3. 死鎖的4個必要條件 4. 死鎖處理方法 1. 死鎖預防 2. 死鎖避免 判斷這次請求是否會引起死鎖? 演算法實現 死鎖避免之銀行家演算法實例 請求出現時: 首先假裝分配,然後調用銀行家演算法 3. 死鎖檢測+恢復: 發現問題再處理 例題: 4. 死鎖忽略 ...
  • 8. gitlab相關介紹 8.1 gitlab優勢 社區版本,自己可以在公司搭建環境 維護人員多,版本更新塊 易用性強,上手快 集成CI(持續集成) 集成CD(持續發佈) 8.2 持續集成 8.2.1 持續集成的優勢 快速發現錯誤。每完成一點更新,就集成到主幹,可以快速發現錯誤,定位錯誤也比較容易 ...
  • 一、進程描述符 進程式控制制塊PCB:是OS控制進程運行用的數據結構,是一個task_struct結構體。 PCB包括:進程標識信息(進程標識符PID等)、執行現場信息(CPU現場,進程切換時需要保存現場信息)、進程映像信息(進程地址空間,即進程在運行時代碼、數據、棧放在什麼位置,方便OS對地址空間進行 ...
  • 最近使用了parallels desktop 安裝了win10,啟動後發現會導致mac無聲音。後來百度到重啟coreaudiod進程可解決(在活動監視器里直接結束該進程後會自動重啟) 參考鏈接:MAC技巧:兩個方法,輕鬆解決蘋果電腦沒聲音! https://baijiahao.baidu.com/s ...
  • 命令幾乎是每個程式員都會用到的Linux命令。這個命令用來查看Linux系統的綜合性能,比如CPU使用情況,記憶體使用情況。這個命令能幫助我快速定位程式的性能問題。 雖然這個命令很重要,但是之前對於這個命令的使用幾乎僅限於查看下哪個進程使用的CPU最高,哪個進程占用的記憶體最高。對於輸出的各個參數的含義 ...
  • 虛擬機沒有VMnet0 橋接模式,你可以試試以下幾種方式,儘量都試試,因為具體情況原因有很多種!! 首先打開虛擬網路編輯器,發現沒有橋接。。。深吸一口氣,說我沒有毒!!! 一、先右擊開始 網路連接 更改網路適配器,查看一下是否有下麵這倆個 如果沒有,試試最靠命運的方法,重啟主機!!!(win10這樣 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...