體系結構
Kube路由器是圍繞觀察者和控制器的概念而建立的。 觀察者使用Kubernetes監視API來獲取與創建,更新和刪除Kubernetes對象有關的事件的通知。 每個觀察者獲取與特定API對象相關的通知。 在從API服務器接收事件時,觀察者廣播事件。 控制器注冊以獲取觀察者的事件更新,并處理事件。
Kube-router由3個核心控制器和多個觀察者組成,如下圖所示。
func Run() { for { Sync() // control loop that runs for ever and perfom sync at periodic interval } } func OnUpdate() { Sync() // on receiving update of a watched API object (namespace, node, pod, network policy etc) } Sync() { //re-concile any state changes } Cleanup() { // cleanup any changes (to iptables, ipvs, network etc) done to the system }
查看Kube-router實戰
網絡服務控制器
網絡服務控制器負責從Kubernetes API服務器讀取服務和端點信息,并相應地在每個群集節點上配置IPVS。
請閱讀博客基于iptables與Kube-proxy的設計細節和利弊對比https://cloudnativelabs.github.io/post/2017-05-10-kube-network-service-proxy/
基于Kubernetes網絡服務代理的Kube-route IPVS演示

特征:
- 輪詢負載均衡
- 基于客戶端IP的會話保持
- 如果服務控制器與網絡路由控制器(帶有–run-router標志的kube-router)一起使用,源IP將被保留。
- 用–masquerade-all參數明確標記偽裝(SNAT)
網絡策略控制器
網絡策略控制器負責從Kubernetes API服務器讀取命名空間,網絡策略和pod信息,并相應地配置iptables以向pod提供入口過濾.
Kube-router支持networking.k8s.io/NetworkPolicy 接口 或網絡策略V1/GA semantics以及網絡策略的beta語義
請閱讀博客網絡策略控制器的設計細節 https://cloudnativelabs.github.io/post/2017-05-1-kube-network-policies/
Kube-router的iptables基于網絡策略的實現演示

網絡路由控制器
網絡路由控制器負責讀取由控制器管理器分配給節點的pod CIDR,并將路由通告給集群中其余節點(BGP peers)。對于基于pod-to-pod網絡,使用BGP對于用戶來說是透明的.

但是,BGP可以用于其他用例,如通告集群ip,可路由pod ip等。只有在這種情況下,才需要了解BGP和配置。請參閱下面的演示kube-router如何向外部BGP路由器發布集群IP和pod cidrs

用戶指南
嘗試使用集群安裝程序安裝Kube-router
在Kubernetes上部署Kube-router的最好的入門方法是使用集群安裝程序.
kops
請查看steps 使用Kops部署Kubernetes集群與Kube-router。
bootkube
請查看steps 使用 bootkube部署Kubernetes集群與Kube-router。
kubeadm
請查看steps使用Kubeadm部署Kubernetes集群與Kube-router。
deployment
根據要使用的kube-router的功能,可以使用多個部署選項. 你可以使用這些參數 –run-firewall, –run-router, –run-service-proxy 有選擇地只啟用kube-router所需的功能。
您也可以選擇運行kube-router作為在每個群集節點上運行的agent。 另外可以通過daemonset在每個節點上運行kube-router作為pod。
命令行選項
Usage of ./kube-router: --advertise-cluster-ip 將該服務的集群IP添加到RIB,以便通告給BGP peers. --advertise-external-ip 將服務的外部IP添加到RIB,以便將其通告給BGP peers. --cleanup-config 清理iptables規則,ipvs,ipset配置并退出. --cluster-asn uint 集群節點運行iBGP的ASN編號. --cluster-cidr string 群集中的CIDR范圍。它被用來識別pods的范圍. --config-sync-period duration apiserver配置同步之間的延遲(例如“5s”,“1m”)。必須大于0.(默認1m0s) --enable-overlay 當enable-overlay設置為true時,IP-in-IP隧道將用于跨不同子網中節點的pod-pod聯網。如果設置為false,則不使用隧道,并且路由基礎架構預計為不同子網中的節點之間的pod-pod聯網路由流量(默認值為true) --enable-pod-egress 從Pod到群集外的SNAT流量。 (默認為true) --hairpin-mode 為每個服務端點添加iptable規則以支持流量管控. -h, --help 打印使用信息. --hostname-override string 覆蓋節點的NodeName。如果kube-router無法自動確定您的NodeName,請設置此項. --iptables-sync-period duration iptables規則同步之間的延遲(例如'5s','1m')。必須大于0.(默認1m0s) --ipvs-sync-period duration ipvs config同步之間的延遲(例如'5s','1m','2h22m')。必須大于0.(默認1m0s) --kubeconfig string 具有授權信息的kubeconfig文件的路徑(主位置由主標志設置)。 --masquerade-all SNAT所有流量到群集IP /節點端口。 --master string Kubernetes API服務器的地址(覆蓋kubeconfig中的任何值)。 --nodeport-bindon-all-ip 對于NodePort類型的服務,創建監聽節點的所有IP的IPVS服務. --nodes-full-mesh 集群中的每個節點都將建立與其他節點的BGP對等關系。 (默認為true) --peer-router-asns uintSlice 集群節點將向其通告集群ip和節點的pid cidr的BGP peers的ASN編號。 (默認[]) --peer-router-ips ipSlice 所有節點將對等的外部路由器的IP地址,并通告集群ip和pod cidr。 (默認[]) --peer-router-passwords stringSlice 用“--peer-router-ips”定義的BGP peers進行認證的密碼。 --routes-sync-period duration 路線更新與廣播之間的延遲(例如“5s”,“1m”,“2h22m”)。必須大于0.(默認1m0s) --run-firewall 啟用網絡策略 - 設置iptables為pod提供入口防火墻。 (默認為true) --run-router 啟用Pod網絡 - 通過iBGP發布并學習到Pod的路由。 (默認為true) --run-service-proxy 啟用服務代理 - 為Kubernetes服務設置IPVS。 (默認為true)```
依賴
- Kube-router需要訪問kubernetes API服務器以獲取有關Pod,服務,端點,網絡策略等的信息。所需的最少信息是關于在何處訪問kubernetes API服務器的詳細信息. 這個信息可以通過kube-router -master=http://192.168.1.99:8080/或kube-router -kubeconfig=<kubeconfig文件路徑>傳遞。
- 如果在節點上運行kube-router作為agent,則必須在每個節點上安裝ipset軟件包(當以守護進程集的形式運行時,容器映像將使用ipset預先打包)
- 如果您選擇使用kube-router進行pod-to-pod網絡連接,則需要將Kubernetes控制器管理器通過傳遞–allocate-node-cidrs = true標志并提供cluster-cidr來配置分配pod CIDR。 (例如通過傳遞–cluster-cidr = 10.1.0.0/16)
- 如果您選擇以守護進程運行kube-router,那么kube-apiserver和kubelet必須以“–allow-privileged = true”選項運行
- 如果您選擇使用kube-router作為pod-to-pod網絡連接,則必須將Kubernetes集群配置為使用CNI網絡插件。在每個節點上,CNI conf文件預計將以/etc/cni/net.d/10-kuberouter.conf的形式出現。應使用CNI插件和用于IPAM的“host-local”。示例conf文件,可以下載wget -O /etc/cni/net.d/10-kuberouter.conf https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/cni/10-kuberouter .conf
作為daemonset運行
這是部署kube-router(不要忘記確保需求)的最快方法。只需運行:
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kube-router-all-service-daemonset.yaml
以上將自動在每個節點上運行kube-router作為pod。您可以根據需要更改daemonset中定義的參數以匹配您的需要。有些示例可以在https://github.com/cloudnativelabs/kube-router/tree/master/daemonset中找到,使用不同的參數來選擇kube-router應運行的服務.
作為agent運行
您可以選擇運行kube-router作為在每個節點上運行的代理。例如,如果您只想讓kube-router為pod提供入口防火墻,那么您可以這樣啟動kube-router
kube-router --master=http://192.168.1.99:8080/ --run-firewall=true --run-service-proxy=false --run-router=false
清理配置
您可以通過運行在節點上的kube-router清除所有已完成的配置(對ipvs,iptables,ip routes)
kube-router --cleanup-config
嘗試使用kube-router作為kube-proxy的替代品
如果你有一個使用kube-proxy,并且想要嘗試kube-router來做服務代理,你可以這樣做
kube-proxy --cleanup-iptables
接下來
kube-router --master=http://192.168.1.99:8080/ --run-service-proxy=true --run-firewall=false --run-router=false
如果你想回到kube-proxy,那么通過運行清理由kube-router完成的配置
kube-router --cleanup-config
并使用您的配置運行kube-proxy。 – 一般步驟
發夾彎模式(一種自己訪問自己的模式)
從service后面的Pod到其自己的ClusterIP:PORT的通信 默認不支持。不過,可以通過對每個服務添加kube-router.io / service.hairpin =注釋,或者通過集群中的所有服務啟動。
另外, 對于每個節點上的所有veth接口,hairpin_mode sysctl選項必須設置為1. 這可以通過在您的CNI配置中添加“hairpinMode”:true選項來完成,如果所有集群節點已經在運行kubernetes。
如果發送源IP來自Service ClusterIP,Hairpin traffic將被發現的發送點看到。
Hairpin Mode示例
10-kuberouter.conf
{ "name":"mynet", "type":"bridge", "bridge":"kube-bridge", "isDefaultGateway":true, "hairpinMode":true, "ipam": { "type":"host-local" } }
為服務“my-service”啟用hairpin traffic:
kubectl annotate service my-service "kube-router.io/service.hairpin="
服務器直接返回
請閱讀以下博客,了解如何結合使用DSR和“–advertise-external-ip”構建高度可擴展和可用的入口。 https://cloudnativelabs.github.io/post/2017-11-01-kube-high-available-ingress/
您可以為每個服務啟用DSR(直接服務器返回)功能。當啟用的服務端點將直接響應客戶端通過簽署服務代理。啟用DSR時,Kube-router將使用LVS的隧道模式來實現此功能。
要啟用DSR,您需要使用kube-router.io/service.dsr = tunnel注釋來注釋服務。例如,
kubectl annotate service my-service "kube-router.io/service.dsr=tunnel"
在當前的實現中,當在服務上應用注釋時,DSR將僅適用于外部IP。
此外,當使用DSR時,當前的實現不支持端口重新映射。所以你需要使用相同的端口和目標端口的服務
你需要在kube-router守護進程清單中啟用hostIPC:true和hostPID:true。并且必須將主路徑/var/run/docker.sock設置為kube-router的一個volumemount。
上述更改需要kube-router輸入pod namespace,并在pod中創建ipip隧道,并將外部IP分配給VIP。
對于示例清單,請查看啟用DSR要求的[manifest](../ daemonset / kubeadm-kuberouter-all-features-dsr.yaml).
負載均衡調度算法
Kube-router使用LVS作為服務代理。 LVS支持豐富的調度算法。您可以為該服務添加注釋以選擇一個調度算法。當一個服務沒有注釋時,默認情況下選擇“輪詢”調度策略
For least connection scheduling use: kubectl annotate service my-service "kube-router.io/service.scheduler=lc" For round-robin scheduling use: kubectl annotate service my-service "kube-router.io/service.scheduler=rr" For source hashing scheduling use: kubectl annotate service my-service "kube-router.io/service.scheduler=sh" For destination hashing scheduling use: kubectl annotate service my-service "kube-router.io/service.scheduler=dh"
BGP 配置
Configuring BGP Peers
本文轉自kubernetes中文社區-[譯]Kube Router Documentation