xiaohanliang
Docker
Docker
  • hi
  • STORAGE DRIVER
    • 1. 什么叫联合挂载
    • 2. 镜像ID是从哪来的
    • 3. 如何组装出一个镜像
    • 4. 为什么有这么多fs@aufs
    • 5. 为什么有这么多fs@overlay
    • 6. 为什么有这么多fs@dm
    • 7. 正确安装devicemapper
  • EXEC DRIVER
    • 1. 资源限制-cgroup
    • 2. 制造小型监狱
    • 3. 切换根目录是什么概念
    • 4. 标准极简容器runC
    • 5. 尝试安装runc工具
  • KUBERNETES NETWORK
    • 0. [WIP]我想串联容器网络的故事
    • 1. 容器网络是什么样的网络
    • 2. cnm认为应该怎样让容器组网
    • 3. 为什么会有一大堆cni插件
    • 4. 为什么要设计出pod
    • 5. 怎样形成一个服务
    • 6. Service就是iptables规则
    • 7. IPVS也能实现Service
    • 8. 从集群外访问服务-nodeport
    • 9. 从集群外访问服务-ingress
    • 10. 想要把域名变成IP
    • 11. DNS是怎么实现的
    • 12. 最常见的方案@flannel
    • 13. 使用tun设备封包@flannel
    • 14. 使用vxlan设备封包@flannel
    • 15. 可不可以不封包@flannel
Powered by GitBook
On this page
  • introduction
  • 两个模型到底是什么思路
  • 废话
  • 怎么联网
  • CNM模型

Was this helpful?

  1. KUBERNETES NETWORK

2. cnm认为应该怎样让容器组网

introduction

这一节很有意思, 是从我的一个观察开始的, 尽管我们之前做了一大堆基于docker0网桥的范例, 配置这个观察那个的, 但我们都知道实际上 k8s 用的是 cni0 而不是 docker0, 点解? 网桥就是网桥, 玩不出什么花样的, 那么为什么非要搞出一个 cni0, 而不使用docker0呢? 这一节我们从cni0的出现, 走深度搜索, 开始思考这些问题:

  1. CNI 模型与 CNM 模型, 到底有什么不一样, K8s走什么思路

  2. 为什么同时出现了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 (容器内网, 由好多个电话组成)

Previous1. 容器网络是什么样的网络Next3. 为什么会有一大堆cni插件

Last updated 4 years ago

Was this helpful?