昆山做網(wǎng)站的jofuns市場營銷一般在哪上班
1 基本概念
Service:在Kubernetes(K8s)中,Service用于將流量轉(zhuǎn)發(fā)到后端的Pod中。Service提供了一種穩(wěn)定的網(wǎng)絡(luò)入口,盡管后端的Pod可能會動態(tài)改變
kube-proxy: kube-proxy是Kubernetes集群中的核心組件之一,它運(yùn)行在每個節(jié)點上,負(fù)責(zé)實現(xiàn)Service的流量負(fù)載均衡。kube-proxy有兩種轉(zhuǎn)發(fā)模式:iptables、ipvs
2 轉(zhuǎn)發(fā)模式對比
iptables | ipvs | |
---|---|---|
原理 | 工作在 Linux 內(nèi)核的netfilter框架上,使用鏈和規(guī)則的機(jī)制來匹配和處理網(wǎng)絡(luò)流量。它通過順序規(guī)則匹配實現(xiàn)流量轉(zhuǎn)發(fā),適用于小規(guī)模集群,但隨著規(guī)則數(shù)量增加,性能會下降 | 基于內(nèi)核的 LVS 框架,通過哈希表快速查找和轉(zhuǎn)發(fā)流量,支持豐富的負(fù)載均衡算法,適合大規(guī)模集群和高流量應(yīng)用場景 |
性能 | 如果規(guī)模較大,會導(dǎo)致規(guī)則較多,遍歷規(guī)則較慢,從而影響性能 | IPVS 使用哈希表來存儲和查找規(guī)則,而不是像 IPtables 那樣線性匹配,因此即使有大量規(guī)則,其查找速度也非???/td> |
調(diào)度規(guī)則 | 隨機(jī)算法,僅支持輪詢 | 提供多種策略(輪詢、最少連接、源地址哈希等) |
如何選擇?
小規(guī)模集群或?qū)ω?fù)載均衡要求不高的集群可以選擇 IPtables,不需要特殊內(nèi)核模塊,所有Linux發(fā)行版都支持;而對于需要高性能、復(fù)雜負(fù)載均衡策略和大規(guī)模集群的環(huán)境,IPVS 是更為理想的選擇
3 實現(xiàn)原理詳解
下面以一個簡單的案例深入說明:
目前k8s上創(chuàng)建一個service指向后端 3副本的 deployment,具體是如何實現(xiàn)流量轉(zhuǎn)發(fā)到pod的。
假設(shè)以下信息:
Service 名稱: app1
Service ClusterIP: 10.96.0.10
Service Port: 80
后端 Pod IPs:
Pod 1: 10.0.0.2 (Pod1)
Pod 2: 10.0.0.3 (Pod2)
Pod 3: 10.0.0.4 (Pod3)
Pod 容器端口: 8080(假設(shè)每個 Pod 的應(yīng)用都監(jiān)聽端口 8080)
3.1 iptables
當(dāng) kube-proxy 發(fā)現(xiàn)服務(wù) app1 和它的后端 Pod 時,它會動態(tài)生成以下的 iptables 規(guī)則:
1、捕獲流量并跳轉(zhuǎn)到服務(wù)鏈
在 NAT 表中的 PREROUTING 鏈和 OUTPUT 鏈(用于本節(jié)點流量),創(chuàng)建規(guī)則來匹配目標(biāo) IP 為 app1 服務(wù)的流量,并引導(dǎo)到一個服務(wù)鏈,如 KUBE-SVC-XXXXXX。
# PREROUTING 鏈捕獲目標(biāo)為 app1 的流量,并跳轉(zhuǎn)到服務(wù)鏈
iptables -t nat -A PREROUTING -d 10.96.0.10/32 -p tcp --dport 80 -j KUBE-SVC-XXXXXX# OUTPUT 鏈處理集群內(nèi)發(fā)往 app1 服務(wù)的流量
iptables -t nat -A OUTPUT -d 10.96.0.10/32 -p tcp --dport 80 -j KUBE-SVC-XXXXXX
2、服務(wù)鏈處理負(fù)載均衡
KUBE-SVC-XXXXXX 是一個虛擬服務(wù)鏈,它對應(yīng) app1 的 ClusterIP 和端口。在這個鏈中,kube-proxy 創(chuàng)建規(guī)則來隨機(jī)分發(fā)流量到 3 個后端 Pod。
# 隨機(jī)選擇一個 Pod,負(fù)載均衡到后端 Pod1
iptables -t nat -A KUBE-SVC-XXXXXX -m statistic --mode random --probability 0.33 -j KUBE-SEP-YYYYYY# 如果未命中第一個規(guī)則,隨機(jī)選擇 Pod2
iptables -t nat -A KUBE-SVC-XXXXXX -m statistic --mode random --probability 0.5 -j KUBE-SEP-ZZZZZZ# 如果前兩個規(guī)則都未命中,則選擇 Pod3
iptables -t nat -A KUBE-SVC-XXXXXX -j KUBE-SEP-WWWWWW
3、后端 Pod 規(guī)則鏈(DNAT 轉(zhuǎn)換)
對于每個后端 Pod,kube-proxy 都會為其創(chuàng)建一個 KUBE-SEP-* 鏈(Service Endpoint 鏈),這些鏈中的規(guī)則負(fù)責(zé)將目標(biāo)地址轉(zhuǎn)換為對應(yīng) Pod 的 IP 和端口。
# Pod1 規(guī)則鏈(對應(yīng) IP 10.0.0.2 和端口 8080)
iptables -t nat -A KUBE-SEP-YYYYYY -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2:8080# Pod2 規(guī)則鏈(對應(yīng) IP 10.0.0.3 和端口 8080)
iptables -t nat -A KUBE-SEP-ZZZZZZ -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.3:8080# Pod3 規(guī)則鏈(對應(yīng) IP 10.0.0.4 和端口 8080)
iptables -t nat -A KUBE-SEP-WWWWWW -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.4:8080
3.2 ipvs
待完善