[Kubernetes]Pod基本概念

  Pod是Kubernetes项目的原子调度单位

为什么需要Pod?

  容器是未来云计算系统中的进程,容器镜像就是这个系统里的".exe"安装包,那Kubernetes就是操作系统。

  在一个真正的操作系统里,进程不是独自运行的,而是以进程组的方式组织在一起。对操作系统来说,进程组更方便管理,比如Linux只要将信号SIGKILL信号发送给一个进程组,那么该进程组中的所有进程都会收到这个信号而终止运行。

  可以通过下面这个命令查看进程组,进程后面括号里的数字就是它的进程组ID(process group ID)

$ pstree -g

  这里有一个叫rsyslogd的程序,它负责的是Linux操作系统里的日志处理,由三个进程组成:一个imklog模块,一个imuxsock模块,一个rsyslogd自己的main函数主进程。这三个进程一定要运行在同一台机器上,否则它们之间基于Socket的通信和文件交换都会出现问题。

  那现在如果把rsyslogd这个应用容器化,受限于容器的“单进程模型”(不是指容器里只能运行一个进程,而是指容器没有管理多个进程的能力),这三个模块必须被分别制作成是哪个不同的容器。在这个三个容器运行的时候,它们的设置的内存配额都是1GB。

  假设现在kubernetes集群上有两个节点,node1上有3GB内存可用,node2上有2.5GB内存可用。这是假设用Docker Swarm来运行这个程序,为了让这个是三个容器都运行在同一台机器上,就必须在另外两个容器上设置一个affinity=main(与main容器有亲密性)的约束(即它们两个必须与main容器运行在同一台机器上)。然后顺序执行:“docker run main”,"docker run imkloh","docker run imuxsock",创建这三个容器,这三个容器会进入Swarm的待调度队列。然后main容器和imklog容器都出队并被调度到node2上,那当imuxsock出队时,Swarm就懵了,node2仅有0.5GB了,并不足以运行imuxsock容器。

  上面就是一个典型的成组调度(gang scheduling)没有被妥善处理的例子

  但是在Kubernetes中,Pod是原子调度单位,这就意味着Kubernetes的项目调度器是统一按照Pod而非容器的资源需求进行计算的。

  所以像imklog、imuxsock和main函数这是三个容器将组成一个Pod,这样kubernetes项目在调度时,自然就会选择内存等于3GB的node1节点进行绑定。

  像容器这样的紧密协作,可以称为“超亲密关系”,这些具有超亲密关系的容器的典型特征包括但不限于:互相之间会发生直接的文件交换,使用localhost或者Socket文件进行本地通信、会发生非常频繁的远程调用,需要共享某些Linux Namespace。

  但是也不是所有有关系的容器都属于同一个pod,例如php应用容器和MySQL虽然会发生关系,但是没有必要也不应该部署在同一台机器上,它们更适合做出两个pod。

Pod实现原理

  Pod只是一个逻辑概念,Kubernetes真正处理的还是宿主机操作系统上Linux容器的Namespace和Cgroups,而并不存在一个所谓的Pod边界或隔离环境

  Pod其实是一组共享了某些资源的容器,Pod里的所有容器,共享的是同一个Network Namespace,并且可以声明共享同一个Volume

  在Kubernetes项目里,Pod的实现需要使用一个中间容器,这个容器叫做Infra容器。在Pod中,Infra容器永远都是第一个被创建的容器,而其他用户定义的容器,则通过join Network Namespace的方式,与Infra容器关联在一起,如下图所示

  

  

原文地址:https://www.cnblogs.com/yuxiaoba/p/9694821.html

时间: 2024-08-30 13:51:49

[Kubernetes]Pod基本概念的相关文章

Kubernetes 入门之Kubernetes 的基本概念和术语

Kubernetes是什么? 他是一个全新的基于容器技术分布式架构领先方案: 他也是一个开放的开发平台: 他也是一个完备的分布式系统支撑平台: Kubernetes的基本慨念和术语 Master Kubernetes 里的Master 指的是集群控制节点,每个Kubernetes 集群里需要有一个 Master 节点负责整个集群的管理和控制,基本上Kuberneter所有的控制命令都发给它,他来负责具体的执行过程,我们后面所执行的所有命令基本上都是在Master节点上运行的.Masteer通常会

详解 Kubernetes Pod 的实现原理

Pod.Service.Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用.工作负载.网络和磁盘资源,共同定义了集群的状态.Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合. Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,想要彻底和完整的了解 Kubernetes 的实现原理,我们必须要清楚 Pod 的实现原理以及最佳实践. 在这里,我们将分两个部分对 Pod 进行解析,第一部分主要会从

Kubernetes Pod故障归类与排查方法

Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单理解为一个逻辑上的虚拟机,但并不是虚拟机). Pod被创建后用一个UID来唯一标识,当Pod生命周期结束,被一个等价Pod替代时UID将重新生成. Kubernetes Pod中最常用Docker容器运行,当然Pod也能支持其他的容器运行,比如rkt.podman等. Kubernetes集群中的P

Kubernetes Pod 控制器

在机器人技术和自动化中,控制环是一个控制系统状态的不终止的循环 这是一个控制环的例子:"房间里的温度自动调节器"当你设置了温度,告诉了温度自动调节器你的"期望状态",房间的实际温度是"当前状态".通过对设备的开关控制,温度自动调节器让其当前状态无限接近于期望状态.控制器通过 k8s的apiserver 去监控集群的公共状态,并致力于将当前状态转变为所期望的状态. 中文参考官方:怎么描述Kubernetes架构控制器的 kubernetes 之Po

Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize

追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整,这会导致的一个问题就是浏览器上可显示内容的区域太小,当查看/编辑文件时非常不便,就像下边这样,红色可视区域并没有被用到 RESIZE_CHANNEL 前文说到kubectl exec有两个参数COLUMNS和LINES可以调整tty内容窗口的大小,命令如下: kubectl exec -i -t

kubernetes(k8s) 基础概念

K8S基础概念 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubernetes的Kubelet.kube-proxy服务进程,这些服务进程负责Pod的创建.启动.监控.重启.销毁.以及实现软件模式的负载均衡. Node包含的信息: Node地址:主机的IP地址,或Node ID. Node的运行状态:Pending.Running.Terminated三种状态. Node Condition:- N

通过实例快速掌握k8s(Kubernetes)核心概念

容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流.Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词.但它在开始的时候并没有很好地解决容器的集群问题.Kubernetes抓住了这个机遇,以容器编排者(Container Orchestration)的身份出现,对容器集群进行管理和调度,现在已经打败了Docker成为了容器技术事实上的标准.当然K8s内部还是需要Docker的,但它的功能范围被大大压缩了,只是负责底层的容器引擎和镜像(Docker

Kubernetes Pod应用的滚动更新(八)

一.环境准备 我们紧接上一节的环境,进行下面的操作,如果不清楚的,可以先查看上一篇博文. 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 二.更新 我们查看一下上一节的配置文件mytest-deploy.yaml. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mytest spec: repl

kubernetes Pod 资源调度

1 概述 1 总述 API server 接受客户端提交的POD对象创建请求操作过程中,需要kube-scheduler 从当前集群中选择一个可用的最佳节点接受并运行,通常是默认调度器复制此类任务,对于每个待创建的POD来说,需要经过三个步骤.1 预选(predicate)节点预选: 基于一系列预选规则(podfitsresources 和 matchnode-selector等)对每个节点进行检查,将那些不符合条件的节点过滤.如果需要某些特殊服务,则需要通过组合节点标签,以及POD标签或标签选