深入剖析Kubernetes之Pod的实现原理

news2024/11/15 17:20:29

文章目录

    • 概述
    • Pod 的实现原理
    • 容器设计模式
    • 容器与虚拟机

Pod 的本质:Pod,实际上是在扮演传统基础设施里“虚拟机”的角色;而容器,则是这个虚拟机里运行的用户程序。

概述

  • 容器,就是未来云计算系统中的进程;容器镜像就是这个系统里的“.exe”安装包。那么 Kubernetes 呢?Kubernetes 就是操作系统!
  • 登录到一台 Linux 机器里,执行一条如下所示的命令:pstree -g
  • 这条命令的作用,是展示当前系统中正在运行的进程的树状结构。它的返回结果如下所示:

在这里插入图片描述

  • 在一个真正的操作系统里,进程并不是“孤苦伶仃”地独自运行的,而是以进程组的方式,“有原则地”组织在一起。
    • 比如,这里有一个叫作 rsyslogd 的程序,它负责的是 Linux 操作系统里的日志处理。可以看到,rsyslogd 的主程序 main,和它要用到的内核日志模块 imklog 等,同属于 1632 进程组。这些进程相互协作,共同完成 rsyslogd 程序的职责。
  • Kubernetes 项目所做的,其实就是将“进程组”的概念映射到了容器技术中,并使其成为了这个云计算“操作系统”里的“一等公民”。Kubernetes 项目之所以要这么做的原因,在 Borg 项目的开发和实践过程中,工程师们发现,部署的应用,往往都存在着类似于“进程和进程组”的关系。更具体地说,就是这些应用之间有着密切的协作关系,使得它们必须部署在同一台机器上。
  • **容器间的紧密协作,我们可以称为“超亲密关系”。**这些具有“超亲密关系”容器的典型特征包括但不限于:互相之间会发生直接的文件交换、使用 localhost 或者 Socket 文件进行本地通信、会发生非常频繁的远程调用、需要共享某些 Linux Namespace(比如,一个容器要加入另一个容器的 Network Namespace)等等。

Pod 的实现原理

  • 首先,关于 Pod 最重要的一个事实是:它只是一个逻辑概念。
    • Kubernetes 真正处理的,还是宿主机操作系统上 Linux 容器的 Namespace和 Cgroups,而并不存在一个所谓的 Pod 的边界或者隔离环境。
    • 那么,Pod 又是怎么被“创建”出来的呢?Pod,其实是一组共享了某些资源的容器。

Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume。

  • 一个有 A、B 两个容器的 Pod,不就是等同于一个容器(容器 A)共享另外一个容器(容器 B)的网络和 Volume 的玩儿法么?

    • 这好像通过 docker run --net --volumes-from 这样的命令就能实现嘛,比如:

      docker run --net=B --volumes-from=B --name=A image-A ...
      
    • 如果真这样做的话,容器 B 就必须比容器 A 先启动,这样一个Pod 里的多个容器就不是对等关系,而是拓扑关系了。

  • 在 Kubernetes 项目里,Pod 的实现需要使用一个中间容器,这个容器叫作 Infra 容器。在这个 Pod 中,Infra 容器永远都是第一个被创建的容器,而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。这样的组织关系,可以用下面这样一个示意图来表达:
    在这里插入图片描述

  • 如上图所示,这个 Pod 里有两个用户容器 A 和 B,还有一个 Infra 容器。很容易理解,在Kubernetes 项目里,Infra 容器一定要占用极少的资源,所以它使用的是一个非常特殊的镜像,叫作:k8s.gcr.io/pause。这个镜像是一个用汇编语言编写的、永远处于“暂停”状态的容器,解压后的大小也只有 100~200 KB 左右。而在 Infra 容器“Hold 住”Network Namespace 后,用户容器就可以加入到 Infra 容器的 Network Namespace 当中了。所以,如果你查看这些容器在宿主机上的 Namespace文件,它们指向的值一定是完全一样的。

  • 对于 Pod 里的容器 A 和容器 B 来说:

    • 它们可以直接使用 localhost 进行通信;
    • 它们看到的网络设备跟 Infra 容器看到的完全一样;
    • 一个 Pod 只有一个 IP 地址,也就是这个 Pod 的 Network Namespace 对应的 IP 地
      址;
    • 当然,其他的所有网络资源,都是一个 Pod 一份,并且被该 Pod 中的所有容器共享;
    • Pod 的生命周期只跟 Infra 容器一致,而与容器 A 和 B 无关。
    • 同一个 Pod 里面的所有用户容器来说,它们的进出流量,也可以认为都是通过 Infra 容器完成的。

