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

  • 47
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Kubernetes(k8s)中,Annotation(注解)是一种用于存储与对象相关的非标识性信息的机制。它们以键值对的形式定义,并且可以用于描述和记录对象的元数据信息,如版本、作者、创建时间等。与Label不同,Annotation没有严格的命名规范,并且不用于Label Selector。Annotation的主要作用是提供额外的信息,以便于用户或工具对对象进行更详细的描述和管理。例如,可以使用Annotation来记录对象的配置信息、监控指标、审计日志等。通过使用Annotation,用户可以自定义和扩展Kubernetes对象的元数据,以满足特定的需求。 #### 引用[.reference_title] - *1* *3* [带你玩转kubernetes-k8s(第八篇:k8s-Persisten Volume、Namespace、Annotation、ConfigMap概念及其实例)](https://blog.csdn.net/qq_31136839/article/details/94762459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [确定 k8s 的 Annotation 与 Labels 你用对了?](https://blog.csdn.net/wan212000/article/details/127550634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值