本文分享自华为云社区《深入理解K8s-Pod的意义和原理》,作者:breakDawn。

在Kubernetes概念中,有以下五种概念:

  • 容器container:镜像管理的最小单位
  • 生产任务Pod:容器组,资源调度最小单位
  • 节点Node:对应集群中的单台机器,是硬件单元的最小单位
  • 集群Cluster:对应整个集 群,是处理元数据的最小单位
  • 集群联邦Federation:对应多个集群,是满足跨可用区域多活、跨地域容灾的要求

其中Pod的概念是随Kubernetes一起推出的。

Kubernetes项目是基于Borg系统的经验和设计理念创建的,其中Pod的概念就是一个关键部分。因此,可以说Pod是从2014年6月Kubernetes项目发布之初就存在的。当我们要理解Pod时,就需要先理解为什么需要Pod这个概念。

单容器单应用的原因

假设你有一个高流量的Web应用服务器,需要详细记录访问和错误日志。同时,你希望实时处理这些日志,例如进行分析、监控或立即警报异常情况。你会将应用服务器和日志代理服务作为两个进程, 但此时你需要思考,我能否将这2个进程放在一个容器中,例如写成下面这样的dockerfile:

FROM python:3.8

# 安装依赖

RUN pip install xxxxx

# 复制文件

COPY web_service.py /web_service.py

COPY log_processor.py /log_processor.py

# 启动脚本,同时运行web服务和日志处理(不推荐)

CMD python /web_service.py & python /log_processor.py

这是项目初期常见的方式,可能为了快速开发日志特性,直接就在一个dockefile里搞了。

但这是不推荐的实践。

首先,dockerfile只允许一个entrypoint。

这个“entrypoint”是一个指定的命令或脚本,这个命令或脚本在容器启动时运行,并且成为容器中的第一个进程(即PID为1的进程)。在Docker的设计中,每个容器通常运行一个主要的应用或服务,而这个应用或服务就是通过entrypoint启动的。

同时,容器中,PID为1的进程是当你运行一个容器时由Dockerfile中的ENTRYPOINT或CMD指令指定的进程。这个进程在容器的生命周期内扮演类似于init进程的角色。如果PID为1的进程终止,Docker知道容器已经完成了它的工作或因为某种原因失败了,然后Docker可以决定是重启容器还是简单地记录其退出状态。

基于以上两点,容器只能默认监控主进程(PID为1)的状态来决定是否需要重启容器。

此时如果第二个日志进程出问题了,在你未进行特制的健康处理时,是无法感知该状态,也无法让调度系统重新拉起这个容器。

因此为了容器监测的有效性,优选策略是始终保持单容器单应用的特点,一个应用做成一个容器。

空间共享,高效通信

上面那个例子的另一个问题在于,如果跨界点分配这2个容器, 会有什么后果?

一个是会产生网络延迟和带宽,因为两个节点之间的通信会经过网络,这会增加延迟。对于日志收集这样频繁的操作,即使是微小的延迟也会累积成显著的性能损失。

其次是数据一致性。网络问题可能导致日志数据在传输过程中丢失,特别是在没有适当可靠性保证的系统中。或者因为节点时间同步问题,导致日志记录与实际事件之间出现时间上的不一致。

所以我们必须要求这2个容器一定分配要在同一个节点

因此,POD的概念就出现了。他用于封装2个容器,并始终保证调度到同一个节点上。

除了数据文件的读取和写入,同POD内的2个容器也支持基于操作系统的信号通信(不经过网络),则需要这2个容器依赖相同的IPC名称空间。

总之pod能共享以下内容:

  • UTS名称空间:所有容器都有相同的主机名和域名
  • 网络名称空间:所有容器都共享一样的网卡、网络栈、IP地址等。同一个Pod中容器占用的端口不能冲突
  • IPC名称空间:可以用信号量或者POSIX共享内存
  • 时间名称空间: 共享相同的系统时间

    注:但POD中PID名称空间和文件名称空间仍然是隔离的。

POD共享空间的原理

上面提到的POD能供共享名称空间,其能力是通过pause容器实现的。

Pause容器通常是一个非常小的容器镜像。它的主要任务是执行一个永久“暂停”操作,因此它不会消耗很多资源,同时也是每个Pod的第一个启动的容器。

Pause容器作为持续运行的进程,为Pod中的其他容器提供了一个共同的父进程。这使得所有的容器都可以共享同一个网络命名空间(即它们都可以看到相同的网络接口和IP地址等)和IPC命名空间

虽然它大部分时间处于暂停状态,Pause容器在Pod的生命周期中充当了状态传递和协调的角色。比如,在重新启动或移除Pod时,它协助协调和维护状态一致性。

