什么是特权容器?如何在k8s中运行特权容器?

发布时间 2023-05-31 13:59:33作者: 拨云3

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"

只读文件系统,无法修改内核参数。