Kubernetes 1.31 新功能: 细粒度补充组控制

2024-08-31 04:36

本文主要是介绍Kubernetes 1.31 新功能: 细粒度补充组控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章讨论了 Kubernetes 1.31 中的一个新特性,用于改善 Pod 中容器的补充组(Fine-grained SupplementalGroups control)处理。

动机:在容器镜像中的 /etc/group 定义的隐式组成员身份

尽管这种行为可能并不受许多 Kubernetes 集群用户/管理员的欢迎,但 Kubernetes 默认情况下会将 Pod 中的组信息与容器镜像中 /etc/group 定义的信息进行合并。

让我们来看一个例子,下面的 Pod 在其安全上下文中指定了 runAsUser=1000runAsGroup=3000supplementalGroups=4000

apiVersion: v1
kind: Pod
metadata:name: implicit-groups
spec:securityContext:runAsUser: 1000runAsGroup: 3000supplementalGroups: [4000]containers:- name: ctrimage: registry.k8s.io/e2e-test-images/agnhost:2.45command: [ "sh", "-c", "sleep 1h" ]securityContext:allowPrivilegeEscalation: false

ctr 容器中执行 id 命令的结果是什么?

# 创建 Pod:
$ kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/implicit-groups.yaml# 验证 Pod 的容器正在运行:
$ kubectl get pod implicit-groups# 检查 id 命令
$ kubectl exec implicit-groups -- id

然后,输出应该类似于这样:

uid=1000 gid=3000 groups=3000,4000,50000

即使在 Pod 的清单中根本没有定义 50000,补充组中的组 ID 50000 来自哪里?答案是容器镜像中的 /etc/group 文件。

检查容器镜像中的 /etc/group 的内容应该显示如下:

$ kubectl exec implicit-groups -- cat /etc/group
...
user-defined-in-image:x:1000:
group-defined-in-image:x:50000:user-defined-in-image

啊哈!容器的主用户 1000 在最后一个条目中属于组 50000

因此,容器镜像中为容器的主用户定义的组成员身份被隐式地合并到来自 Pod 的信息中。请注意,这是当前 CRI 实现从 Docker 继承的设计决策,社区直到现在才真正重新考虑它。

这有什么问题?

容器镜像中的 /etc/group 隐式合并的组信息可能会引起一些关注,特别是在访问卷时(详见 kubernetes/kubernetes#112879),因为文件权限由 Linux 中的 uid/gid 控制。更糟糕的是,来自 /etc/group 的隐式 gids 无法被任何策略引擎检测/验证,因为在清单中没有隐式组信息的线索。这也可能是 Kubernetes 安全方面的一个关注点。

为了解决上述问题,Kubernetes 1.31 引入了 Pod 的 .spec.securityContext 中的新字段 supplementalGroupsPolicy

此字段提供了一种控制如何计算 Pod 中容器进程的补充组的方法。可用的策略如下:

  • 合并:容器的主用户在 /etc/group 中定义的组成员身份将被合并。如果没有指定,将应用此策略(即向后兼容的当前行为)。

  • 严格:它只附加在 fsGroupsupplementalGroupsrunAsGroup 字段中指定的组 ID 作为容器进程的补充组。这意味着容器镜像中为主用户定义的任何组成员身份都不会被合并。

让我们看看 Strict 策略是如何工作的。

# 创建 Pod:
$ kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/strict-supplementalgroups-policy.yaml# 验证 Pod 的容器正在运行:
$ kubectl get pod strict-supplementalgroups-policy# 检查进程身份:
kubectl exec -it strict-supplementalgroups-policy -- id

输出应该类似于这样:

uid=1000 gid=3000 groups=3000,4000

你可以看到 Strict 策略可以排除 groups 中的组 50000

因此,确保 supplementalGroupsPolicy: Strict(由某些策略机制强制执行)有助于防止 Pod 中的隐式补充组。

Pod 状态中的附加进程身份

此功能还通过 .status.containerStatuses[].user.linux 字段公开了附加到容器的第一个进程的进程身份。这将有助于查看是否附加了隐式组 ID。

...
status:containerStatuses:- name: ctruser:linux:gid: 3000supplementalGroups:- 3000- 4000uid: 1000
...

特性可用性

要启用 supplementalGroupsPolicy 字段,必须使用以下组件:

  • Kubernetes:v1.31 或更高版本,启用了 SupplementalGroupsPolicy 特性门控。截至 v1.31,该门控标记为 alpha。
  • CRI 运行时:
    • containerd:v2.0 或更高版本
    • CRI-O:v1.31 或更高版本

你可以在节点的 .status.features.supplementalGroupsPolicy 字段中查看特性是否受支持。

apiVersion: v1
kind: Node
...
status:features:supplementalGroupsPolicy: true

在这里插入图片描述

这篇关于Kubernetes 1.31 新功能: 细粒度补充组控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122899

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码