将来如果你要为 Kubernetes 开发一个网络插件时,应该重点考虑的是如何配置这个 Pod 的 Network Namespace,而不是每一个用户容器如何使用你的网络配置,这是没有意义的。

容器设计模式

Pod 这种“超亲密关系”容器的设计思想,实际上就是希望,当用户想在一个容器里跑多个功能并不相关的应用时,应该优先考虑它们是不是更应该被描述成一个 Pod 里的多个容器。

第一个最典型的例子是:WAR 包与 Web 服务器。

  • 现在有一个 Java Web 应用的 WAR 包,它需要被放在 Tomcat 的 webapps 目录下运行起来。
  • 我们可以把 WAR 包和 Tomcat 分别做成镜像,然后把它们作为一个 Pod 里的两个容器“组合”在一起。这个 Pod 的配置文件如下所示:
apiVersion: v1
kind: Pod
metadata:
 name: javaweb-2
spec:
 initContainers:
 - image: geektime/sample:v2
 name: war
 command: ["cp", "/sample.war", "/app"]
 volumeMounts:
 - mountPath: /app
 name: app-volume
 containers:
 - image: geektime/tomcat:7.0
 name: tomcat
 command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
 volumeMounts:
 - mountPath: /root/apache-tomcat-7.0.42-v2/webapps
 name: app-volume
 ports:
 - containerPort: 8080
 hostPort: 8001
 volumes:
 - name: app-volume
 emptyDir: {}
  • WAR 包容器的类型不再是一个普通容器,而是一个 InitContainer 类型的容器。在 Pod 中,所有 Init Container 定义的容器,都会比 spec.containers 定义的用户容器先启动。并且,Init Container 容器会按顺序逐一启动,而直到它们都启动并且退出了,用户容器才会启动。
  • 等 Tomcat 容器启动时,它的 webapps 目录下就一定会存在 sample.war 文件:这个文件正是 WAR 包容器启动时拷贝到这个 Volume 里面的,而这个 Volume 是被这两个容器共享的。
  • 用一种“组合”方式,解决了 WAR 包与 Tomcat 容器之间耦合关系的问题。实际上,这个所谓的“组合”操作,正是容器设计模式里最常用的一种模式,它的名字叫:sidecar。顾名思义,sidecar 指的就是我们可以在一个 Pod 中,启动一个辅助容器,来完成一些独立于主进程(主容器)之外的工作。

第二个例子,则是容器的日志收集

  • 现在有一个应用,需要不断地把日志文件输出到容器的 /var/log 目录中。
    • 可以把一个 Pod 里的 Volume 挂载到应用容器的 /var/log 目录上。然后,在这个 Pod 里同时运行一个 sidecar 容器,它也声明挂载同一个 Volume 到自己的 /var/log 目录上。
    • 这样,接下来 sidecar 容器就只需要做一件事儿,那就是不断地从自己的 /var/log 目录里读取日志文件,转发到 MongoDB 或者 Elasticsearch 中存储起来。这样,一个最基本的日志收集工作就完成了。

Pod 的另一个重要特性是,它的所有容器都共享同一个 NetworkNamespace。这就使得很多与 Pod 网络相关的配置和管理,也都可以交给 sidecar 完成,而完全无须干涉用户容器。这里最典型的例子莫过于 Istio 这个微服务治理项目了。

