2. cnm认为应该怎样让容器组网
introduction
这一节很有意思, 是从我的一个观察开始的, 尽管我们之前做了一大堆基于docker0网桥的范例, 配置这个观察那个的, 但我们都知道实际上 k8s 用的是 cni0 而不是 docker0, 点解? 网桥就是网桥, 玩不出什么花样的, 那么为什么非要搞出一个 cni0, 而不使用docker0呢? 这一节我们从cni0的出现, 走深度搜索, 开始思考这些问题:
CNI 模型与 CNM 模型, 到底有什么不一样, K8s走什么思路
为什么同时出现了cni0与docker0
两个模型到底是什么思路
废话
CNI / CNM 是我在半年前第一次接触容器网络的时候就看到的两个概念, 他妈的折腾半天愣是没看懂到底是什么意思. 我觉得出现这样的问题原因在于, 关于容器网络的描述存在 "表层" / "里层" 两层含义, 表层是我们看到的文章, 里填充着一些抽象的专有名词. 里层是一些关于实际动手的基本功, 在有了一些基本功以后, 才能在看到表层以后想象出里层到底是怎么操作的, 达成什么样一种目的. 这种现象其实充斥在K8s的方方面面, 专有名词满天飞, 可以说没有实操/基本功, 基本上不可能对这些玩法有很深的理解.
牢骚发完继续, 那么什么是 CNM , 取决于谁说出来的, 如果是从我嘴里说出来的那就是操你妈, 如果是从docker哪儿听来的那就代表一种网络模型. 某种打通容器间/跨主机容器间/容器&外界, 的某种实现办法. 现在我要用一种小学生都能听懂的口吻解释 CNM / Swarm
怎么联网
容器网络就是怎么让Docker容器能通外网, 也能连通其他宿主机上的容器, 这个问题一解决, 无论你是怎么实现的都算容器网络. 简化一下, 容器就是一个进程加上一个网络命名空间组合出来的东西, 因此我们这么干: 给每个容器配两个电话, 一个内线电话, 打集群内其他容器. 另一个电话打外线电话, 打外网.
看看上面的图, 这个容器内有两个电话, 分别叫做:
eth1: 这个电话连接 gw网桥, 这个网桥连接外网, 你每次打这个电话的时候, 使用IP1, 通过gw网桥到达宿主机, 并通过宿主机的eth0到达外界
eth0: 这个通过br网桥连接其他宿主机上的容器, 你打这个电话的时候, 使用IP2, 通过br0网桥到达 vxlan , 通过vxlan发到另一台宿主机上
两个电话拥有两个不同的号码, 属于两个网桥的网段下, 你用不同的电话通信, 被按照两种不同的方式处理着. 你应该也发现了, 集群内通信的方式跟 flannel/vxlan 模式是一样的. 这就是 Docker Swarm 的玩法, 你看它也能用, 也能实现跨主机通信/通外网, 因此它也算一种容器网络, 这种模型你能看出对Docker容器的改动很小, 我觉得它就是对Docker容器一种能力的补充, 但舞台的主角还是docker容器
CNM模型
总结一下上面的 Swarm , 每个容器有两个电话. 一个打集群内线, 一个打外网外线. 因此我们CNM就是(操你妈):
sandbox (就是namespace, 包含容器路由表/DNS等东西)
endpoint (就是电话. 就是eth0. 就是veth)
network (容器内网, 由好多个电话组成)
Last updated
Was this helpful?