• K8S之pod(十二)


    一、简介

          在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被统一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。

    二、Pod实现机制与设计模式

          每个Pod都有一个特殊的被称为"根容器"的Pause 容器(Pause容器,又叫Infrastructure容器)。 Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器。

          众所周知,容器之间是通过Namespace隔离的,Pod要想解决上述应用场景,那么就要让Pod里的容器之间高效共享。

    具体分为两个部分:网络和存储

    共享网络

          kubernetes的解法是这样的:会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其他容器看到的网络试图就完全一样了,即网络设备、IP地址、Mac地址等,这就是解决网络共享问题。在Pod的IP地址就是infra container的IP地址。

    共享存储

          比如有两个容器,一个是nginx,另一个是普通的容器,普通容器要想访问nginx里的文件,就需要nginx容器将共享目录通过volume挂载出来,然后让普通容器挂载的这个volume,最后大家看到这个共享目录的内容一样。

     三,Pod状态详解

          Pod有以下几个状态:

    Pending 等待中

    Running 运行中

    Succeeded 正常终止

    Failed 异常停止

    Unkonwn 未知状态

    Pod状态详解

    Pending

    Pod已经被创建,但还没有完成调度,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED, Modified这两个事件的产生。

    Running

    该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。

    Succeeded

    Pod中的所有的容器已经正常的执行后退出,并且不会自动重启,一般会是在部署job的时候会出现。

    Failed

    Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。

    Unkonwn

    API Server无法正常获取到Pod对象的状态信息,通常是由于其无法与所在工作节点的kubelet通信所致。

    pod从创建到成功或失败的事件

    PodScheduled

    pod正处于调度中,刚开始调度的时候,hostip还没绑定上,持续调度之后,有合适的节点就会绑定hostip,然后更新etcd数据

    Initialized

    pod中的所有初始化容器已经初启动完毕

    Ready

    pod中的容器可以提供服务了

    Unschedulable

    不能调度,没有合适的节点

    Pod状态的详细说明

    CrashLoopBackOff: 容器退出,kubelet正在将它重启

    InvalidImageName: 无法解析镜像名称

    ImageInspectError: 无法校验镜像

    ErrImageNeverPull: 策略禁止拉取镜像

    ImagePullBackOff: 正在重试拉取

    RegistryUnavailable: 连接不到镜像中心

    ErrImagePull:通用的拉取镜像出错

    CreateContainerConfigError: 不能创建kubelet使用的容器配置

    CreateContainerError: 创建容器失败

    m.internalLifecycle.PreStartContainer 执行hook报错

    RunContainerError: 启动容器失败

    PostStartHookError: 执行hook报错

    ContainersNotInitialized: 容器没有初始化完毕

    ContainersNotReady: 容器没有准备完毕

    ContainerCreating:容器创建中

    PodInitializing:pod 初始化中

    DockerDaemonNotReady:docker还没有完全启动

    NetworkPluginNotReady: 网络插件还没有完全启动

    Evicte: pod被驱赶

    四,如何创建一个pod

    五,pod与控制器关系

    1Replicaset
    Kubernetes中的副本控制器,管理Pod,使pod副本的数量始终维持在预设的个数。
    2.Deployment管理Replicaset和Pod的副本控制器,Deployment可以管理多个Replicaset,是
    比Replicaset更高级的控制器,也即是说在创建Deployment的时候,会自动创建Replicaset,
    由Replicaset再创建Pod,Deployment能对Pod扩容、缩容、滚动更新和回滚、维持Pod数量。

    六,pod与node关系

    下图显示一个 Node(节点)上含有4个 Pod(容器组)

    Pod总是在node上运行。node是k8s集群中的计算机,可以是虚拟机或者物理机。每个node节点上都由master管理。一个node上可以有多个pod,k8s master会根据每个node上的资源情况,自动调度pod到最佳的node上。

    每个node至少运行:

    kubelet,负责master节点和worker节点之间的通信进程,管理pod和pod内运行的container容器、
    容器运行环境,如docker负责下载镜像,创建和运行容器等。

  • 相关阅读:
    PyTorch实战:实现Cifar10彩色图片分类
    Centos使用war文件部署jenkins
    HTTP发起请求与收到响应的大致过程
    Promise原理及实现
    java之方法和数组
    十七.镜头知识之AA制程提高摄像头性能
    线程安全问题你了解多少?java中线程安全的基础防范
    Spring AOP
    【Java 进阶篇】JavaScript 自动跳转首页案例
    代码随想录算法训练营第23期day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值
  • 原文地址:https://blog.csdn.net/zhaoyu_1979/article/details/131085543