容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
4426 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
课程目录
已完结/共 31 讲
开篇词 (2讲)
开篇词 | 一个态度两个步骤,成为容器实战高手
01 | 认识容器:容器的基本操作和实现原理
容器进程 (6讲)
02 | 理解进程(1):为什么我在容器中不能kill 1号进程?
03|理解进程(2):为什么我的容器里有这么多僵尸进程?
04 | 理解进程(3):为什么我在容器中的进程被强制杀死了?
05|容器CPU(1):怎么限制容器的CPU使用?
06 | 容器CPU(2):如何正确地拿到容器CPU的开销?
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
容器内存 (3讲)
08 | 容器内存:我的容器为什么被杀了?
09 | Page Cache:为什么我的容器内存使用量总是在临界点?
10 | Swap:容器可以使用Swap空间吗?
容器存储 (4讲)
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
12 | 容器文件Quota:容器为什么把宿主机的磁盘写满了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
14 | 容器中的内存与I/O:容器写文件的延时为什么波动很大?
容器网络 (4讲)
15 | 容器网络:我修改了/proc/sys/net下的参数,为什么在容器中不起效?
16 | 容器网络配置(1):容器网络不通了要怎么调试?
17|容器网络配置(2):容器网络延时要比宿主机上的高吗?
18 | 容器网络配置(3):容器中的网络乱序包怎么这么高?
容器安全 (2讲)
19 | 容器安全(1):我的容器真的需要privileged权限吗?
20 | 容器安全(2):在容器中,我不以root用户来运行程序可以吗?
结束语 (4讲)
结束语 | 跳出舒适区,突破思考的惰性
结课测试|这些容器技术的问题,你都掌握了么?
用户故事 | 莫名:相信坚持的力量,终会厚积薄发
加餐福利 | 课后思考题答案合集
专题加餐 (6讲)
加餐01 | 案例分析:怎么解决海量IPVS规则带来的网络延时抖动问题?
加餐02 | 理解perf:怎么用perf聚焦热点函数?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐04 | 理解ftrace(2):怎么理解ftrace背后的技术tracepoint和kprobe?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
加餐06 | BCC:入门eBPF的前端工具
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

16 | 容器网络配置(1):容器网络不通了要怎么调试?

你好,我是程远。
在上一讲,我们讲了 Network Namespace 隔离了网络设备,IP 协议栈和路由表,以及防火墙规则,那容器 Network Namespace 里的参数怎么去配置,我们现在已经很清楚了。
其实对于网络配置的问题,我们还有一个最需要关心的内容,那就是容器和外面的容器或者节点是怎么通讯的,这就涉及到了容器网络接口配置的问题了。
所以这一讲呢,我们就来聊一聊,容器 Network Namespace 里如何配置网络接口,还有当容器网络不通的时候,我们应该怎么去做一个简单调试。

问题再现

