日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes 选择 IPVS

發(fā)布時(shí)間:2025/4/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes 选择 IPVS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是 IPVS ?

IPVS (IP Virtual Server)是在 Netfilter 上層構(gòu)建的,并作為 Linux 內(nèi)核的一部分,實(shí)現(xiàn)傳輸層負(fù)載均衡。

IPVS 集成在 LVS(Linux Virtual Server,Linux 虛擬服務(wù)器)中,它在主機(jī)上運(yùn)行,并在物理服務(wù)器集群前作為負(fù)載均衡器。IPVS 可以將基于 TCP 和 UDP 服務(wù)的請(qǐng)求定向到真實(shí)服務(wù)器,并使真實(shí)服務(wù)器的服務(wù)在單個(gè)IP地址上顯示為虛擬服務(wù)。 因此,IPVS 自然支持 Kubernetes 服務(wù)。

為什么為 Kubernetes 選擇 IPVS ?

隨著 Kubernetes 的使用增長,其資源的可擴(kuò)展性變得越來越重要。特別是,服務(wù)的可擴(kuò)展性對(duì)于運(yùn)行大型工作負(fù)載的開發(fā)人員/公司采用 Kubernetes 至關(guān)重要。

Kube-proxy 是服務(wù)路由的構(gòu)建塊,它依賴于經(jīng)過強(qiáng)化攻擊的 iptables 來實(shí)現(xiàn)支持核心的服務(wù)類型,如 ClusterIP 和 NodePort。 但是,iptables 難以擴(kuò)展到成千上萬的服務(wù),因?yàn)樗兇馐菫榉阑饓ΧO(shè)計(jì)的,并且基于內(nèi)核規(guī)則列表。

盡管 Kubernetes 在版本v1.6中已經(jīng)支持5000個(gè)節(jié)點(diǎn),但使用 iptables 的 kube-proxy 實(shí)際上是將集群擴(kuò)展到5000個(gè)節(jié)點(diǎn)的瓶頸。 一個(gè)例子是,在5000節(jié)點(diǎn)集群中使用 NodePort 服務(wù),如果我們有2000個(gè)服務(wù)并且每個(gè)服務(wù)有10個(gè) pod,這將在每個(gè)工作節(jié)點(diǎn)上至少產(chǎn)生20000個(gè) iptable 記錄,這可能使內(nèi)核非常繁忙。

另一方面,使用基于 IPVS 的集群內(nèi)服務(wù)負(fù)載均衡可以為這種情況提供很多幫助。 IPVS 專門用于負(fù)載均衡,并使用更高效的數(shù)據(jù)結(jié)構(gòu)(哈希表),允許幾乎無限的規(guī)模擴(kuò)張。

基于 IPVS 的 Kube-proxy

參數(shù)更改

參數(shù): –proxy-mode 除了現(xiàn)有的用戶空間和 iptables 模式,IPVS 模式通過–proxy-mode = ipvs 進(jìn)行配置。 它隱式使用 IPVS NAT 模式進(jìn)行服務(wù)端口映射。

參數(shù): –ipvs-scheduler

添加了一個(gè)新的 kube-proxy 參數(shù)來指定 IPVS 負(fù)載均衡算法,參數(shù)為 –ipvs-scheduler。 如果未配置,則默認(rèn)為 round-robin 算法(rr)。

  • rr: round-robin
  • lc: least connection
  • dh: destination hashing
  • sh: source hashing
  • sed: shortest expected delay
  • nq: never queue

將來,我們可以實(shí)現(xiàn)特定于服務(wù)的調(diào)度程序(可能通過注釋),該調(diào)度程序具有更高的優(yōu)先級(jí)并覆蓋該值。

參數(shù): –cleanup-ipvs 類似于 –cleanup-iptables 參數(shù),如果為 true,則清除在 IPVS 模式下創(chuàng)建的 IPVS 配置和 IPTables 規(guī)則。

參數(shù): –ipvs-sync-period 刷新 IPVS 規(guī)則的最大間隔時(shí)間(例如’5s’,’1m’)。 必須大于0。