容器与虚拟机

  • 直到现在,仍有很多人把容器跟虚拟机相提并论,他们把容器当做性能更好的虚拟机,喜欢讨论如何把应用从虚拟机无缝地迁移到容器中。
  • 但实际上,无论是从具体的实现原理,还是从使用方法、特性、功能等方面,容器与虚拟机几乎没有任何相似的地方;也不存在一种普遍的方法,能够把虚拟机里的应用无缝迁移到容器中。 因为,容器的性能优势,必然伴随着相应缺陷,即:它不能像虚拟机那样,完全模拟本地物理机环境中的部署方法。
  • 实际上,一个运行在虚拟机里的应用,哪怕再简单,也是被管理在 systemd 或者supervisord 之下的一组进程,而不是一个进程。这跟本地物理机上应用的运行方式其实是一样的。这也是为什么,从物理机到虚拟机之间的应用迁移,往往并不困难。
  • 可是对于容器来说,一个容器永远只能管理一个进程。更确切地说,一个容器,就是一个进程。这是容器技术的“天性”,不可能被修改。所以,将一个原本运行在虚拟机里的应用,“无缝迁移”到容器中的想法,实际上跟容器的本质是相悖的。

你知道的越多,你不知道的越多。

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

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

相关文章

CSDN编程题-每日一练(2023-08-26)

CSDN编程题-每日一练(2023-08-26) 一、题目名称:排查网络故障二、题目名称:贪食四人帮三、题目名称:阿波罗的魔力宝石 一、题目名称:排查网络故障 时间限制:1000ms内存限制:256M 题目…

一文彻底告别 C盘 红色风景线

前言 想必使用 Windows 的用户肯定遇到过 C盘 爆满的问题吧,感觉平时我们也没有怎么使用 C盘 ,但是 C盘 却总是慢慢成长,最后留给我们的就是一道靓丽的红色风景线。不过不用担心,相信读完本文后,在座的各位都可以永久…

精选6个C++项目,推荐新人练手首选!

无论做什么项目,在写简历时,最好要整理出项目中的技术点,思考如何跟面试官介绍你的项目,要经得起面试官的提问。项目的话,可以考虑做下面的这几个: 如果你想给自己的简历增加C 项目经验,以下提供一些方向指…

【C++奇遇记】函数模板

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…

高效PDF校对:释放高质量内容的力量

在数字化世界中,内容是王者。随着企业和个人越来越依赖数字文档进行沟通、分享和创新,我们在PDF中传递的内容的质量变得至关重要。在这里,我们将探索高效的PDF校对如何帮助您释放高质量内容的真正潜力。 超越仅仅是“正确” 当我们谈论PDF校…

MBR400100CT-ASEMI肖特基模块400A 100V

编辑:ll MBR400100CT-ASEMI肖特基模块400A 100V 型号:MBR400100CT 品牌:ASEMI 封装:M2 恢复时间:>50ns 正向电流:400A 反向耐压:100V 芯片个数:2 引脚数量&…

