第二章:pod-运行于kubernetes中的容器

本章内容包括

  • 创建、启动和停止pod
  • 使用标签组织pod和其他资源
  • 使用特定标签对所有pod执行操作
  • 使用命名空间将多个pod分到不重叠的组中
  • 调度pod到指定类型的工作节点

pod是kubernetes中最为重要的核心概念,其他对象仅仅为管理、暴露pod或被pod使用。

1 pod是什么

pod是一组并置的容器,代表了kubernetes中最基本构建模块。在实际应用中不会单独部署容器,更多的是针对一组pod的容器进行部署和操作。但这并不意味这一个pod要包含多个容器,kubernetes以pod为基本单位,所以即使一个pod中包含了多个容器,但这多个容器实际上是运行在一个node中。

1.1 为什么需要pod

为什么kubernetes需要pod?而不是直接使用容器?为什么需要同时运行多个容器?不能把所有进程都放在一个容器里面嘛?

1.1.1 为什么运行多个容器?

容器被设计为每个容器只运行一个进程(除非进程本身产生子进程),这样能保证容器和服务具有相同的生命周期,这样才能最好的应用容器编排来管理好容器和服务。如果一个容器内运行多个不相干的进程,那么kubernetes将无法很好的管理这些进程。设计每个容器只允许一个进程有以下好处:

  • 简化管理和伸缩:每个容器只运行一个应用程序,使得水平伸缩变得容易。当需要更多资源时,可以快速创建新的容器,而无需担心多个应用程序之间的相互影响。
  • 提高服用性:单个容器只运行一个应用程序,可以方便地将容器重新用于其他项目或目的,从而提高容器的复用性。
  • 简化故障排查:当容器出现故障时,开发人员可以专注于排查特定应用程序的问题,而无需对整个系统的各个部分进行排查。这有助于提高容器的可移植性和可预测性。
  • 提高应用持续生命周期管理的灵活性:升级程序时,可以将影响范围控制在更小的粒度。这有助于避免在升级某个服务时中断相同容器中的其他进程。
  • 提高安全性和隔离性:每个容器只运行一个应用程序,有助于提供更安全的服务和应用程序间的隔离。这有助于保持强大的安全状态,或遵守PCI之类的规定。

1.2 了解pod

由于不能将多个进程聚集在一个单独的容器中,所以需要一种更高级的结构来将容器绑定在一起,并将它们作为一个单元进行管理,这就是请问什么需要pod的原因。

在包含容器的pod下,我们可以同时运行一些具有超亲密度的进程,并为它们提供相同的环境。此时这些进程就好像全部运行在单个容器中一样,同时又保持着一定的隔离。这样一来就能全面利用容器所提供的特性,同时对这些进程来说它们就像运行在一个机器上一样。

1.2.1 同一pod中的部分隔离

容器与容器之间是完全隔离的,但当一组容器具有超亲密度关系的时候,我们会期望它们之间是部分隔离,而不是完全隔离。也就是隔离容器组,让每个容器组内的容器共享一些资源,而不是全部。kubernetes使用pod来使一组容器共享相同的命名空间。如以下几个命名空间:

  • UTS
  • IPC
  • NET
    新版的kubernetes也支持共享PID命名空间,但并不是默认开启的,可以通过设置pod的shareProcessNamespace的值为true来开启这个功能。

但当涉及到文件系统时,情况就变的有点不一样了。因为容器的文件系统来自容器镜像,因此在默认情况下,每个容器的文件系统与其他容器完全隔离,所以需要使用kubenetes中的volumn资源来共享文件目录。

1.2.2 pod网络

由于一个pod中的容器运行于相同的Network空间,所以一个pod中的容器共享相同的IP和端口端口空间,所以在同一个pod中运行的多个进程注意别绑定到相同的端口。

kubernetes集群中所有的pod都在同一个共享网络地址空间中,所以每个pod都可以通过其他pod的IP地址来实现相互访问。同一个集群下的pod通信是没有net(网络地址转换)的。这是通过网络插件实现的,所以不同的网络插件有不同的实现方式,但目的都是为了给pod提供一个统一的网络环境,使pod可以直接通信。

1.3 通过pod合理管理容器

由于pod比较轻量,可以让我们在几乎没有任何额外开销的情况下拥有尽可能多的pod,所以我们应该将应用持续组织到多个pod中,每个pod只保存具有超亲密度关系的容器。

1.3.1 将多层应用分散到多个pod中

在云原生架构中,我们应该尽可能的把不同的组件放到不同的pod中,并且把pod调度到不同的工作节点中,这样才能最大的利用不同节点的计算资源,提高基础架构的利用率。

另一个将不同组件放到不同pod上的考虑是kubernetes的扩缩容是基于pod的,如果将多个组件放到同一个pod中,那么扩缩容时也将把多个组件同时进行,所以当一个组件有单独扩缩容的需求时,应该把它放到一个单独的pod中。

1.3.2 何时在pod中使用多个容器

一般将具有超亲密度关系的容器放在一个pod中,例如,部署一个web应用和其日志收集器,这个时候就需要把这两个容器放在一个pod中。这也是kubernetes中常用的边车模式(siedecar)。

当需要决定多个容器是否需要存放在一个pod中时,可以根据以下问题决定:

  • 它们需要一起运行还是可以运行在不同的主机上?
  • 它们代表的时一个整体还是相互独立的组件?
  • 它们必须一起扩缩容还是可以分别进行?

基本上,除了具有超亲密度的容器,一般倾向于在单独的pod中运行单独的容器。

2 用YAML创建pod

pod和其他kubernetes资源通常时通过向kubernetes REST API提供JSON或YAML描述文件来创建的。一般来说,pod的yaml文件会包含以下几个部分:

  • apiVersion:YAMl描述文件所使用的Kubernetes API版本
  • kind:kubernetes对象资源类型
  • metadata:pod元数据,包括名称、标签、注解、命名空间等
  • spec:pod规格/内容说明,包括pod的容器列表、volume等
  • status:只读的运行时数据,pod及其内部容器的详细状态,如pod所处的条件,每个容器的描述和状态,以及内部IP和其他基本信息。一般创建时不需要指定
# kubia-manual.yaml
apiVersion: v1  # 使用v1版本的API
kind: Pod       # 描述一个pod
metadata:
  name: kubia-manual # 名字为kubia-manual
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值