终于 kube-router
文章目录
Finally it comes to kube-router.
众里寻他千百度, kube-router 既做 CNI, 支持 networkPolicy, 还能做 service proxy!
Why?
写在 cloudnativelabs/kube-router 经历 20 次 release, 来到了第一次 Beta 版本 v0.1.0-rc1 后.
Why finally?
因为 ****** 某种原因, 需要并且’已经’做出 k8s 下的网络方案. 在从 Calico/flannel/Canal/Macvlan/ipvlan/bridge 的学习中, 依靠个人有限的精力/时间/学识, 要了解到每种 CNI 选项的优劣. 而在此回过头去, 看到了很多的先驱曾经摸索过的道路, 以及后继者即将踏上的路, 会觉得 Finally it comes to kube-router.
这是一道选择题
作为一道安装(init)好 k8s 集群后必做的一道选择题(非公有云使用 cloud provider 的情况), 可没那么容易. 在有限的精力/时间/学识的情况下, 做这种选择题, 最好的就是先用排除法, 以下将分别从性能/外部依赖/负载均衡来说.
性能
- 当考虑性能的时候, 那些依赖对流量封包解包的方案可以站一边凉快了, 因为网络带宽/延迟/可靠性都经不起这样的折腾(e.g. Calico 的 IPIP 模式, flannel 早期的 udp 封包模式).
- 而映入眼帘的该是那种 bridge/macvlan/ipvlan/SR-IOV 等的方案(这里几种方案在性能方面也有高下).

外部依赖和限制
- 大部分第三方的 CNI 插件, 都是通过一份 yaml 进行安装, 可以看到如 Calico 会运行一份 daemonSet(负责 CNI 安装+BGP+policy 管理) 和 deployment(policy watcher), 使用那个 - 没有十几万字解释不清楚的BGP 协议(想要搞懂, 看 第三期(BGP专题))来维护集群内的路由. 还有 flannel 的 host-gateway 方式也会有 daemon 来往主机上写路由, 不过好歹是没有用到 BGP. SR-IOV 的方案会需要网卡物理硬件的支持. 还有便是 k8s 下一个主要的网络隔离 networkPolicy 的支持程度, 也各有不同(flannel 明确地说, 要 networkPolicy 找 Calico).
- bridge 有 containernetworking 也就是提出 Container Networking Interface Proposal 的项目组实现的一个逻辑, 在大部分情况下都可以直接拿来使用, 即使自己修改也会十分简单. 既可以拿来当做 host-gateway 的方式下用(适用与公有云环境), 也可以在将主机的 eth0 连接上来后, 让 pod 拥有和主机同网段 IP 的能力. 
- 而 macvlan/ipvlan 这对cousin 在使用的时候有诸多不便, 最大的莫过于 - ipvlan does not allow virtual interfaces to communicate with the master interface. Therefore the container will not be able to reach the host via ipvlan interface.且还有在使用 service 的(NodePort 等)时候会因为上面的原因有限制导致不能使用.
- 而 SR-IOV 呢? 这是一种需要网卡硬件支持的方案, 有一些 CNI 的实现. e.g. hustcat/sriov-cni. 当然该类 CNI 和 macvlan/ipvlan 可能还潜在有个问题, 即没有适合的 IPAM. 原因是首先比较少的有地方使用 DHCP, 而共有云环境, 并不是可以很简单地自定义 IP. 
- bridge 相较于 macvlan/ipvlan 的选择, 在放弃考虑性能上的差异的话, 那会需要考虑到是否会用到 kube-proxy 等的组件上(其实主要是 service 的 NodePort 在 macvlan/ipvlan 下因为会主机无法访问该主机的 pod 导致无法使用的问题). 
- SR-IOV 看起来是个性能最优异的, 但目前围绕 SR-IOV 开发的 CNI 似乎不多(To be confirmed). 
负载均衡
- 首先, 负载均衡的要求并不是对 CNI 的要求.
- 目前实现 k8s service 的是 kube-proxy, 其实现方式的转变从 userspace->iptables->ipvs, 其中的 ipvs 在 k8s 1.9 处于 beta 状态. userspace 方式流量会被 kube-proxy 透传, 性能不行. iptables 方式在大量的规则下会有损耗. ipvs 方式会是更高效, 且提供更多负载均衡策略的方式.
- 可 负载均衡的要求并不是对 CNI 的要求, 为什么还需要考虑呢? 主要是看到了 kube-router, 它可以不仅仅作为 CNI 提供 pod 所需的网络, 以及提供 networkPolicy, 还能运行为 service proxy 替代 kube-proxy 来实现 k8s 下的 Service.
沙滩上还有谁?
- 一轮筛选, 其实大家都在.
- 第三方实现可以很快地搭建集群, 而仅仅利用类似 bridge/macvlan/ipvlan/SR-IOV 等的插件可能还需要一个可以适配的 IPAM, 以及可能需要的路由管理的东西.
来聊聊 kube-router 吧
上面说了这么多, 那么为什么还是会说 Finally it comes to kube-router. 呢?  
技术选型
- 使用了 Standard Linux Networking 的技术, 如 bridge, ipvs. 其中 bridge 的使用在二次开发中, 可以比较快的替换为更高效的 SR-IOV. 而 ipvs 也是 kube-proxy 在未来的方向, 另外也有看到华为在看不下去之前 kube-proxy 使用 iptables 导致的问题, 也有自己的研发选择了 ipvs.
- iBGP (GoBGP…终于是 golang 项目了!)维护路由表, 可比较简单地转化为 route reflector 模式.
- iptables 来作为实现 NetworkPolicy 的 firewall(恩, 觉得 iptables 终于用对地方了…).
架构
三个核心的控制器(core controllers), 和这些 Watcher endpoints/namespace/pod/node/networkPolicy/service.
控制器主要实现以下接口:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17func 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
}
install (with kubeadm/kubectl)
- 使用其作为 CNI 并开启网络隔离功能 - 1 - KUBECONFIG=/etc/kubernetes/admin.conf kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml 
- 使用其作为 CNI, 开启网络隔离功能, 并且代替 kube-proxy 来实现 service - 1 
 2
 3
 4
 5
 6- # 清除 kube-proxy 带来的所有 iptables 规则 
 KUBECONFIG=/etc/kubernetes/admin.conf kubectl -n kube-system delete ds kube-proxy
 docker run --privileged --net=host gcr.io/google_containers/kube-proxy-amd64:v1.7.3 kube-proxy --cleanup-iptables
 # 安装 kube-router 的全部功能
 KUBECONFIG=/etc/kubernetes/admin.conf kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml
Everything
关于 kube-router 的一切.
Kube-router Documentation
Reference
A Hacker’s Guide to Kubernetes Networking
cloudnativelabs/kube-router
kube-router v0.1.0-rc1
第三期(BGP专题)
flannel
bird
Deploying kube-router with kubeadm
原文作者: Pike.SZ.fish
原文链接: https://page.pikeszfish.me/2018/01/24/finally-it-comes-to-kube-router/
许可协议: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可