Leetcode77. 组合

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 回溯剪枝 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<List<Integer>> combine(int n, i…

展锐A13 Camera Hal dispatch模块流程 --- 上

4月份就知道展锐A13的Camera Hal有大的变动&#xff0c;但是最近一直在做一个MTK的项目&#xff0c;没去看这个新增部分的流程。最近有时间&#xff0c;就把A13上Camera Hal新增的部分流程捋 了一下&#xff0c;过程是痛苦的&#xff0c;但是坚持一遍遍去读代码&#xff0c;在结…

移动,电信,联通流量卡该怎么选?

是电信便宜&#xff0c;移动稳定&#xff0c;还是联通性价比高&#xff1f; ​ 今天&#xff0c;小编从三大流量卡的优缺点方面来讲&#xff0c;教你如何选择流量卡了。 一、移动流量卡 优点&#xff1a;信号好&#xff0c;可以说走到什么地方都有信号。 缺点&#xff1a;资…

Leaflet开发入门

Leaflet开发入门 开发环境配置Leaflet开发库开发移动端Hybrid App或移动Web App 开发环境配置 电子地图已经渗透到O2O、生活服务、出行等领域&#xff0c;传统的GIS也孕育着互联网基因。在国内互联网电子地图领域&#xff0c;百度地图和高德地图较为出色&#xff0c;天地图作为…

js的使用之时间如何定义,窗口加载事件

1.时间如何定义 1.1 date的其他的属性 带出星期几的写法 var arr [星期日,星期一,星期二,星期三,星期四,星期五,星期六,星期天] var day date.getDay(); console.log(arr[day]); 1.2 日期的格式化 1.3 时分秒的写法 固定写法&#xff1a;如果想要写成00:00:00这种形式&am…

阿里云服务器搭建FRP实现内网穿透-P2P

前言 在了解frp - p2p之前&#xff0c;请先了解阿里云服务器搭建FRP实现内网穿透-转发: 文章地址 1、什么是frp - p2p frp&#xff08;Fast Reverse Proxy&#xff09;是一个开源的反向代理工具&#xff0c;它提供了多种功能&#xff0c;包括端口映射、流量转发和内网穿透等。…

cmake 交叉编译应用程序:手动设置链接脚本

前言 在使用 cmake 交叉编译应该应用程序时&#xff0c;好像没有手动设置【链接脚本】&#xff0c;也能正常构建生成 Makefile&#xff0c;并且可以正常 Make 生成需要的 应用程序。 但是有些应用程序&#xff0c;需要手动指定【链接脚本】&#xff0c;比如修改链接地址&#…

五、多表查询-5.自连接

一、语法 二、演示-自连接&#xff08;内连接&#xff09; 【例】查询员工 及其 所属领导的名字&#xff08;managerid&#xff0c;领导也是员工表emp1表中的数据&#xff09; &#xff01;&#xff01;必须起别名&#xff01;&#xff01; ——内连接只查询交集部分的数据 …

微调真香,漫画科技博主竟然在用国产大模型生成系列漫画女主角

有一说一&#xff0c;《微调真香&#xff0c;漫画科技博主竟然在用国产大模型生成系列漫画女主角》不是标题党。 连我也不得不相信&#xff0c;作为“亲爱的数据”创始人&#xff0c;我确实在用人工智能大模型生成自家特有风格的漫画。 市面上&#xff0c;海内外&#xff0c;用…

HAproxy服务及keepalived+haproxy高可用

本节主要学习AHproxy 的概述&#xff0c;安装&#xff0c;调度算法&#xff0c;配置文件&#xff0c;负载均衡&#xff0c;配置syslog日志&#xff0c;keepalivedhaproxy实现高可用。 目录 一、概述 1、简介 2、核心功能 3、关键特性 4、应用场景 二、安装 1.内核配置 …

【附安装包】Marvelous designer12|3D服装设计

软件下载 软件&#xff1a;Marvelous designer版本&#xff1a;12语言&#xff1a;简体中文大小&#xff1a;1.49G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://p…

X(推特)推出招聘平台,马斯克进军招聘领域,欲对标 LinkedIn

8 月 26 日&#xff0c;埃隆・马斯克接手 X&#xff08;推特&#xff09;后&#xff0c;开启了一系列备受争议的变革&#xff0c;并多次在公开场合表示希望将 X 打造成为超级应用&#xff0c;受人瞩目。除了私信中推出了视频聊天和语音聊天功能之外&#xff0c;X 在今天宣布上线…

无涯教程-机器学习 - 数据加载

假设如果要启动ML项目&#xff0c;那么您需要做的第一件事也是最重要的事情是什么?这是无涯教程启动任何ML项目都需要加载的数据。关于数据&#xff0c;对于ML项目&#xff0c;最常见的数据格式是CSV(逗号分隔值)。 基本上&#xff0c;CSV是一种简单的文件格式&#xff0c;用…

网络字节序——TCP接口及其实现简单TCP服务器

网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版&#xff1a;客户端串行版2. 多进程版&#xff1a;客户端并行版netstat查看网络信息3.多线程版&#xff1a;并行执行log.hpp 守护进程fg、bg s…