k8s 中 pod 是如何做到网络共享的

news2024/11/25 11:03:16

前言

在k8s中, pod是编排的最小单位, 在同一个pod中, 容器之间能够共享hostname network 等内容.

共享network, 简单说就是同一个pod中的容器, 可以通过访问localhost互相访问, 且端口占用会冲突.

在之前的介绍中提到过, 容器的隔离是通过namespace技术实现的, 网络隔离自然也是通过Network Namespace 实现. 每个network namespace中都有自己的一套网络资源, 比如: IP地址, 路由表, 网卡等.

那么网络共享的原理, 自然也就是将多个容器加入到同一个network namespace中咯.

令多个容器共用一套network namespace, 在docker中可以这样做:

# 方式一: 创建一个network, 然后所有容器都使用这个网络
docker network create mynetwork
docker run --name container1 --network=mynetwork nginx
docker run --name container2 --network=mynetwork nginx

# 方式二: 启动一个容器, 然后将新的容器加入到已有容器的网络中
docker run --name container1 nginx
docker run --name container2 --network container:container1 nginx

而k8s则是容器的管理者, 它又是怎么选择的呢?

k8s 的网络共享

k8s中, 选择了第二种方式来共享网络, 不止是网络, 包括volume也是这样. 这样设计可能是为了更大的灵活性吧. 具体原因没有细究.

但是, 如果说我们在启动容器的时候, 要将其加入到已有容器的网络中, pod中的容器就必须有一个是先启动的, 这样后续的容器才能加入. 那么问题来了, pod中哪个容器能够最先启动呢? 难道我们在定义pod时还需要定义容器的启动顺序吗? 显然不是这样的.

那么k8s是如何解决容器启动顺序的问题呢? 处理方式也十分简单粗暴, 在所有容器启动之前, 先启动一个默认的容器, 后续所有容器就可以都加入此容器的命名空间中了. 这个预先启动的容器什么都不做, 只是为了后续容器加入.

pause容器查看

口说无凭, 我们启动一个pod来看一下:

apiVersion: v1
kind: Pod
metadata:
  name: test
  namespace: hj
spec:
  shareProcessNamespace: true
  restartPolicy: Never
  containers:
    - name: nginx
      image: nginx
    - name: busybox
      image: busybox
      command: ["/bin/sh"]
      args: ["-c", "sleep infinity"]

此时查看运行中的容器列表, 那么你就能够看到pause容器:

image-20230523143629109

另外, 因为我们开启了shareProcessNamespace共享进程空间, 因此我们可以进入容器查看当前运行的所有进程:

image-20230523143922784

也可以清楚的看到pause进程, 与当前容器在同一个进程命名空间中.

(另外, 这里可以看到我们exec进入的sh进程, 其父进程PID是0, 与容器挂载目录中说的也对上了嘛. exec的原理是将进程强行加入已有的命名空间中)

pause容器

pause需要具有如下特点:

  1. 体积小 (方便快速拉取镜像)
  2. 不占用资源(否则每个pod启动一个, 用户资源都被吃光了)
  3. 稳定 (一旦挂了, 接入此容器命名空间的关联容器都会被波及, 所以此容器不能挂)

那么, pause到底做了什么呢? 在github可以看到镜像构建的源码. 其主要运行的源码在这里.

简单说, pause容器什么也没干. 进程在启动后, 不停的调用pause函数进入睡眠, 从而使得容器能够持续运行而又不消耗系统资源. 同时越是简单的就越是稳定. 而这个容器的大小也不过742KB.


至此, pod网络共享的谜团算是大致解开了. 虽然没有特别深入, 但对于理解pod也有一定的帮助.

原文地址: https://hujingnb.com/archives/900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后,我常困惑于怎么过滤log,和以前的UI差异比较大,新UI界面结构如下: 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…

技术大佬们都是怎么学习的?

目录 问题 熟悉更多业务 熟悉端到端 自学 Do exercise Learning trying Teaching 问题 今天逛帖子的时候,看到这么个问题: 这个问题我曾经也很好奇过,那些成为技术大佬的人当初是怎么学习,以及怎么成长过来的&#xff0…

就业内推 | 上市游戏公司,六险一金,最高30K*13薪

01 吉比特 🔷招聘岗位:网络工程师 🔷职责描述: 1、参与公司整体网络规划,制定网络运行规范 2、负责网络监控、应急相应等日常运维工作,及时定位及故障处理 3、负责数据中心内基础架构维护 4、负责企业I…

低代码平台:解决项目管理中的瓶颈难题

随着数字化时代的到来,项目管理已经成为现代企业中不可或缺的一部分。尤其是在软件开发、信息技术、新产品开发等领域,项目管理的重要性更加凸显。然而,项目管理中存在着许多痛点和瓶颈难题,如项目周期长、成本高、协作难度大等。…

Spring Boot进阶(38):SpringBoot之跨域配置 | 超级详细,建议收藏

1. 前言🔥 我们都知道springboot默认日志是打印在控制台中的,不会以文件的形式进行保存。那么日后系统上线肯定是有需要对日志进行定位分析问题的,那么如何实现将控制台输出的日志保存起来? 这将又会是干货满满的一期,…