在前面的课程里,我们一直是用 docker run 这个命令来启动容器的。容器启动了之后,我们也可以看到,在容器里面有一个"eth0"的网络接口,接口上也配置了一个 IP 地址。
不过呢,如果我们想从容器里访问外面的一个 IP 地址,比如说 39.106.233.176(这个是极客时间网址对应的 IP),结果就发现是不能 ping 通的。
这时我们可能会想到,到底是不是容器内出了问题,在容器里无法访问,会不会宿主机也一样不行呢?
所以我们需要验证一下,首先我们退出容器,然后在宿主机的 Network Namespace 下,再运行 ping 39.106.233.176,结果就会发现在宿主机上,却是可以连通这个地址的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(20)

  • 良凯尔
    实现节点外的程序来访问容器:

    iptables -t nat -A PREROUTING -d 【宿主机ip】 -p tcp -m tcp --dport 【宿主机映射端口】 -j DNAT --to-destination 【容器ip】:【容器端口】

    利用DNAT,访问宿主机ip+宿主机映射端口,即可访问容器
    2020-12-21
    14
  • 我来也
    老师一路tcpdump的操作很犀利,特别是抓容器中的数据包的那个操作:

      ip netns exec $pid tcpdump -i eth0 host 39.106.233.176 -nn

    以前为了在容器中抓包,还要在容器中安装tcpdump,从国外的源拉数据又慢,即使换了国内的源,但每次重建容器后又得再来一次。
    搞的我专门准备了一个调试用的基础容器,把各种常用的工具都给装上,包括我的vim。😄

    作者回复: @我来也
    把调试工具都放到一个基础容器中也挺好的。

    2021-01-05
    6
  • 陈斯佳
    这篇网络调试太硬核了!!一直觉得,容器就是Linux的高级知识,容器通了,Linux的内容你就所向披靡了

    作者回复: @陈斯佳
    是这样的!

    2021-02-04
    3
  • 争光 Alan
    你好,老师,我网络比较弱,看了文章有两个地方没看懂
    1.docker0 和veth连接,是可以理解为docker0是个交换机,所有连接docker0的网卡可以二层通信?

    2.为什么连接到docker0,开启forward就通了?能讲一下原理吗? 是到达docker0的包会经过postrouting链,然后经过本地路由后,需要走forward链出去,所以需要开forward为accept并且开启forward吗?

    作者回复: > 1
    对的你可以理解为docker0是一个L2交换机。

    > 2
    ip_forward就是打开Linux类似路由器的功能,允许数据包从一个接口进入,根据路由从另外一个接口出去。这个和你说的iptables里的postrouting/forward链没有关系

    2020-12-27
    4
    3
  • 谢哈哈
    1,宿主机上配置容器网段的路由
    2,DNAT,在nat表的PREROUTING链做好包伪装到达容器
    2020-12-21
    1
    3
  • kissingers
    如果eth0 也加到docker0 bridge,那么这个时候是通过二层转发或者洪泛的方式连通外网。如果eth0不加到docker0的话那么利用的是host 的路由转发了。这样理解对吗?
    2021-06-20
    1
  • Geek_c2089d
    老师有个问题想咨询一下你,我有个FTP的容器,ftp的配置是配置了127.0.0.1地址,而我宿主机是192.168.1.21的ip,我连接ftp服务的时候用宿主机的ip去连接会有问题???我现在有一个问题是被动模式连接上去但LIST命令数据没返回,但是主动模式可以,想问下和上面配置有关系??如果没关系我上面的配置会引起什么问题??

    作者回复: 127.0.0.1 是 localhost IP, 每个namespace里都有一个。如果从宿主机的host network namespace里去访问127.0.0.1只是 host network namespace里的,不会访问到容器 network namespace的127.0.0.1

    2021-03-09
    1
  • moonberry
    老师您好,请问iptables 列出的NAT表是docker默认配置的吗?

    作者回复: 需要自己加一条 “iptables -P FORWARD ACCEPT”, 其它的是默认的配置。

    2021-03-01
    1
  • Geek_ba556d
    老师,能帮忙解决一下,我在两台vmwarework虚拟机安装centos7.6,分别创建物理网卡子接口,并关联了macvlan,但是ARP传输一直出问题,绑定静态就可以ping通,不知是什么原因,能帮忙解答一下吗?

    作者回复: @Geek_ba556d
    不好意思,这个需要看到现场环境才能进一步分析。不过,你说arp出问题,那么可以先在主要接口dump一下arp request 或者 arp reply的包。

    2021-01-04
    2
    1
  • 徐喆
    老师,我做实验的时候跟着做发现ping不通外网,后来把veth_host桥接到docker0网络通了,是老师在课程里没写上还是其他原因,求教一下
    2021-12-11
  • 超级芒果冰
    老师,veth是怎么配对的,创建之后自动配对吗。如果建了4个veth,配对规则是怎么样的
    2021-09-11
  • Demon.Lee
    请教老师和小伙伴们一个问题,不知道你们是否遇到过:
    一个简单的 k8s 集群(1个 master ,2个 worker) ,master 的 ip 为 10.5.xx.xx,2 个 worker 的 ip 为 192.168.100.xx。

    有一个 pod 暴露了一个 https 端口(比如443),然后 通过 curl https://xxx:443/apis/xxx 访问(调用是会带上token),如果这个 pod 不在 master 节点上,那么在 master 节点上发起请求后一直没反应,直到超时。而在 2 个 worker 节点发起请求,则可以正常返回。
    如果将这个 pod 强制调度到 master 节点上,那么在 master 节点上发起请求,可以正常返回,但在 2 个 worker 节点发起请求,会超时无响应。

    作者回复: @Demon.Lee
    你描述了k8s 集群节点,不过没有描述pod网络配置方式。在分析这个问题前,你可以把集群的网络拓扑和pod在节点上的网络拓扑分析一遍,然后再分析具体的问题。

    2021-08-04
  • 徐少文
    老师的思路我看明白了。我已经自己实现了一个容器沙箱,用net namespace进行了网络的隔离,现在想配置它的网络功能。宿主机已经可以连通外网,我在host上创建了一个网桥,然后在host和沙箱里放置了veth0和veth1。但是还没有设置host上的SNAT和DNAT。现在沙箱和host已经可以ping通,也可以通过tcp通信。但是沙箱内还是无法访问外网,但是不知道具体如何设置SNAT和DNAT,老师能给点指导吗?

    作者回复: @徐少文
    可以找一些iptables相关的文档看一下。

    2021-07-07
  • 百里英骐
    节点外访问容器内ip:
    1. 前提是正常启动容器和宿主机可以通过VETH和docker0网桥互通,两个节点之间互通
    2. 在外部的节点配置iptables(DNAT)规则:
    sudo iptables -t nat -A PREROUTING -d 172.17.0.10(容器的真实ip) -j DNAT --to-destination 172.31.27.61(节点的真实ip)
    3.之后即可从外部机器直接与container内ip交互

    反过来需要,容器节点本地做SNAT,否则数据包只能过去回不来
    2021-05-20
  • Geek_c2089d
    老师,这段时间遇到这样一个问题,想问下遇到这种问题应该怎么找原因:什么日志都看不了

    adding interface vethbad9e82 to bridge docker0 failed: could not find bridge docker0: no such network interface"

    作者回复: 用"ip link show type bridge"命令看一下 docker0 interface是不是存在。

    2021-04-24
    2
  • Roy Liang
    用tcpdump抓包排查问题的思路值得参考,同时理解了示意图上的数据链路中每一个节点的作用

    作者回复: 赞!

    2021-03-30
  • Geek_41a96e
    [root@tyy-node06 ~]# ln -s /proc/$pid/ns/net /var/run/netns/$pid
    ln: failed to create symbolic link ‘/var/run/netns/24847’: No such file or directory,目录/var/run/netns/不存在要手动创建吗?

    作者回复: 是的,如果/var/run/netns 不存在,事先建一下。 `mkdir -p /var/run/netns`

    2021-03-03
  • 争光 Alan
    我的理解
    外部访问容器,一个包在主机上的处理大概是
    经过postrouting链,本地路由,input/forword。。。

    所以如果需要主机访问容器
    方案一
    1.可以在postrouting链增加目的地是docker0的网络接收
    2.经过路由的时候,存在docker0直通路由,会接收处理
    但这样只能是本主机访问,如果是其他主机,还需要在其他主机配置,把到该docker0的包发过来(比如借助overlay等)

    方案二
    做nat,访问主机某端口的流量转给容器的某个端口,则
    1.在postrouting链增加dnat即可

    老师对吗?
    2020-12-27
  • Geek_ba556d
    [root@localhost ~]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 192.168.128.2 0.0.0.0 UG 0 0 0 ens33
    169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
    172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
    172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 veth_host
    192.168.128.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33

    如果veth_host本地网卡配置都是16位,会出现ping不通的情况
    2020-12-24
  • Helios
    以前虚拟机时代,在路由器上配置某个网段的设备都发送给一台机器,然后由这个机器在做路由转发
    2020-12-23
收起评论
20
返回
顶部