1. 定义

在 Kubernetes(常简称为 k8s)中,特权模式是指让 Pod 中的容器能以类似于主机 root 用户的权限运行。当容器以特权模式运行时,它能够访问主机的资源和操作系统的功能,几乎不受限制。
这通常用于特定的用例,比如当你需要容器内的应用程序进行操作系统层面的管理任务时(例如,使用系统调用或访问硬件设备)。另一个常见的使用场景是运行网络插件或存储插件,这些插件需要对底层宿主机的改动或检测。
启用特权模式的容器可以通过 Kubernetes Pod 定义中的安全上下文(SecurityContext)来配置。以下是一个示例片段,展示了如何在 Pod 配置中为容器设置特权模式:

apiVersion: v1
kind: Pod
metadata:
  name: privileged-pod
spec:
  hostPID: true
  hostNetwork: true
  containers:
    - name: busybox1
      image: busybox
      command: ["tail", "-f", "/dev/null"]
      securityContext:
        privileged: true

在上述 securityContext 中的 privileged: true 表明容器将以特权模式启动。

2.使用场景

特权 Pod 在 Kubernetes 集群里面的应用场景较为特殊且限定,因为它们能够绕过多数容器沙盒的安全限制。以下是一些可能需要使用特权 Pod 的场景:

  • 1.节点级别的监控和管理:对于需要访问或管理操作系统和宿主机资源的监视工具,如资源监控、日志管理工具等,可能需要特权模式以获取必要的系统信息和资源访问。
  • 2.网络功能:特权 Pod 常用于网络相关的操作,例如直接管理宿主机上的网络堆栈,如设置 iptables 规则、管理 IPVS 配置、操作网络接口等。例如,某些 CNI 插件需要运行在特权模式下以正确配置网络。
  • 3.存储管理:某些存储解决方案导致 Pod 需要与底层存储设备交互,例如配置存储卷、挂载文件系统或执行存储管理任务,可能需要特权模式。
  • 4.设备驱动程序:对于需要直接与硬件交互的应用程序—比如要进行 GPU 计算或管理 FPGA 等—特权模式容器可能需要直接访问这些硬件。
  • 5.系统探针:容器内运行的安全性分析工具或漏洞扫描程序可能需要特权访问以对整个系统进行完整扫描。
  • 6.容器运行时管理:管理或与容器运行时(如 Docker、containerd)直接交互的工具,可能需要特权模式以控制容器生命周期操作等。
  • 7.内核参数的修改:需要调整宿主机内核参数的应用,如执行 sysctl 命令来修改内核运行参数等。
    尽管特权 Pod 提供了强大的功能,但应谨慎使用,只有在没有其他解决办法时才考虑,因为这会带来显著的安全风险。此外,应该使用适当的安全策略和最佳实践来最小化风险
    在 Kubernetes 1.21 版本起,PodSecurityPolicy(PSP)被标记为弃用,取而代之的是 PodSecurity 标准。因此,在新的集群环境中部署特权 Pod 时,应考虑使用 PodSecurity 标准或者其他第三方安全工具来控制和限制特权容器的使用。

3.案例

操作系统:centos7
k8s版本:1.23.0 单master节点

背景知识:当客户端尝试建立到服务器的连接时,服务器必须接受这些连接请求。somaxconn 参数限制了在等待服务器处理(即处于“SYN_RECV”状态)的连接请求的最大数量。如果连接请求达到了这个设置值,那么额外的请求将被拒绝或丢弃。因此,根据服务器的负载和需求,可以适当调整 somaxconn 参数来优化并发连接的处理。

可以通过以下命令来查看和修改 net.core.somaxconn

#查看链接请求数
sysctl net.core.somaxconn
#修改链接请求数
sysctl -w net.core.somaxconn=128

3.1 创建特权pod

apiVersion: v1
kind: Pod
metadata:
  name: privileged-pod
spec:
  hostPID: true
  hostNetwork: true
  containers:
    - name: busybox1
      image: busybox
      command: ["tail", "-f", "/dev/null"]
      securityContext:
        privileged: true
    - name: busybox2
      image: busybox
      command: [ "tail", "-f", "/dev/null" ]

将上述yaml文件命名为privileged-pod.yaml并保存在宿主机器上。上述pod中包含两个容器,busybox1为特区容器。

# 根据上述yaml文件创建pod
kubectl apply -f privileged-pod.yaml

执行后,可以在宿主k8s集群中看到创建的pod

[root@master pod]# kubectl get po
NAME                                     READY   STATUS    RESTARTS       AGE
metric-metrics-server-6d598d8b64-b68lm   1/1     Running   15 (33m ago)   31d
nginx-85b98978db-bb5ld                   1/1     Running   20 (33m ago)   53d
privileged-pod                           2/2     Running   0              20m
webdemo-9d998b7f4-9krxl                  1/1     Running   21 (33m ago)   53d
webdemo-9d998b7f4-lc2mq                  1/1     Running   21 (33m ago)   53d
webdemo-9d998b7f4-xvc87                  1/1     Running   21 (33m ago)   53d

3.2 在不同权限的容器执行内核参数修改的指令

首先,在宿主机上观察内核参数的数值为129

[root@master pod]# sysctl net.core.somaxconn
net.core.somaxconn = 129

我们进入到容器busybox1中修改内核参数的值

[root@master pod]# kubectl exec -it privileged-pod -c busybox1 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # sysctl -w net.core.somaxconn=128
net.core.somaxconn = 128

回到宿主机种查看内核参数被修改完成

[root@master pod]# sysctl net.core.somaxconn
net.core.somaxconn = 128

进入到容器busybox2中尝试修改内核参数,系统异常报错,无权限修改内核参数

[root@master pod]# kubectl exec -it privileged-pod -c busybox2 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # sysctl -w net.core.somaxconn=129
sysctl: error setting key 'net.core.somaxconn': Read-only file system

推荐阅读

Kubernetes SecurityContext 安全上下文 特权模式运行pod
特权模式

ps:感谢阅读,作为一个云原生的初学者,文章内容难免会出现错误。还请在评论区不吝赐教,笔者会认真更正错误

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