怎么给docker容器设置内核参数?怎么给k8s POD设置内核参数?为什么给容器设置某些内核参数之后,主机也会受影响?
容器与sysctl
内核方面做了大量的工作,把一部分sysctl内核参数进行了namespace化(namespaced)。也就是多个容器和主机可以各自独立设置某些内核参数。例如, 可以通过net.ipv4.ip_local_port_range,在不同容器中设置不同的端口范围。
如何判断一个参数是不是namespaced?
运行一个具有privileged权限的容器(参考下一节内容), 然后在容器中修改该参数,看一下在host上能否看到容器在中所做的修改。如果看不到, 那就是namespaced, 否则不是。
目前已经namespace化的sysctl内核参数:
kernel.shm*,
kernel.msg*,
kernel.sem,
fs.mqueue.*,
net.*.
注意, vm.*并没有namespace化。比如vm.max_map_count, 在主机或者一个容器中设置它, 其他所有容器都会受影响,都会看到最新的值。
在docker容器中修改sysctl内核参数
正常运行的docker容器中,是不能修改任何sysctl内核参数的。因为/proc/sys是以只读方式挂载到容器里面的。
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
要给容器设置不一样的sysctl内核参数,有多种方式。
方法一 --privileged
docker run --privileged -it ubuntu bash
整个/proc目录都是以"rw"权限挂载的
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
在容器中,可以任意修改sysctl内核参赛。
注意:如果修改的是namespaced的参数, 则不会影响host和其他容器。反之,则会影响它们。
如果想在容器中修改主机的n