深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22717 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

32 | 浅谈容器网络

张磊 2018-11-05
你好,我是张磊。今天我和你分享的主题是:浅谈容器网络。
在前面讲解容器基础时,我曾经提到过一个 Linux 容器能看见的“网络栈”,实际上是被隔离在它自己的 Network Namespace 当中的。
而所谓“网络栈”,就包括了:网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则。对于一个进程来说,这些要素,其实就构成了它发起和响应网络请求的基本环境。
需要指出的是,作为一个容器,它可以声明直接使用宿主机的网络栈(–net=host),即:不开启 Network Namespace,比如:
$ docker run –d –net=host --name nginx-host nginx
在这种情况下,这个容器启动后,直接监听的就是宿主机的 80 端口。
像这样直接使用宿主机网络栈的方式,虽然可以为容器提供良好的网络性能,但也会不可避免地引入共享网络资源的问题,比如端口冲突。所以,在大多数情况下,我们都希望容器进程能使用自己 Network Namespace 里的网络栈,即:拥有属于自己的 IP 地址和端口。
这时候,一个显而易见的问题就是:这个被隔离的容器进程,该如何跟其他 Network Namespace 里的容器进程进行交互呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(32)

  • blackpiglet
    看到有位同学问怎么找 docker 和 宿主机上 veth 设备的关系,学完后我也有这个疑问,查了一下,结论是没有命令可以直接查到。但是可以查看 container 里的 eth0 网卡的 iflink 找到对应关系。
    # 宿主机上
    $ ip link
    ......
    9: veth0e9cd8d@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
        link/ether 6a:fb:59:e5:7e:da brd ff:ff:ff:ff:ff:ff link-netnsid 1

    # 容器内
    $ sudo docker exec -it e151 bash
    root@e1517e9d9e1a:/# cat /sys/class/net/eth0/iflink
    9

    这样就可以确定 container e1517e9d9e1a 在物理机上对应的 veth pair 是 veth0e9cd8d 了。

    这种方式需要登录到 docker 里执行命令,不是所有的容器都能这么做,不过 github 上有人专门做了个脚本来用实现这个功能,可以参考一下:
    https://github.com/micahculpepper/dockerveth
    2018-11-10
    47
  • frankji
    当一个容器试图连接到另外一个宿主机时,比如:ping 10.168.0.3,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。宿主机再把这个ping包发送出去之前会做源nat转换,把源ip改成宿主机的ip。大家可以分别在docker0和宿主机的真实网卡上tcpdump 抓包看一下。在宿主机用iptables -L -t nat就能看到相应的规则。
    2018-11-11
    1
    15
  • pytimer
    使用host网络的话,应该要提前规划好每个服务应该使用的端口吧
    2018-11-05
    11
  • Yuki_YANG
    文中"通过 ifconfig 命令的输出,你可以看到,nginx-1 容器对应的 Veth Pair 设备, 在宿主机上是一张虚拟网卡。它的名字叫作veth9c02e56"
    请问下是用哪个命令看出来的, 貌似route, ifconfig, brctl, 找不到这个对应关系呢



    2018-11-05
    6
  • 饭粒
    nginx 内的ifconfig可以在容器内安装。
    # apt-get update
    # apt install net-tools
    2019-05-08
    2
    5
  • Eurica
    请问老师:docker0网桥和普通的linux网桥在实现上有什么区别吗?
    2018-11-05
    4
  • Brave Shine
    【简化版】
    找 docker 和 宿主机上 veth 设备的关系
    - 容器
    ip netns exec netns1(network namespaces) ethool -S veth1
    找到这个字段:
    NIC statistics:
      peer_ifindex: 5(序列号)

    - 宿主机
    ip netns exec netns2 ip link | grep 5 <- 序列号

    结果:veth0
    2019-09-03
    3
  • gl328518397
    nginx镜像没有ifconfig 这些命令吧?
    2019-03-24
    3
  • 程空万里
    张老师对网络的讲解实在是太棒了,棒在并不使用高深的网络词语,那些高深的网络词语让人不知所述,头晕转向的,而是用最直白的讲话式加上配图来讲解,一看就懂,太喜欢了!少留言的我,都忍不住写留言!

    作者回复: 那就多留言哈

    2019-01-09
    2
  • Devil May Cry.Samsara
    老师,你好,我想问个问题
    docker的这个网络 vethpair网卡 ip是怎么来的么?
    我无意发现 ,vethpair的ip都是之前都是172网段, 今天发现有个192的物理ip 居然访问不通了,,然后就发现 docker里面的 ip除了172网段 居然还有192网段,所以与物理192网段的路由表有冲突了
    docker里面这个我用的都是默认网桥模式,这个vethpare 的ip到底怎么来的,难道不是从docker0的网桥上创建出来的么。
    2018-12-20
    2
  • kissingers
    查看veth 对端接口还有一个办法:用 ethtool -S <NIC>,输出结果有一项peer_inindex,再在host 上用ip link show,可以对应到。
    2018-11-12
    2
  • kissingers
    docker0网桥有没有dhcp 功能?主机上的容器访问外网没有NAT?主机网卡没连到docker0?

    作者回复: 静态IP。访问外网为什么要NAT。同主机两张网卡要用什么连。

    2018-11-08
    2
  • loda
    请教个问题,默认情况两台主机的docker0无法互通,那么如果在这两台机器上配置了路由规则,将docker0的数据转发到eth0,两台机器通过网线或者交换机相连,这样是不是可以保证不用引入overlay network,容器之间也能互通

    作者回复: 当然可以。但这还是overlay,只是没用隧道。

    2018-11-05
    2
  • 虎虎❤️
    用host网络需要平台能够自动分配端口,避免冲突。并且application可以通过比如环境变量动态配置端口信息。
    2018-11-05
    2
  • fiisio
    容器里面应该是veth 不是 eth吧?
    2018-11-05
    2
  • FW _UI
    有用mac的吗?在mac里docker run -d --name nginx-v2 nginx, docker exec -it nginx-v2 /bin/bash
    里没有ifconfig ipconfig, netstat -ns这样的命令,查了一下,mac上docker运行在虚拟机里,不用docker-0网桥
    所以想问一下:MAC里如何理解docker的网络?
    难道要搞虚拟机吗?
    2018-12-04
    1
  • kissingers
    老师,容器1访问容器2,直接docker0网桥根据转发表转发就行了,怎么还有先到docker0接口,路由选择,再回到docker0转发的过程?访问外网时才会有到docker0这个网关,再路由出去的过程吧?

    作者回复: 对。这里其实都在二层ebtables处理的。我修改一下。

    2018-11-10
    1
  • silver
    当容器试图连接到别的宿主机时,容器的连接具体怎么被route到宿主机的eth0的呢?根据前文对“从设备”的描述,这些请求不是应该全被直接转发到了docker0上吗
    2018-11-05
    1
  • 唐荣轩
    改造计算或者服务框架呀,每一类计算框架自己去一段端口区间寻址。中间件的人做paas的时候最喜欢这么做了。需要注意的是检查并占用端口这个逻辑过程得原子化,否则容易出现检查完端口可用但是真正去占用的时候却已经被占用了这样的问题
    2019-11-25
  • GaelYang
    docker0 网桥会带来性能的下降吗?
    2019-06-26
收起评论
32
返回
顶部