前言

【译】What are Kubernetes Pods Anyway?最近看到了一条关于Kubernetes Pods的推特,来自了不起的Amy Codes(我真的希望这是她的真名):

虽然不是100%准确(容器并不是一个真正的东西。我们将在稍后讨论这个东东)不过它确实指出了一个令人惊奇的事实。看来确实有必要探讨一下pod和容器到底是什么。关于Pods,Kubernetes文档提供了对Pods最好、最完整的解释,但它是用非常一般的意义编写的,使用了很多术语。但我还是建议你好好读读它,因为它比我能写的解释更好、更正确。为官方文档打call!!

是容器,也不是容器

许多人已经知道Linux“容器”并不是真实存在的。Linux中没有所谓的“容器”。众所周知,容器使用了Linux内核中的两个特性(命名空间和cgroups)来执行的普通进程。命名空间允许我们为进程提供一个“视图”,该视图将所有内容隐藏在这些命名空间之外,从而为进程提供自己的运行环境。这使得进程无法看到或干扰其他进程。这里所说的命名空间包括一下几部分:

  • 主机名
  • 进程id
  • 文件系统
  • 网络接口
  • 进程间通信(IPC)

虽然我在上面说过,在命名空间中运行的进程不能干扰其他进程,但事实并非如此。一个进程可以使用它所运行的物理机器上的所有资源,从而使其他进程无法获得资源。为了限制这一点,Linux有一个称为cgroups的特性。进程可以像在命名空间中一样在cgroup中运行,但是cgroup限制了进程可以使用的资源。这些资源包括CPU、RAM、块I/O、网络I/O等。CPU可以被限制到毫核(一个核的千分之一)或RAM字节级别。进程本身可以正常运行,但是它只能使用cgroup允许的CPU数量,如果超过cgroup上设置的内存限制,就会出现out-of-memory错误。有很多关于命名空间和cgroups的资料可以帮助我们了解更多关于命名空间和cgroups的信息,这里有几个很好的例子:

What even is a container: namespaces and cgroups
https://jvns.ca/blog/2016/10/10/what-even-is-a-container/
Cgroups, namespaces, and beyond: what are containers made from?
https://www.youtube.com/watch?v=sK5i-N34im8(这哥们口音有点难懂)

这里我想指出的是,cgroups和每种命名空间类型都是拥有一些独立的特性。上面列出的一些命名空间可以被使用,也可以完全不使用。我们只能使用cgroups或任意两种其他命名空间的组合(当然仍可以使用命名空间,cgroups只是根命名空间,但无所谓)。命名空间和cgroups也可以作用于一组进程上。您使用一个命名空间运行多个进程。这样他们就能看到彼此并相互影响。或者可以在一个单独的cgroup中运行它们,这样,进程将一起在特定数量的CPU和RAM中运行。

组合中的组合

当您正常使用Docker运行容器时,Docker为每个容器创建命名空间和cgroups,容器和命名空间会一一映射。开发人员通常是这样看待容器的。

容器

这些容器本质上是独立的仓库,只是它们可能有一个映射到主机的卷或端口映射到主机上,以便它们互相可以进行通信。此外,使用一些额外的命令行参数,我们也可以使用一个命名空间来组合Docker容器。首先,先创建一个nginx容器。

 $ cat <<EOF >> nginx.conf
> error_log stderr;
> events { worker_connections 1024; }
> http {
> access_log /dev/stdout combined;
> server {
> listen 80 default_server;
> server_name example.com www.example.com;
> location / {
> proxy_pass http://127.0.0.1:2368;
> }
> }
> }
> EOF
$ docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 nginx

接下来再运行一个 ghost 容器,但这次我们加一些额外的参数,让 ghost容器 共享 nginx 容器的命名空间。

docker run -d --name ghost --net=container:nginx --ipc=container:nginx --pid=container:nginx ghost

现在 nginx 容器可以将本地的访问请求转发到ghost容器。比如我们访问 http://localhost:8080/,就会访问到 ghost 主页。这些创建 docker 容器的选项创建了一组运行在同一个命名空间的容器。这个命名空间允许 docker 容器发现并与其他容器互相通信。

Pod也是容器

现在我们已经可以将命名空间和cgroups与多个进程结合起来,这也正是Kubernetes Pods的功能。Pods允许我们指定要运行的容器,Kubernetes自动以正确的方式设置命名空间和cgroups。当然kubernetes pod会比这稍微复杂一些,因为Kubernetes不使用Docker网络(它使用CNI)。

一旦我们以这种方式设置容器,每个进程都像是在同一台机器上运行。它们可以在localhost上相互通信,可以使用共享卷。它们甚至可以使用IPC或互相发送HUP或TERM之类的信号(在Kubernetes 1.7中共享PID命名空间,Docker >=1.13)。假设这时现在我们想要运行nginx, 并使用cond更新nginx配置,并在您添加/删除应用程序服务器时重启nginx。假设我们还有一个etcd服务器,它保存后端应用程序服务器的IP地址。当列表发生变化时,cond可以得到一个通知并写出一个新的nginx配置,并向nginx发送一个HUP信号,让nginx重新加载它的配置。

如果使用Docker这种方式,我们将nginx和cond都放在一个容器中。但因为Docker只能设置一个ENTRYPOINT,所以我们需要使用监控进程来保持两个进程都运行。这种方式并不理想,因为我们需要为运行的每个nginx副本运行监管。但关键是Docker只能看到监控进程。它对每个进程并没有可见性,这意味着您和其他工具无法通过Docker API获得该信息。Nginx可能会崩溃,但Docker并不知道。