參數(shù): –ipvs-min-sync-period 刷新 IPVS 規(guī)則的最小間隔時(shí)間間隔(例如’5s’,’1m’)。 必須大于0。

參數(shù): –ipvs-exclude-cidrs 清除 IPVS 規(guī)則時(shí) IPVS 代理不應(yīng)觸及的 CIDR 的逗號(hào)分隔列表,因?yàn)?IPVS 代理無法區(qū)分 kube-proxy 創(chuàng)建的 IPVS 規(guī)則和用戶原始規(guī)則 IPVS 規(guī)則。 如果您在環(huán)境中使用 IPVS proxier 和您自己的 IPVS 規(guī)則,則應(yīng)指定此參數(shù),否則將清除原始規(guī)則。

設(shè)計(jì)注意事項(xiàng)

IPVS 服務(wù)網(wǎng)絡(luò)拓?fù)?/p>

創(chuàng)建 ClusterIP 類型服務(wù)時(shí),IPVS proxier 將執(zhí)行以下三項(xiàng)操作:

  • 確保節(jié)點(diǎn)中存在虛擬接口,默認(rèn)為 kube-ipvs0
  • 將服務(wù) IP 地址綁定到虛擬接口
  • 分別為每個(gè)服務(wù) IP 地址創(chuàng)建 IPVS 虛擬服務(wù)器

這是一個(gè)例子:

# kubectl describe svc nginx-service Name: nginx-service ... Type: ClusterIP IP: 10.102.128.4 Port: http 3080/TCP Endpoints: 10.244.0.235:8080,10.244.1.237:8080 Session Affinity: None# ip addr ... 73: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 1a:ce:f5:5f:c1:4d brd ff:ff:ff:ff:ff:ffinet 10.102.128.4/32 scope global kube-ipvs0valid_lft forever preferred_lft forever# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.102.128.4:3080 rr-> 10.244.0.235:8080 Masq 1 0 0 -> 10.244.1.237:8080 Masq 1 0 0

請(qǐng)注意,Kubernetes 服務(wù)和 IPVS 虛擬服務(wù)器之間的關(guān)系是“1:N”。 例如,考慮具有多個(gè) IP 地址的 Kubernetes 服務(wù)。 外部 IP 類型服務(wù)有兩個(gè) IP 地址 - 集群IP和外部 IP。 然后,IPVS 代理將創(chuàng)建2個(gè) IPVS 虛擬服務(wù)器 - 一個(gè)用于集群 IP,另一個(gè)用于外部 IP。 Kubernetes 的 endpoint(每個(gè)IP +端口對(duì))與 IPVS 虛擬服務(wù)器之間的關(guān)系是“1:1”。

刪除 Kubernetes 服務(wù)將觸發(fā)刪除相應(yīng)的 IPVS 虛擬服務(wù)器,IPVS 物理服務(wù)器及其綁定到虛擬接口的 IP 地址。

端口映射

IPVS 中有三種代理模式:NAT(masq),IPIP 和 DR。 只有 NAT 模式支持端口映射。 Kube-proxy 利用 NAT 模式進(jìn)行端口映射。 以下示例顯示 IPVS 服務(wù)端口3080到Pod端口8080的映射。

TCP 10.102.128.4:3080 rr-> 10.244.0.235:8080 Masq 1 0 0 -> 10.244.1.237:8080 Masq 1 0

會(huì)話關(guān)系

IPVS 支持客戶端 IP 會(huì)話關(guān)聯(lián)(持久連接)。 當(dāng)服務(wù)指定會(huì)話關(guān)系時(shí),IPVS 代理將在 IPVS 虛擬服務(wù)器中設(shè)置超時(shí)值(默認(rèn)為180分鐘= 10800秒)。 例如:

# kubectl describe svc nginx-service Name: nginx-service ... IP: 10.102.128.4 Port: http 3080/TCP Session Affinity: ClientIP# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.102.128.4:3080 rr persistent 10800

