k8s不求甚解系列:POD的特权模式
本文描述了k8s中的特权pod的相关定义、使用场景。在文章的后半段给出了一份笔者的实践过程,期望能够带给读者启发
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:感谢阅读,作为一个云原生的初学者,文章内容难免会出现错误。还请在评论区不吝赐教,笔者会认真更正错误
更多推荐
所有评论(0)