Kubernetes通过pods资源可以管理每个进程,从而洞察其状态。通过这种方式,它可以通过API向用户提供关于该pod状态的信息,还可以提供服务,比如在它崩溃时重新启动它或自动记录日志。

Pod容器作为API

通过将容器组合到Pods中的方式,我们可以在Pod中创建一些容器,并作为“API”添加到Pods中供其他人使用。这不是一般意义上类似于Web API的API,而是其他pod可以使用的抽象入口。例如,以nginx + confd为例。在这个例子中,condfd对nginx过程一无所知。它只知道需要监视etcd中的值并向进程发送HUP信号或运行命令。这个应用程序不一定是nginx。它可以是任何一种应用。通过这种方式,您可以使用condfd容器镜像和配置,并将其与任意数量的不同类型的pod进行搭配。我们还可以考虑使用其他类型的抽象。像istio这样的服务网格可以作为sidecars上,提供服务路由、遥测和策略执行,而不需要更改主应用程序。我们也可以使用多个sidecar。例如,同时使用condfd sidecar和istio sidecar。应用程序可以通过这种组合方式来构建更加复杂和可靠的系统,同时让每个应用程序相对简单。

Kubernetes学习总结(11)—— Kubernetes Pod 到底是什么?相关推荐

  1. 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard

    笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...

  2. Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob

    1.资源元信息 Kubernetes的资源对象组成:主要包括了Spec.Status两部分.其中Spec部分用来描述期望的状态,Status部分用来描述观测到的状态 Kubernetes的元数据部分. ...

  3. Kubernetes学习(六)—— Pod控制器

    本章节主要介绍常用的Pod控制器. 1. Pod控制器介绍 在kubernetes中,按照pod的创建安方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的pod,这种pod删除后 ...

  4. KCNA考试 第五章:kubernetes学习实践

    文章目录 1. 简介 2. 学习目标 3. Kubernetes对象 4. 与Kubernetes交互 4.1 Demo: kubectl 5. Pod 概念 5.1 Demo: Pods 6. 负载 ...

  5. 云原生入门 第五章:kubernetes学习实践

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  6. Kubernetes学习前的必知知识点

    Table of Contents DevOps详解 到底该如何理解DevOps 持续集成,持续交付,持续部署(CI/CD)简介 在有关微服务.DevOps.Cloud-native.系统部署等的讨论 ...

  7. Kubernetes学习笔记【2年以前的笔记】

    Kubernetes学习笔记 知识储备 熟悉linux基础命令 熟悉docker的基本原理和操作 了解ssl证书工作原理 了解负载均衡工作原理(L4/L7) 了解分布式概念 了解域名解析原理 了解网络 ...

  8. Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群

    一.问题分析 本质上来说在 k8s 上部署一个 redis 集群和部署一个普通应用没有什么太大的区别,但需要注意下面几个问题: Redis 是一个有状态应用:这是部署 redis 集群时我们最需要注意 ...

  9. Kubernetes学习之路目录

    Kubernetes基础篇 环境说明 版本说明 系统环境 Centos 7.2 Kubernetes版本 v1.11.2 Docker版本 v18.09 Kubernetes学习之路(一)之概念和架构 ...

  10. Kubernetes学习-K8S安装篇-Kubeadm安装高可用K8S集群

    Kubernetes学习-K8S安装篇-Kubeadm高可用安装K8S集群 1. Kubernetes 高可用安装 1.1 kubeadm高可用安装k8s集群1.23.1 1.1.1 基本环境配置 1 ...

最新文章

  1. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名
  2. scala构建工具sbt使用介绍
  3. ASP.net:添加.net(2.0C#)FCKeditor在线编辑器步骤
  4. 全长转录组之基因和转录本鉴定
  5. 编程基本原则——避免冗余代码
  6. 处理多维度变化——桥接模式
  7. 学习笔记(05):Python网络编程并发编程-基于socket实现简单套接字通信
  8. 计算机专业871,北科大计算机871经验帖
  9. Redis开源文档《Redis设计与实现》
  10. hibernate中实体类对象的四种状态
  11. DevExpress之ChartControl用法
  12. 大学python笔记整理_python 笔记整理
  13. 百德科技专业定制软件开发
  14. html用js连接sql,如何从浏览器中的JavaScript连接到SQL Server数据库?
  15. 浪涌测试仪的工作原理
  16. (一百三十七)梳理fragment的isAdded
  17. 国外无限php空间,关于无限空间和美国PHP主机不限制流量存储的认知
  18. 适合化工厂人员定位技术浅析,化工厂人员室内定位--新导智能
  19. 2023最新支付宝微信运动步数网页源码+附带原始接口
  20. (转)如何彻底的卸载anaconda(包括配置文件)

热门文章

  1. 什么时候不选择mysql_MySQL请选择合适的列_MySQL
  2. windows winrar 指令_Windows上WinRAR.exe命令行参数说明(转载) .
  3. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
  4. byte 类型比较_Java Grammar:数据类型
  5. textfield获取其中内容_冲压工艺流程,常见冲压缺陷及消除方法,46页内容全面介绍冲压...
  6. easypoi导入合并单元格_1分钟不到就能合并100个Excel工作表,这功能太强大了!...
  7. android progressbar 自定义圆形旋转图片,Android progressBar 自定义圆形旋转图片
  8. python ssh模块stdout.read 和recv_paramiko SSH 模块简单应用。
  9. linux无法将文件移入回收站,linux中使用rm命令将文件移到回收站的方法
  10. java怎么预加载字典值,有选择地显示预加载内容提高网站的性能