什么是特权容器?如何在k8s中运行特权容器?
1、什么是特权容器?
特权容器(Privileged Container),就是可以像在主机上的操作一样,几乎可以对主机进行任何的操作,比如,要修改容器的内核参数,是要对容器的网络命名空间进行修改的,默认是不允许修改的
如果将容器变为了特权容器,就可以进行修改了。
比如,calico容器,在启动的时候初始化容器,要对容器的网络进行设置,就需要特权,对操作系统的设备,命名空间进行修改,这个时候,就需要特权容器
换句话说,就是将容器提权
比较官方的说法
特权容器是一种具有主机的所有功能的容器,它解除了常规容器的所有限制。
实际上,这意味着特权容器可以执行几乎所有可以直接在主机上执行的操作
2、如何在k8s里面,将容器设置为特权容器?
在k8s中,将pod中的容器设置为特权容器的方法是,在securityContext中加入参数
securityContext: privileged: true
具体的位置:
注意:是在container级别,不是在pod级别
下面的,securityContext: {} 可以设置其他的参数。
如:
sysctls: - name: net.ipv4.tcp_keepalive_time value: "600"
但是,这个设置,必须在kubelet中开启安全参数允许,才能设置
allowedUnsafeSysctls: - "net.ipv4.tcp_keepalive_time"
3、测试使用
OK,这里通过一个poststart脚本,修改容器的内核参数
lifecycle: postStart: exec: command: - /bin/sh - -c - sysctl -w net.ipv4.tcp_keepalive_time=600
具体位置:
修改后,进入容器,查看内核参数:
[root@nccztsjb-node-23 ~]# kubectl exec -it php-apache-5b67555b84-z2zsp -- sysctl -a | grep net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_time = 600 [root@nccztsjb-node-23 ~]#
参数已经被正确的修改了
如果不加上privileged: true,启动容器就会报错:
php-apache-5b67555b84-z2zsp 1/1 Running 0 2m49s [root@nccztsjb-node-23 ~]# kubectl describe pod php-apache-57cb8d6d67-fln6m Name: php-apache-57cb8d6d67-fln6m Namespace: default Priority: 0 ...中间省略... Normal Created 16s kubelet Created container php-apache Normal Started 16s kubelet Started container php-apache Warning FailedPostStartHook 16s kubelet Exec lifecycle hook ([/bin/sh -c sysctl -w net.ipv4.tcp_keepalive_time=600]) for Container "php-apache" in Pod "php-apache-57cb8d6d67-fln6m_default(52086416-cd89-4e28-bb1c-3724382f3f34)" failed - error: command '/bin/sh -c sysctl -w net.ipv4.tcp_keepalive_time=600' exited with 255: sysctl: setting key "net.ipv4.tcp_keepalive_time": Read-only file system , message: "sysctl: setting key \"net.ipv4.tcp_keepalive_time\": Read-only file system\n" Normal Killing 16s kubelet FailedPostStartHook
sysctl: setting key \"net.ipv4.tcp_keepalive_time\": Read-only file system\n"
只读文件系统,无法修改内核参数。