在 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 表明容器将以特权模式启动。
特权 Pod 在 Kubernetes 集群里面的应用场景较为特殊且限定,因为它们能够绕过多数容器沙盒的安全限制。以下是一些可能需要使用特权 Pod 的场景:
操作系统:centos7
k8s版本:1.23.0 单master节点
背景知识:当客户端尝试建立到服务器的连接时,服务器必须接受这些连接请求。somaxconn 参数限制了在等待服务器处理(即处于“SYN_RECV”状态)的连接请求的最大数量。如果连接请求达到了这个设置值,那么额外的请求将被拒绝或丢弃。因此,根据服务器的负载和需求,可以适当调整 somaxconn 参数来优化并发连接的处理。
可以通过以下命令来查看和修改 net.core.somaxconn
#查看链接请求数
sysctl net.core.somaxconn
#修改链接请求数
sysctl -w net.core.somaxconn=128
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
首先,在宿主机上观察内核参数的数值为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:感谢阅读,作为一个云原生的初学者,文章内容难免会出现错误。还请在评论区不吝赐教,笔者会认真更正错误