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

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue