Kubernetes 选择 IPVS
什么是 IPVS ?
IPVS (IP Virtual Server)是在 Netfilter 上層構建的,并作為 Linux 內核的一部分,實現傳輸層負載均衡。
IPVS 集成在 LVS(Linux Virtual Server,Linux 虛擬服務器)中,它在主機上運行,并在物理服務器集群前作為負載均衡器。IPVS 可以將基于 TCP 和 UDP 服務的請求定向到真實服務器,并使真實服務器的服務在單個IP地址上顯示為虛擬服務。 因此,IPVS 自然支持 Kubernetes 服務。
為什么為 Kubernetes 選擇 IPVS ?
隨著 Kubernetes 的使用增長,其資源的可擴展性變得越來越重要。特別是,服務的可擴展性對于運行大型工作負載的開發人員/公司采用 Kubernetes 至關重要。
Kube-proxy 是服務路由的構建塊,它依賴于經過強化攻擊的 iptables 來實現支持核心的服務類型,如 ClusterIP 和 NodePort。 但是,iptables 難以擴展到成千上萬的服務,因為它純粹是為防火墻而設計的,并且基于內核規則列表。
盡管 Kubernetes 在版本v1.6中已經支持5000個節點,但使用 iptables 的 kube-proxy 實際上是將集群擴展到5000個節點的瓶頸。 一個例子是,在5000節點集群中使用 NodePort 服務,如果我們有2000個服務并且每個服務有10個 pod,這將在每個工作節點上至少產生20000個 iptable 記錄,這可能使內核非常繁忙。
另一方面,使用基于 IPVS 的集群內服務負載均衡可以為這種情況提供很多幫助。 IPVS 專門用于負載均衡,并使用更高效的數據結構(哈希表),允許幾乎無限的規模擴張。
基于 IPVS 的 Kube-proxy
參數更改
參數: –proxy-mode 除了現有的用戶空間和 iptables 模式,IPVS 模式通過–proxy-mode = ipvs 進行配置。 它隱式使用 IPVS NAT 模式進行服務端口映射。
參數: –ipvs-scheduler
添加了一個新的 kube-proxy 參數來指定 IPVS 負載均衡算法,參數為 –ipvs-scheduler。 如果未配置,則默認為 round-robin 算法(rr)。
- rr: round-robin
- lc: least connection
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
將來,我們可以實現特定于服務的調度程序(可能通過注釋),該調度程序具有更高的優先級并覆蓋該值。
參數: –cleanup-ipvs 類似于 –cleanup-iptables 參數,如果為 true,則清除在 IPVS 模式下創建的 IPVS 配置和 IPTables 規則。
參數: –ipvs-sync-period 刷新 IPVS 規則的最大間隔時間(例如’5s’,’1m’)。 必須大于0。
參數: –ipvs-min-sync-period 刷新 IPVS 規則的最小間隔時間間隔(例如’5s’,’1m’)。 必須大于0。
參數: –ipvs-exclude-cidrs 清除 IPVS 規則時 IPVS 代理不應觸及的 CIDR 的逗號分隔列表,因為 IPVS 代理無法區分 kube-proxy 創建的 IPVS 規則和用戶原始規則 IPVS 規則。 如果您在環境中使用 IPVS proxier 和您自己的 IPVS 規則,則應指定此參數,否則將清除原始規則。
設計注意事項
IPVS 服務網絡拓撲
創建 ClusterIP 類型服務時,IPVS proxier 將執行以下三項操作:
- 確保節點中存在虛擬接口,默認為 kube-ipvs0
- 將服務 IP 地址綁定到虛擬接口
- 分別為每個服務 IP 地址創建 IPVS 虛擬服務器
這是一個例子:
# 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請注意,Kubernetes 服務和 IPVS 虛擬服務器之間的關系是“1:N”。 例如,考慮具有多個 IP 地址的 Kubernetes 服務。 外部 IP 類型服務有兩個 IP 地址 - 集群IP和外部 IP。 然后,IPVS 代理將創建2個 IPVS 虛擬服務器 - 一個用于集群 IP,另一個用于外部 IP。 Kubernetes 的 endpoint(每個IP +端口對)與 IPVS 虛擬服務器之間的關系是“1:1”。
刪除 Kubernetes 服務將觸發刪除相應的 IPVS 虛擬服務器,IPVS 物理服務器及其綁定到虛擬接口的 IP 地址。
端口映射
IPVS 中有三種代理模式:NAT(masq),IPIP 和 DR。 只有 NAT 模式支持端口映射。 Kube-proxy 利用 NAT 模式進行端口映射。 以下示例顯示 IPVS 服務端口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會話關系
IPVS 支持客戶端 IP 會話關聯(持久連接)。 當服務指定會話關系時,IPVS 代理將在 IPVS 虛擬服務器中設置超時值(默認為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 10800IPVS 代理中的 Iptables 和 Ipset
IPVS 用于負載均衡,它無法處理 kube-proxy 中的其他問題,例如 包過濾,數據包欺騙,SNAT 等
IPVS proxier 在上述場景中利用 iptables。 具體來說,ipvs proxier 將在以下4種情況下依賴于 iptables:
- kube-proxy 以 –masquerade-all = true 開頭
- 在 kube-proxy 啟動中指定集群 CIDR
- 支持 Loadbalancer 類型服務
- 支持 NodePort 類型的服務
但是,我們不想創建太多的 iptables 規則。 所以我們采用 ipset 來減少 iptables 規則。 以下是 IPVS proxier 維護的 ipset 集表:
設置名稱 成員 用法
KUBE-CLUSTER-IP 所有服務 IP + 端口 masquerade-all=true 或 clusterCIDR 指定的情況下進行偽裝 KUBE-LOOP-BACK 所有服務 IP +端口+ IP 解決數據包欺騙問題
KUBE-EXTERNAL-IP 服務外部 IP +端口 將數據包偽裝成外部 IP
KUBE-LOAD-BALANCER 負載均衡器入口 IP +端口 將數據包偽裝成 Load Balancer 類型的服務
KUBE-LOAD-BALANCER-LOCAL 負載均衡器入口 IP +端口 以及 externalTrafficPolicy=local 接受數據包到 Load Balancer externalTrafficPolicy=local KUBE-LOAD-BALANCER-FW 負載均衡器入口 IP +端口 以及 loadBalancerSourceRanges 使用指定的 loadBalancerSourceRanges 丟棄 Load Balancer類型Service的數據包 KUBE-LOAD-BALANCER-SOURCE-CIDR 負載均衡器入口 IP +端口 + 源 CIDR 接受 Load Balancer 類型 Service 的數據包,并指定loadBalancerSourceRanges KUBE-NODE-PORT-TCP NodePort 類型服務 TCP 將數據包偽裝成 NodePort(TCP)
KUBE-NODE-PORT-LOCAL-TCP NodePort 類型服務 TCP 端口,帶有 externalTrafficPolicy=local 接受數據包到 NodePort 服務 使用 externalTrafficPolicy=local KUBE-NODE-PORT-UDP NodePort 類型服務 UDP 端口 將數據包偽裝成 NodePort(UDP)
KUBE-NODE-PORT-LOCAL-UDP NodePort 類型服務 UDP 端口 使用 externalTrafficPolicy=local 接受數據包到NodePort服務 使用 externalTrafficPolicy=local
通常,對于 IPVS proxier,無論我們有多少 Service/ Pod,iptables 規則的數量都是靜態的。
在 IPVS 模式下運行 kube-proxy
目前,本地腳本,GCE 腳本和 kubeadm 支持通過導出環境變量(KUBE_PROXY_MODE=ipvs)或指定標志(–proxy-mode=ipvs)來切換 IPVS 代理模式。 在運行IPVS 代理之前,請確保已安裝 IPVS 所需的內核模塊。
ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4最后,對于 Kubernetes v1.10,“SupportIPVSProxyMode” 默認設置為 “true”。 對于 Kubernetes v1.11 ,該選項已完全刪除。 但是,您需要在v1.10之前為Kubernetes 明確啟用 –feature-gates = SupportIPVSProxyMode = true。
轉載于:https://www.cnblogs.com/weifeng1463/p/10360371.html
總結
以上是生活随笔為你收集整理的Kubernetes 选择 IPVS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端工程师算法(一)
- 下一篇: 力扣——按递增顺序显示卡牌