当前位置: 首页 > news >正文

pod内部共享命名空间与k8s命名空间是一个东西吗?

文章目录

    • 小知识-命名空间
      • **下面着重介绍一下刚刚提到的内部命名空间**
        • IPC Namespace
        • Network Namespace

  本文摘自于我的免费专栏《Kubernetes从0到1(持续更新)》请多关注

小知识-命名空间

注意,首先我要强调一点,Kubernetes命名空间(K8s Namespace)与Pod内的共享命名空间是两个东西,下面请让我我来解释。(官方参考:Kubernetes 1.30:对 Pod 使用用户命名空间的支持进阶至 Beta | Kubernetes)

Pod内的共享命名空间:是 Linux 内核提供的一种隔离机制,这个命名空间是指 Pod内容器共享的网络、存储、IPC等资源命名空间。在同一个Pod内,多个容器共享网络命名空间、存储卷、PID命名空间等。这个概念更多的是与容器的协作和资源共享相关,而非集群范围的资源隔离(再次强调!意思就是和Kubernetes命名空间不是一个东西)。(官方文档:用户命名空间 | Kubernetes)
Kubernetes中的Namespace是一种用于在集群内部组织和隔离资源的机制。一个Namespace可以看作是一个虚拟的集群,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。

!!!非常重要!!!: 实际上一些容器运行时的默认配置(如 Docker Engine、containerd、CRI-O)就使用 Linux 命名空间进行隔离,这样我们就可以理解pod为什么有用户命名空间这个东西了(既Pod 网络命名空间的设置由实现容器运行时接口(CRI)的系统层面软件处理。)。

常见的 7 种 Linux 命名空(namespaces(7) - Linux manual page)间如下:

命名空间简称作用
Mount Namespacemnt隔离挂载点(如文件系统结构),不同容器看不到彼此的挂载点。
UTS Namespaceuts隔离主机名和域名(hostname 和 domainname)。
IPC Namespaceipc隔离进程间通信资源,如信号量、消息队列、共享内存。
PID Namespacepid隔离进程编号(每个容器都认为自己从 PID 1 开始)。
Network Namespacenet隔离网络接口、IP 地址、路由表、端口等。
User Namespaceuser隔离用户和组 ID(UID、GID),可实现非特权容器。
Cgroup Namespacecgroup隔离 cgroup 层级,控制资源分配和限制的视图。

Pod内部共享情况

命名空间类型是否 Pod 内容器默认共享是否可配置为共享说明
Network (net)✅ 是❌ 否所有容器共享 Pod 的网络栈:同一个 IP、端口需避免冲突。
PID (pid)❌ 否✅ 可以共享可通过 shareProcessNamespace: true 启用容器之间共享进程视图。
IPC (ipc)✅ 是❌ 否所有容器共享信号量、消息队列、共享内存。
Mount (mnt)❌ 否✅ 通过 Volume 实现不直接共享,但可通过挂载同一个 Volume 实现数据共享。
UTS (uts)❌ 否✅ 某些场景下可共享可通过配置让多个容器看到同样的 hostname(不常用)。
User (user)❌ 否✅ 支持(1.25+ 默认开启)Linux 支持,K8s 中需要额外配置或启用。
Cgroup(cgroup)❌ 否⚠️ 受限支持Kubernetes 不直接暴露配置,但可通过容器运行时影响。

下面着重介绍一下刚刚提到的内部命名空间

IPC Namespace

IPC (Inter-Process Communication)命名空间 是 Linux 容器中非常核心的一个隔离机制,它的作用是让同一个 Pod 中的多个容器能够共享进程间通信资源(IPC),而不同 Pod 的容器之间则无法互相访问这些资源(当然,这样也保证了不同pod的隔离性从而保证安全与互不干扰)。

那么这些资源包括如下种类:

  • 共享内存(Shared Memory)
  • 信号量(Semaphores)
  • 消息队列(Message Queues)

所以,在一个pod中的容器由于拥有同一个IPC命名空间,这导致这些容器之间能够共享内存,使用同一个key获取同一个信号量,通过消息队列进行通信。

Network Namespace

Pod 有自己的私有网络命名空间,Pod 内的所有容器共享这个命名空间。 运行在同一个 Pod 中的不同容器的进程彼此之间可以通过 localhost 进行通信。但是在外部通信时由于网络命名空间之间彼此独立(不同pod实际上是被命名空间隔离了),但它们之间的通信可以通过宿主机上的虚拟网络桥或者网络插件(容器网络接口CNI)实现连接。(官方文档:网络插件 | Kubernetes)

相关文章:

  • Podman Desktop:现代轻量容器管理利器(Podman与Docker)
  • Vmware安装centos7和Redis
  • kafka安装、spark安装
  • 概率dp总结
  • LangChain Runnable简介
  • 黑马点评redis改 part 5
  • C++ STL 容器简介(蓝桥杯适用精简版)
  • docker底层原理简述
  • 开源版「v0」OpenUI:根据文本生成UI界面代码
  • 读书笔记:淘宝十年产品与技术演进史
  • 配置Spark历史服务器,轻松查看任务记录
  • 算法训练营第一天|704.二分查找、27.移除元素、977.有序数组的平方
  • 【哈希表】1399. 统计最大组的数目
  • Java学习手册:Web 安全基础
  • 【KWDB 创作者计划】_上位机知识篇---MicroPython
  • 青少年编程与数学 02-018 C++数据结构与算法 06课题、树
  • Kairos 生态有哪些值得关注的进展?
  • 搭建Stable Diffusion图像生成系统实现通过网址访问(Ngrok+Flask实现项目系统公网测试,轻量易部署)
  • Linux:进程地址空间
  • 基于Python将MongoDB文本数据通过text2vec-large-chinese模型向量化并存储到Milvus数据库的完整实现方案
  • 为什么猛起身会头晕?你的身体在发出这个警报
  • 重庆一幼儿园回应招聘硕士幼教:统一标准,江北区学前教育岗的硬性要求
  • 上海之旅相册②俄罗斯Chaika:客居六年,致上海的情书
  • 大学2025丨浙大哲学院院长王俊:文科的价值不在于直接创造GDP
  • 马上评|京东VS美团,消费者希望看到的不是“口水仗”
  • 87岁老人花3万多做“血液净化”延年益寿?医院“张主任”:我那是善意的欺骗