容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
4427 人已学习
立即订阅
登录后,你可以任选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
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

15 | 容器网络:我修改了/proc/sys/net下的参数,为什么在容器中不起效?

你好,我是程远。
从这一讲开始,我们进入到了容器网络这个模块。容器网络最明显的一个特征就是它有自己的 Network Namespace 了。你还记得,在我们这个课程的第一讲里,我们就提到过 Network Namespace 负责管理网络环境的隔离。
今天呢,我们更深入地讨论一下和 Network Namespace 相关的一个问题——容器中的网络参数。
和之前的思路一样,我们先来看一个问题。然后在解决问题的过程中,更深入地理解容器的网络参数配置。

问题再现

在容器中运行的应用程序,如果需要用到 tcp/ip 协议栈的话,常常需要修改一些网络参数(内核中网络协议栈的参数)。
很大一部分网络参数都在 /proc 文件系统下的/proc/sys/net/目录里。
修改这些参数主要有两种方法:一种方法是直接到 /proc 文件系统下的"/proc/sys/net/"目录里对参数做修改;还有一种方法是使用sysctl这个工具来修改。
在启动容器之前呢,根据我们的需要我们在宿主机上已经修改过了几个参数,也就是说这些参数的值已经不是内核里原来的缺省值了.
比如我们改了下面的几个参数:
# # The default value:
# cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
# # To update the value:
# echo bbr > /proc/sys/net/ipv4/tcp_congestion_control
# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 10 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 6 > /proc/sys/net/ipv4/tcp_keepalive_probes
#
# # Double check the value after update:
# cat /proc/sys/net/ipv4/tcp_congestion_control
bbr
# cat /proc/sys/net/ipv4/tcp_keepalive_time
600
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
10
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
6
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(14)

  • 莫名
    docker exec、kubectl exec、ip netns exec、nsenter 等命令原理相同,都是基于 setns 系统调用,切换至指定的一个或多个 namespace(s)。
    2020-12-19
    14
  • 莫名
    # nsenter -t <pid> -n bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time' (root 用户)
    $ sudo nsenter -t <pid> -n sudo bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time' (非 root 用户)

    其中,<pid> 表示容器 init 进程在宿主机上看到的 PID。

    作者回复: 对!

    2020-12-19
    2
    12
  • 谢哈哈
    宿主机的进入容器网络地址空间通过nsenter --target $(docker inspect -f {.State.Pid}) --net

    作者回复: 是的

    2020-12-19
    3
    5
  • aMaMiMou
    老师您好,有几个问题能否帮忙解答下,谢谢
    1.在/proc/sys/net 的诸多参数里,如何确认哪些是host level 哪些是容器level的呢?
    2.对于host level的这些参数,在启动容器的时候通过sysctl能修改么?如果能修改,是不是相当于同时影响了同host里其他容器的运行时参数呢?

    作者回复: @AMaMiMou
    很好的问题,对于/proc/sys/net下的参数,你在容器中看到的,基本都是network namespace下的。
    对于容器启动的时候,runc只允许修改namesapce下的参数值,而不会修改host相关的值。

    可以参看一下runc的sysctl validation的代码:

    https://github.com/opencontainers/runc/blob/ff819c7e9184c13b7c2607fe6c30ae19403a7aff/libcontainer/configs/validate/validator.go#L135

    2020-12-26
    2
    4
  • Geek_c2089d
    老师,咨询一个问题,就是我有一个容器里面有两个服务,映射出8000和9000的端口,在容器内会出现8000端口的服务访问宿主机ip:9000的端口不通,但是我service iptables stop ; seriver docker stop ;
    server docker start ; 就可以访问了。一旦reboot就不行了。请问是怎么样的问题
     

    作者回复: > service iptables stop
    看上去应该是 iptables stop 后把原来的iptables rules flush了,就可以工作了。
    你可以查看一下具体是那条iptables规则阻止了访问。

    2021-01-22
    3
  • 🐭
    既然nsenter与docker exec 原理一样,为啥nsenter修改proc/sys/net不会报错无权限呢

    作者回复: docker exec 同时进入了容器的pid/mnt/net namespace, 而 nsenter 修改参数的时候,只是进入了容器的net namespace.

    2021-08-03
    2
  • 麻瓜镇
    为什么有的参数是从host namespace复制,有的参数直接使用缺省值呢?为什么要这样设计?
    2021-01-09
    2
  • Helios
    这些问题文档上都没写,还是老师功力高,场景多。
    请教个问题,对于proc文件系统的其他目录容器怎么隔离的呢,比如在容器里面free命令看到的是宿主机的内存。

    作者回复: /proc下的内容大部分是没有隔离的,就想你说的/proc/meminfo, /proc/stat 在容器中看到的都和宿主机上的是一样的。
    其他有一些因为namespace不同而不同的/proc的内容,
    比如 /proc/<pid>/, 容器下只能看到自己pid namespace里的进程pid。
    /proc/mounts的内容和mount namespace相关。
    还有IPC namesapce相关的一些/proc下的参数,等等。

    2020-12-22
    2
  • 乔纳森
    我们是在 initContainers 中 执行 如下来修改容器内的内核参数的,需要privileged: true
    mount -o remount rw /proc/sys
              sysctl -w net.core.somaxconn=65535

    作者回复: 嗯,如果container有privileged的权限,那么在容器中几乎和host有同等权限了。

    2021-07-04
    1
  • Demon.Lee
    老师,为啥隔离的这些网络参数不和 /sys/fs/cgroup/net_cls,net_prio,cpu,pid 等一样,统一放在/sys/fs/cgroup/下面,而是跟宿主机共用一套 ?

    作者回复: 一个是namespace, 主要是资源隔离
    另外一个是cgroup,主要是资源的划分。

    2021-07-02
    1
  • 程序员老王
    网卡是通过端口号来区分栈数据吧,命名空间在这里隔离是网络参数配置吗?还是网卡

    作者回复: @王传义
    你这里说的“端口”是指tcp/udp层的端口号吗?

    2020-12-18
    2
    1
  • cc
    "tcp_congestion_control 的值是 bbr,和宿主机 Network Namespace 里的值是一样的,而其他三个 tcp keepalive 相关的值,都不是宿主机 Network Namespace 里设置的值,而是原来系统里的缺省值了。"
    ------
    这里比较困惑,为什么要这样设计呢?
    2022-01-29
  • Dexter
    pid = clone(new_netns, stack + STACK_SIZE, CLONE_NEWNET | SIGCHLD, NULL); 代码例子中的一段, clone系统调用中的参数,new_netns和 CLONE_NEWNET flag这两者有什么关系呢?
    2021-12-16
  • Shone
    CY老师,这里我又想起最近遇到的rp_filter 的问题,因为我们的slb用的是ipvs tunnel,需要给应用pod设置tun0设备并且绑定vip,同时还需要设置rp_filter为0或者2。这里我们遇到的问题是有时候node上的这个配置会被改成1,导致ipvs数据面不工作,解决办法是把node上这个值设为0,但是我发现这个时候pod eth0这个值是1,它对应的calico这个值也是1,所以这种情况下好像是node的rp_filter会覆盖其它的设置,对这里不是很理解了。
    2021-01-10
收起评论
14
返回
顶部