最新Java适配商城系统

城前端功能展示 商城移动端 后端基于SpringBoot 研发,前端使用 Vue、uniapp开发 前后端分离,支持分布式部署,支持Docker,各个API独立,并且有独立的消费者 api不需要单独部署,只需启动一个jar包就可以正…

c语言基础知识(知识点较为完整)

计算机和c语言基础知识 计算机常识 什么是计算机? 顾名思义,就是能够进行数据运算的机器(台式电脑、笔记本电脑、平板电脑、智能手机) 计算机_百度百科 计算机的发明者是谁 ? 关于电子计算机的发明者是谁这一问题,有好几种答案: 1936年英国数学家…

Lamini:大语言模型精调框架

Lamini:大语言模型精调框架 精调是大型语言模型 (LLM) 开发生命周期中最困难的部分之一。如果我们谈论的是诸如人类反馈强化学习 (RLHF) 之类的技术,那么这个过程尤其具有挑战性,因为这需要特别复杂的工作流程。 最近,我发现诞生…

11 长效保证机制:伦理道德风险外溢临界模型

AI系统上线后,随着不断的投入使用AI系统会自我学习和自我演进,这也导致了AI系统的伦理道德性并不是一次性的验证,而是需要按照一定的周期不断的验证,通过按周期巡检的方式持续的评估AI系统的伦理道德风险的外溢可能性。如何建立一…

css、js(vue)进行textarea自适应高度(超详细说明)

文章目录 需求——如下图一、纯css 的自适应高度(有问题,不推荐)1.css代码2. html代码3. 代码截图说明4. 效果和会出现的问题 二、js 的自适应高度0.思路1.代码1. css代码2. html代码3. js代码 2.代码说明3.注意点导致的问题(0&am…

spark-sql写入对象存储路径不存在问题(异常路径自动消失)

一、问题分析 1, 环境 spark3.2 hadoop3.2.2 2, 问题现象 insert overwrite table到hive表时,出现路径不存在的报错,导致任务失败。 当表的路径在hdfs上时,没有问题。 表的路径在对象存储上时会有问题。 insert overwrit…

python如何连接mysql数据库

python链接mysql数据库要用到pymysql模块中的connect ,connect函数是pymysql模块中 用于连接MySQL数据库的一个函数。 所以连接mysql之前需要先导入pymysql模块。 第一步,mysql模块下载 方法1(使用pip命令安装): 因…

测试岗位是巨坑,7年测试告诉你千万别入行.....

每次都有人问我软件测试的前景是什么样的,每年也会有人很多人纷纷涌入测试的岗位上,希望自己能够进入阿里、华为等大厂 但是测试岗位真的那么吃香吗?今天我结合从零基础小白到测试开发的成长经历,来说下这个行业的发展前景&#…

微信小程序仿网易音乐播放器项目

一、项目展示 主页: 播放页: 搜索页: 排行榜页: 小控件: 二、项目结构 三、项目功能点 后端接口,使用node写的,使用了网易云音乐API: 封装的api文件 //env是基础地址js文件 im…

05 JDBC基础

什么是持久化 将内存中的数据永久保存在磁盘中,方便以后使用 JDBC是什么 java数据库连接 用于执行sql语句的java API java官方提供接口,各大厂商提供实现类,程序员使用实现类的jar包 JDBC的开发流程 添加包: mysql-connector-java-5.1.48.jar lombok.jar 口诀:贾连欲…

Linux文件内管理命令

目录 Linux文件内管理命令 创建文件 目录 普通文件 链接文件 删除文件 删除文件 删除目录 查看文件 目录 普通文件 编辑普通文件 在命令行进行文本内容处理 查找内容 复制文件 移动文件 命令详解 mkdir 作用 语法格式 touch 作用 语法格式 选项 ​编辑…

STM32——SDIO的学习(驱动SD卡)(理论篇)

目录 一、SD卡简介 1.1历史 1.2 tf卡和SD卡的区别 1.3 mmc,emmc,nand,flash的关系 1.4 SD卡的规格等级 1.4.1按容量分 1.4.2 class等级 1.4.3 UHS总线模式 1.4.4 UHS速度等级 1.4.5 VSC视频速度等级 二、SD卡的内部结构 三、SDIO…

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用,它负责局部数据的聚合,我们可以看到,对于大数据量,如果没有Combiner,将会在磁盘上写入多个文件等待ReduceTask来拉取,但是如果有Combiner组件,我们…

什么是Reactive服务架构

介绍: 在java web开发领域,区别于传统的的同步服务架构(底层实现基于同步阻塞IO模型),异步服务这个“新词”(bushi)在不断被提及和重视,不少公司的研发部门也开始在尝试对自己的业务…

【JMM】并发编程Bug的源头——可见性/有序性/原子性问题

本文目录( ̄∇ ̄)/ 可见性问题 有序性问题 为什么会进行指令重排序/乱序执行? 乱序存在的条件 this对象的溢出 原子性问题 如何保证原子性? synchronized 原理简介 加锁的方式 那么问题来了,JVM是如何知道当前…