点击关注,第一时间了解华为云新鲜技术~

一文带你深入理解K8s-Pod的意义和原理的更多相关文章

  1. 一文带你深入理解JVM,看完之后你还敢说你懂JVM吗?颠覆you认知

    前言 今天带大家深入理解JVM,从入门到精通,希望大家能够喜欢~~~ 概念 JVM是可运行 Java 代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域 ...

  2. 一文带你彻底理解Linux的各种终端类型及概念

    每天使用Linux每天都要接触到Bash,使用Bash时似乎永远都让人摸不着头脑的概念就是终端,坐在这台运行着Linux的机器的显示器前面,这个显示器就是终端的输出,而插在机器上的USB键盘或者PS/ ...

  3. 一文带你彻底理解 JavaScript 原型对象

    一.什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承. 1.1 函数的原型对象 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那 ...

  4. 一文带你深入了解 Redis 的持久化方式及其原理

    Redis 提供了两种持久化方式,一种是基于快照形式的 RDB,另一种是基于日志形式的 AOF,每种方式都有自己的优缺点,本文将介绍 Redis 这两种持久化方式,希望阅读本文后你对 Redis 的这 ...

  5. Istio是啥?一文带你彻底了解!

    原标题:Istio是啥?一文带你彻底了解! " 如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 Istio,并且知道它和 Service Mesh 有着牵扯. 这篇文章可以作为了解 ...

  6. 【转帖】Istio是啥?一文带你彻底了解!

    Istio是啥?一文带你彻底了解! http://www.sohu.com/a/270131876_463994 原始位置来源: https://cizixs.com 如果你比较关注新兴技术的话,那么 ...

  7. 带你深入理解STL之Vector容器

    C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. ST ...

  8. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  9. 一文带您了解5G的价值与应用

    一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...

  10. 一文带你了解elasticsearch

    一文带你了解elasticsearch cxf2102100人评论160人阅读2019-07-02 21:31:36   elasticsearch es基本概念 es术语介绍 文档Document ...

随机推荐

  1. 「codeforces - 1481F」AB Tree

    link. 理一下逻辑,主要讲一下我做题时的疑惑和其它题解没提到的细节. 首先容易看到,一个必然不劣的贪心策略是把尽量靠近根的层铺成同样的字符.也许会有疑惑,字符串是否本质不同的判定每个位置地位相等. ...

  2. Modbus动态链接库供多语言使用 | Go

    Modbus协议控制动态链接库 应用场景 基于各门语言都有各自的modbus协议库,且良莠不齐,而且在具体的框架下可能存在版本依赖问题, 而且对modbus协议存在比较多的细节处理,可以查看modbu ...

  3. .NET周刊【9月第3期 2023-09-17】

    国内文章 在.NET 8 RC1 版本中 MAUI.ASP.NET Core 和 EF8 的新特性 https://www.cnblogs.com/shanyou/p/17698428.html 从年 ...

  4. 洛谷题解 | AT_abc321_c Primes on Interval

    目录 题目翻译 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 样例 #3 样例输入 #3 样例输出 #3 题目简化 题目思路 A ...

  5. 本计划在 .NET 8 中推出的 WASI 推迟到 .NET 9

    本计划在 .NET 8 中推出的 WASI  已推迟到 .NET 9,请参阅 Github 上的 WASI 跟踪问题. 在.NET 8 Preview 4 开始支持生成与 WASI 兼容的 .wasm ...

  6. 这款 7k Star 的国产监控系统,真不错!

    我们都知道天下没有"永不宕机"的系统,但每次线上出问题都要拉出一个程序员"祭天".所以一款靠谱.好用的监控工具就显得十分重要,它可以在生产环境出故障的第一时间发 ...

  7. struct 结构体【GO 基础】

    〇.前言 虽然 Go 语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念,但是可以通过结构体的内嵌,再配合接口,来实现面向对象,甚至具有更高的扩展性和 ...

  8. CF1352D

    题目简化和分析: 这题可以直接按照题意进行模拟,当然有些细节需要注意. 翻译的不足:这里的回合指任意一个人吃掉都算,而不是双方一个回合,最后一个人即使不满足也算一个回合. 我们可以采用两个指针模拟两个 ...

  9. DPDK丢包那些事

    本文来自博客园,作者:T-BARBARIANS,博文严禁转载,转载必究! 一.前言 DPDK技术原理相关的文章不胜枚举,但从实战出发,针对DPDK丢包这一类问题进行系统分析的文章还是凤毛麟角. 刚好最 ...

  10. [ABC212E] Safety Journey 题解

    Safety Journey 题目大意 给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量: \(A\) 的长度为 ...