IPVS 代理中的 Iptables 和 Ipset

IPVS 用于負(fù)載均衡,它無法處理 kube-proxy 中的其他問題,例如 包過濾,數(shù)據(jù)包欺騙,SNAT 等

IPVS proxier 在上述場景中利用 iptables。 具體來說,ipvs proxier 將在以下4種情況下依賴于 iptables:

  • kube-proxy 以 –masquerade-all = true 開頭
  • 在 kube-proxy 啟動(dòng)中指定集群 CIDR
  • 支持 Loadbalancer 類型服務(wù)
  • 支持 NodePort 類型的服務(wù)

但是,我們不想創(chuàng)建太多的 iptables 規(guī)則。 所以我們采用 ipset 來減少 iptables 規(guī)則。 以下是 IPVS proxier 維護(hù)的 ipset 集表:

設(shè)置名稱 成員 用法
KUBE-CLUSTER-IP 所有服務(wù) IP + 端口 masquerade-all=true 或 clusterCIDR 指定的情況下進(jìn)行偽裝 KUBE-LOOP-BACK 所有服務(wù) IP +端口+ IP 解決數(shù)據(jù)包欺騙問題
KUBE-EXTERNAL-IP 服務(wù)外部 IP +端口 將數(shù)據(jù)包偽裝成外部 IP
KUBE-LOAD-BALANCER 負(fù)載均衡器入口 IP +端口 將數(shù)據(jù)包偽裝成 Load Balancer 類型的服務(wù)
KUBE-LOAD-BALANCER-LOCAL 負(fù)載均衡器入口 IP +端口 以及 externalTrafficPolicy=local 接受數(shù)據(jù)包到 Load Balancer externalTrafficPolicy=local KUBE-LOAD-BALANCER-FW 負(fù)載均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丟棄 Load Balancer類型Service的數(shù)據(jù)包 KUBE-LOAD-BALANCER-SOURCE-CIDR 負(fù)載均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 類型 Service 的數(shù)據(jù)包,并指定loadBalancerSourceRanges KUBE-NODE-PORT-TCP NodePort 類型服務(wù) TCP 將數(shù)據(jù)包偽裝成 NodePort(TCP)
KUBE-NODE-PORT-LOCAL-TCP NodePort 類型服務(wù) TCP 端口,帶有 externalTrafficPolicy=local 接受數(shù)據(jù)包到 NodePort 服務(wù) 使用 externalTrafficPolicy=local KUBE-NODE-PORT-UDP NodePort 類型服務(wù) UDP 端口 將數(shù)據(jù)包偽裝成 NodePort(UDP)
KUBE-NODE-PORT-LOCAL-UDP NodePort 類型服務(wù) UDP 端口 使用 externalTrafficPolicy=local 接受數(shù)據(jù)包到NodePort服務(wù) 使用 externalTrafficPolicy=local

通常,對(duì)于 IPVS proxier,無論我們有多少 Service/ Pod,iptables 規(guī)則的數(shù)量都是靜態(tài)的。

在 IPVS 模式下運(yùn)行 kube-proxy

目前,本地腳本,GCE 腳本和 kubeadm 支持通過導(dǎo)出環(huán)境變量(KUBE_PROXY_MODE=ipvs)或指定標(biāo)志(–proxy-mode=ipvs)來切換 IPVS 代理模式。 在運(yùn)行IPVS 代理之前,請(qǐng)確保已安裝 IPVS 所需的內(nèi)核模塊。

ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4

最后,對(duì)于 Kubernetes v1.10,“SupportIPVSProxyMode” 默認(rèn)設(shè)置為 “true”。 對(duì)于 Kubernetes v1.11 ,該選項(xiàng)已完全刪除。 但是,您需要在v1.10之前為Kubernetes 明確啟用 –feature-gates = SupportIPVSProxyMode = true。

轉(zhuǎn)載于:https://www.cnblogs.com/weifeng1463/p/10360371.html

總結(jié)

以上是生活随笔為你收集整理的Kubernetes 选择 IPVS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。