摘要:模式在中添加,并成為自以來的默認操作模式。支持比更復雜的負載平衡算法最小負載,最少連接,位置,加權等。安裝的集群默認情況下,將在部署的集群中以模式運行。
IPVS
這篇文章主要講述:
什么是IPVS?
IPVS 和 IPTABLES 區別
如何設置kube-proxy按照ipvs模式運行和故障排查
什么是IPVSIPVS(IP虛擬服務器)實現傳輸層負載平衡,通常稱為第4層LAN交換,是Linux內核的一部分。
IPVS在主機上運行,??在真實服務器集群前充當負載均衡器。 IPVS可以將對基于TCP和UDP的服務的請求定向到真實服務器,并使真實服務器的服務在單個IP地址上顯示為虛擬服務。
IPVS vs. IPTABLESIPVS模式在Kubernetes v1.8中引入,并在v1.9中進入了beta。 IPTABLES模式在v1.1中添加,并成為自v1.2以來的默認操作模式。 IPVS和IPTABLES都基于netfilter。 IPVS模式和IPTABLES模式之間的差異如下:
IPVS為大型集群提供了更好的可擴展性和性能。
IPVS支持比iptables更復雜的負載平衡算法(最小負載,最少連接,位置,加權等)。
IPVS支持服務器健康檢查和連接重試等。
什么時候ipvs會降級到iptablesIPVS proxier將使用iptables,在數據包過濾,SNAT和支持NodePort類型的服務這幾個場景中。具體來說,ipvs proxier將在以下4個場景中回歸iptables。
如果kube-proxy以--masquerade-all = true開頭,則ipvs proxier將偽裝訪問服務群集IP的所有流量,其行為與iptables proxier相同。假設有一個群集IP 10.244.5.1和端口8080的服務,那么ipvs proxier安裝的iptables應該如下所示。
# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain OUTPUT (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain POSTROUTING (policy ACCEPT) target prot opt source destination KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */ Chain KUBE-POSTROUTING (1 references) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000 Chain KUBE-MARK-DROP (0 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000 Chain KUBE-MARK-MASQ (6 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000 Chain KUBE-SERVICES (2 references) target prot opt source destination KUBE-MARK-MASQ tcp -- 0.0.0.0/0 10.244.5.1 /* default/foo:http cluster IP */ tcp dpt:8080
如果kube-proxy以--cluster-cidr =
# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain OUTPUT (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain POSTROUTING (policy ACCEPT) target prot opt source destination KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */ Chain KUBE-POSTROUTING (1 references) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000 Chain KUBE-MARK-DROP (0 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000 Chain KUBE-MARK-MASQ (6 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000 Chain KUBE-SERVICES (2 references) target prot opt source destination KUBE-MARK-MASQ tcp -- !10.244.16.0/24 10.244.5.1 /* default/foo:http cluster IP */ tcp dpt:8080
當服務的LoadBalancerStatus.ingress.IP不為空并且指定了服務的LoadBalancerSourceRanges時,ipvs proxier將安裝iptables,如下所示。
假設服務的LoadBalancerStatus.ingress.IP為10.96.1.2,服務的LoadBalancerSourceRanges為10.120.2.0/24。
# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain OUTPUT (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain POSTROUTING (policy ACCEPT) target prot opt source destination KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */ Chain KUBE-POSTROUTING (1 references) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000 Chain KUBE-MARK-DROP (0 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000 Chain KUBE-MARK-MASQ (6 references) target prot opt source destination MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000 Chain KUBE-SERVICES (2 references) target prot opt source destination ACCEPT tcp -- 10.120.2.0/24 10.96.1.2 /* default/foo:http loadbalancer IP */ tcp dpt:8080 DROP tcp -- 0.0.0.0/0 10.96.1.2 /* default/foo:http loadbalancer IP */ tcp dpt:8080
為了支持NodePort類型的服務,ipvs將在iptables proxier中繼續現有的實現。例如,
# kubectl describe svc nginx-service Name: nginx-service ... Type: NodePort IP: 10.101.28.148 Port: http 3080/TCP NodePort: http 31604/TCP Endpoints: 172.17.0.2:80 Session Affinity: None # iptables -t nat -nL [root@100-106-179-225 ~]# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain OUTPUT (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */ Chain KUBE-SERVICES (2 references) target prot opt source destination KUBE-MARK-MASQ tcp -- !172.16.0.0/16 10.101.28.148 /* default/nginx-service:http cluster IP */ tcp dpt:3080 KUBE-SVC-6IM33IEVEEV7U3GP tcp -- 0.0.0.0/0 10.101.28.148 /* default/nginx-service:http cluster IP */ tcp dpt:3080 KUBE-NODEPORTS all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL Chain KUBE-NODEPORTS (1 references) target prot opt source destination KUBE-MARK-MASQ tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp dpt:31604 KUBE-SVC-6IM33IEVEEV7U3GP tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp dpt:31604 Chain KUBE-SVC-6IM33IEVEEV7U3GP (2 references) target prot opt source destination KUBE-SEP-Q3UCPZ54E6Q2R4UT all -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ Chain KUBE-SEP-Q3UCPZ54E6Q2R4UT (1 references) target prot opt source destination KUBE-MARK-MASQ all -- 172.17.0.2 0.0.0.0/0 /* default/nginx-service:http */ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp to:172.17.0.2:80以 ipvs 模式 運行kube-proxy 前提條件
確保IPVS需要內核模塊
ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4
檢查上訴已編譯到節點內核中。使用
grep -e ipvs -e nf_conntrack_ipv4 /lib/modules/$(uname -r)/modules.builtin
如果編譯成內核,則得到如下結果。
kernel/net/ipv4/netfilter/nf_conntrack_ipv4.ko kernel/net/netfilter/ipvs/ip_vs.ko kernel/net/netfilter/ipvs/ip_vs_rr.ko kernel/net/netfilter/ipvs/ip_vs_wrr.ko kernel/net/netfilter/ipvs/ip_vs_lc.ko kernel/net/netfilter/ipvs/ip_vs_wlc.ko kernel/net/netfilter/ipvs/ip_vs_fo.ko kernel/net/netfilter/ipvs/ip_vs_ovf.ko kernel/net/netfilter/ipvs/ip_vs_lblc.ko kernel/net/netfilter/ipvs/ip_vs_lblcr.ko kernel/net/netfilter/ipvs/ip_vs_dh.ko kernel/net/netfilter/ipvs/ip_vs_sh.ko kernel/net/netfilter/ipvs/ip_vs_sed.ko kernel/net/netfilter/ipvs/ip_vs_nq.ko kernel/net/netfilter/ipvs/ip_vs_ftp.ko
是否被加載
# load modulemodprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 # to check loaded modules, use lsmod | grep -e ipvs -e nf_conntrack_ipv4 # or cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
在使用IPVS模式之前,還應在節點上安裝ipset等軟件包。
如果不滿足這些要求,Kube-proxy將回退到IPTABLES模式。
kubeadm 安裝的集群默認情況下,Kube-proxy將在kubeadm部署的集群中以iptables模式運行。
如果您將kubeadm與配置文件一起使用,則可以在kubeProxy字段下指定ipvs模式,添加SupportIPVSProxyMode:true。
kind: MasterConfiguration apiVersion: kubeadm.k8s.io/v1alpha1 ... kubeProxy: config: featureGates: SupportIPVSProxyMode=true mode: ipvs ...
如果您使用的是Kubernetes v1.8,您還可以在kubeadm init命令中添加標志--feature-gates = SupportIPVSProxyMode = true(自v1.9起不推薦使用)
kubeadm init --feature-gates=SupportIPVSProxyMode=truePS
如果成功啟用了ipvs模式,你應該看到ipvs代理規則(使用ipvsadm)例如:
# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.1:443 rr persistent 10800 -> 192.168.0.1:6443 Masq 1 1 0
當本地群集運行時,kube-proxy日志中會出現類似的日志(例如,本地群集的/tmp/kube-proxy.log):
Using ipvs Proxier.
然而沒有ipvs代理規則或有以下日志則表明kube-proxy無法使用ipvs模式:
Can"t use ipvs proxier, trying iptables proxier Using iptables Proxier.調試和排查 檢查ipvs 代理規則
用戶可以使用ipvsadm工具檢查kube-proxy是否正確維護IPVS規則。例如,我們在集群中有以下服務:
# kubectl get svc --all-namespaces NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.0.0.1443/TCP 1d kube-system kube-dns ClusterIP 10.0.0.10 53/UDP,53/TCP 1d
我們應該能看到如下的規則:
# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.1:443 rr persistent 10800 -> 192.168.0.1:6443 Masq 1 1 0 TCP 10.0.0.10:53 rr -> 172.17.0.2:53 Masq 1 0 0 UDP 10.0.0.10:53 rr -> 172.17.0.2:53 Masq 1 0 0為什么kube-proxy不能以ipvs模式啟動
Enable IPVS feature gateway
對于Kubernetes v1.10及更高版本,功能門SupportIPVSProxyMode默認設置為true。但是,您需要在v1.10之前為Kubernetes明確啟用--feature-gates = SupportIPVSProxyMode = true。
指定proxy-mode=ipvs
檢查kube-proxy模式是否已設置為ipvs
安裝所需的內核模塊和包
檢查是否已將ipvs所需的內核模塊編譯到內核和軟件包中。 (見前提條件)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32716.html
摘要:模式在中添加,并成為自以來的默認操作模式。支持比更復雜的負載平衡算法最小負載,最少連接,位置,加權等。安裝的集群默認情況下,將在部署的集群中以模式運行。 IPVS 這篇文章主要講述: 什么是IPVS? IPVS 和 IPTABLES 區別 如何設置kube-proxy按照ipvs模式運行和故障排查 什么是IPVS IPVS(IP虛擬服務器)實現傳輸層負載平衡,通常稱為第4層LAN交...
摘要:模式選擇是中的關鍵組件其主要功能是在和其后端之間進行負載均衡。詳見后續測試數據對于集群規模中等,數量不多的,推薦選擇。模式下,使用負載均衡代替了。漏洞修復記錄HTTP/2漏洞升級說明Runc容器逃逸漏洞修復說明cloudprovider更新20.10.1集群節點配置推薦1、Master配置推薦Master規格跟集群規模有關,集群規模越大,所需要的Master規格也越高,不同集群規模的,Mas...
摘要:廣告離線安裝包,僅需三步源碼解析相對于模式具備較高的性能與穩定性本文講以此模式的源碼解析為主,如果想去了解模式的原理,可以去參考其實現,架構上無差別。主要功能是監聽和的事件,然后下放代理策略到機器上。 廣告 | kubernetes離線安裝包,僅需三步 kube-proxy源碼解析 ipvs相對于iptables模式具備較高的性能與穩定性, 本文講以此模式的源碼解析為主,如果想去了解...
摘要:廣告離線安裝包,僅需三步源碼解析相對于模式具備較高的性能與穩定性本文講以此模式的源碼解析為主,如果想去了解模式的原理,可以去參考其實現,架構上無差別。主要功能是監聽和的事件,然后下放代理策略到機器上。 廣告 | kubernetes離線安裝包,僅需三步 kube-proxy源碼解析 ipvs相對于iptables模式具備較高的性能與穩定性, 本文講以此模式的源碼解析為主,如果想去了解...
摘要:完全兼容原生的,以私有網絡為基礎,并整合了等云產品。綜合資源有效利用率錯誤容忍度兩個因素,在不考慮業務混合部署業務總體規模大小的情況下,我們建議生產環境的節點應該介于核至核之間。模式是一個用于負載均衡的內核功能。產品概念UCloud Container Service for Kubernetes (UK8S)是一項基于Kubernetes的容器管理服務,你可以在UK8S上部署、管理、擴展你...
閱讀 3489·2023-04-25 20:41
閱讀 2660·2023-04-25 16:40
閱讀 1433·2021-09-23 11:44
閱讀 1252·2021-09-10 10:51
閱讀 1681·2021-09-07 09:59
閱讀 1642·2019-12-27 12:08
閱讀 551·2019-08-30 15:44
閱讀 3334·2019-08-30 11:08