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 等的方案(这里几种方案在性能方面也有高下).

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.
Kube-router consists of 3 core controllers and multiple watchers
控制器主要实现以下接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
}

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