详解kubernetes pod的编排和生命周期

目录
  • K8S Master基本架构
  • Pod的编排思想
  • Pod对象的属性和容器的属性?
  • Pod的生命周期

K8S Master基本架构

K8S的集群运行依赖Master节点和Node节点的通信,为了更好的理解第4部分的Pod生命周期,我们这里先给出K8S Master的简单架构图,后续的文章中,我们会分析Master、Node和Pod之间的关系。

Master的架构图:

其中:

API Server提供了HTTP Rest接口,它是k8s中的所有资源增删改查的唯一入口,也是集群控制的入口;

Scheduler是负责资源调度的进程;

Controller Manager是所有资源对象的自动化控制中心;

Etcd提供资源对象的数据保存服务

其中每个组件都有很多知识点,这里我们只要有个宏观的印象就可以了,后续的文章中,我们会逐一分析。

Pod的编排思想

上一篇文章末尾,我们提到了应用程序往k8s搬迁过程中的注意事项。这里重申一下,当我们想要把虚拟机上的应用程序搬迁到k8s中时,我们需要用Pod来构建我们应用程序模块。这个时候,比较重要的一点是划分我们应用程序模块,因为容器和虚拟机的设计模式不同,但是为了更好的理解和对比这二者的关系,我们可以设想下面的对应关系:

k8s-----操作系统

Pod----虚拟机

容器----进程

1、k8s相当于物理机的操作系统,k8s管理Pod相当于物理机的操作系统管理虚拟机

2、Pod相当于虚拟机,Pod里面可能包含多个容器,对应于虚拟机中的很多进程

3、容器相当于进程,容器的本质,其实就是一个进程。

有了这样的概念,去理解Pod可能会更加形象。再说回我们的应用程序迁移,假设我们的应用程序存在:

web服务、日志分析、MySQL数据库

三个关键的模块,其中:

web服务和日志分析存在"超亲密关系",因为日志分析模块要消费web服务模块产生的日志,所以他们必须部署在同一个服务器上。反之、web服务和MySQL数据库之间完全可以通过TCP-IP的方式来访问,就没有必要部署在同一台机器上。如果我们用容器运行这个应用,那么web服务需要和日志分析模块打包在同一个Pod中,而MySQL数据库服务单独部署在一个Pod中即可,我们的应用程序迁移到k8s中,可能就是下面的结构:

将不同的进程或者任务,编排在同一个Pod中,这本质上,就是Pod的一种编排思想

Pod对象的属性和容器的属性?

从上面的分析中不难看出,容器是隶属于Pod中的一个元素,从yaml文件上看,容器就是Pod的整个yaml文件中的一个字段。现在我们看看Pod和容器有哪些重要属性。

先看Pod的属性:

1、凡是调度、网络、存储、安全相关的属性,基本都是Pod相关的。

调度,自然不用说,Pod是k8s的最小调度单元;网络,同一个Pod中的容器共享Pod的网络;存储,可以通过Pod挂载卷的方式让不同的容器共享Pod的存储;安全,也是以Pod为维度来控制的。

2、凡是跟容器的Linux Namespace相关的属性,也是Pod级别的。

Pod的设计初衷,就是要容器之间共享Namespace。

3、凡是Pod中的容器要共享宿主机的Namespace,也一定是Pod级别的。

这个更加容易理解,因为Pod要共享主机的Namespace,那么Pod中的容器必然是要共享相同的Namespace,所以这个设置一定是Pod级别的。

再看Container的2个重要属性:

1、ImagePullPolicy:这个属性定义了镜像拉取的策略,它的默认值是always,也就是每次创建Pod都拉取一次镜像,它还有2个其他的取值,分别是never和ifnotpresent,这两个比较容易理解,一种是从来不拉取镜像,一种是只有在不存在镜像的时候才拉取镜像。这里需要注意一点,如果我们的版本号配置的是latest这种的,那么ImagePullPolicy会被默认值always。

2、Lifecycle:顾名思义,它是在容器的生命周期中执行某些动作,它有两个常见的参数,分别是postStart和preStop,就是在容器开始后或者容器结束前执行的一个特定操作。

Pod的生命周期

Pod的生命周期,主要体现在Pod的API的status部分,Pod的生命周期从开始到结束包含下面的几个过程:

1、Pending,表示Pod的yaml文件已经交给k8s,并且保存在etcd(etcd是k8s中的元信息库)中了。但是它由于调度不成功等原因没有被创建。

2、Running,这个词语具有迷惑性,它表示Pod已经调度成功,跟一台具体的节点服务器绑定,Pod中的容器不一定全部都正常运行了,但是至少有一个在运行。

3、Succeeded,这个状态意味着所有的容器都启动完毕,并且已经退出。

4、Failed,这个很好理解,就是Pod中的容器至少有一个以非0状态退出,也就是异常退出了。

5、Unknow。这是一个异常状态,表示当前Pod的状态不能正常的汇报给kube-apiserver了,这可能是主从节点之间的通信有问题。

如下所示为一个状态为running的Pod

[root@VM-16-13-centos ~]# kubectl get pod
NAME                                READY     STATUS             RESTARTS   AGE
mysql-pd7jr                         1/1       Running            0          118d
myweb-60r22                         1/1       Running            0          80d

[root@VM-16-13-centos ~]# 
[root@VM-16-13-centos ~]# kubectl get pod mysql-pd7jr -o yaml
apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
status:
  ...
  hostIP: 127.0.0.1
  phase: Running
  podIP: 172.17.0.2
  startTime: 2020-11-20T09:01:39Z

以上就是详解kubernetes pod的编排和生命周期的详细内容,更多关于kubernetes pod的编排和生命周期的资料请关注我们其它相关文章!

(0)

相关推荐

  • kubernetes环境部署单节点redis数据库的方法

    kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍下如何在 Kubernetes 环境中部署用于开发.测试的环境的 Redis 数据库,当然,部署的是单节点模式,并非用于生产环境的主从.哨兵或集群模式.单节点的 Redis 部署简单,且配置存活探针,能保证快速检测 Redis 是否可用,当不可用时快速进行重启. redis 参数配置 在使用 Kub

  • Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 之前介绍了Spring Cloud Config的用法,但对于Kubernetes应用,可能会需要读取ConfigMap的配置,我们看看Springboot是如何方便地读取ConfigMap和Secret. 2 整合Spring Cloud Kubenetes Spring Cloud Kubernetes提供了Spring Cloud应用与Kubernetes服

  • kubernetes YAML文件的使用

    目录 01 YAML文件介绍 YAML---key-value类型 YAML---list类型 02 K8S中Master.Node和Pod的关系 01 YAML文件介绍 K8S在启动Pod的时候,会使用yaml文件的方式来启动,今天我们来看看YAML文件最常用的格式. YAML的语法和JSON语法很像,都是通过key-value形式来组织的,它可以表示list.dict等常用数据类型,它的后缀一般使用".yml",它有如下几个特点: 1.大小写敏感 2.使用缩进表示递进关系 3.缩进

  • 如何把Spring Cloud Data Flow部署在Kubernetes上

    1 前言 Spring Cloud Data Flow在本地跑得好好的,为什么要部署在Kubernetes上呢?主要是因为Kubernetes能提供更灵活的微服务管理:在集群上跑,会更安全稳定.更合理利用物理资源. Spring Cloud Data Flow入门简介请参考:Spring Cloud Data Flow初体验,以Local模式运行 2 部署Data Flow到Kubernetes 以简单为原则,我们依然是基于Batch任务,不部署与Stream相关的组件. 2.1 下载GitHu

  • 使用Kubernetes部署Springboot或Nginx的详细教程

    1 前言 经过<Maven一键部署Springboot到Docker仓库,为自动化做准备>,Springboot的Docker镜像已经准备好,也能在Docker上成功运行了,是时候放上Kubernetes跑一跑了.这非常简单,一个yaml文件即可. 2 一键部署Springboot 2.1 准备yaml文件 当准备好镜像文件后,要部署到Kubernetes就非常容易了,只需要一个yaml格式的文件即可,这个文件能描述你所需要的组件,如Deployment.Service.Ingress等.定义

  • 云原生技术kubernetes(K8S)简介

    目录 01 kubernetes是什么? 02 kubernetes和Compost+Swarm之间的区别 03 一点总结 今天我们看看kubernetes技术的介绍,最近在极客时间上看张磊老师的深入kubernetes技术,讲的非常好,有兴趣的同学可以去收听一下,对于理解kubernetes技术非常有帮助,这里我会按照自己的进度,分享一下学习的笔记. 今天站的角度比较高,概念性质的东西会多一点. 01 kubernetes是什么? 曾经我认为这个问题很好回答,直到不断的去理解kubernete

  • 云原生技术kubernetes调度单位pod的使用详解

    k8s中的最小调度单位---pod 之前的文章中,我们对k8s能够解决的问题做了简单介绍,简单来说,它解决的问题是容器的编排与调度,它的核心价值在于:运行在大规模集群的任务之间,实际上存在着各种各样的关系,这些关系的处理,才是任务编排和系统管理最困难的地方,k8s就是为了这个问题而生的. 这句话比较难理解,我们从已有的知识入手,抽丝剥茧,慢慢理解它.我们已经知道,容器的本质是一个进程,它包含三个部分: 如果说容器是云环境的一个进程,那么你可以将k8s理解成云环境中的一个操作系统. 在一个操作系统

  • 如何在kubernetes中创建Pod

    目录 如何创建Pod? kubectl工具 如何创建Pod? 在之前的文章中,我们介绍了容器和Pod的区别和关系.我们知道Pod是k8s调度的最小单位,而一个Pod中可以有多个容器,那么我们如何来定义一个我们自己的Pod呢? 在k8s中,我们通常使用编写配置文件的方式创建一个Pod,配置文件的格式通常采用yaml格式,(yaml格式如何表示list.key-value键值对,这些知识在前一篇文章中说过了),编写好yaml文件之后,通过下面的办法来启动一个Pod: kubectl create -

  • 浅析kubernetes的控制器和标签

    目录 01 k8s中的常用控制器 RC控制器 Deployment控制器 Statefulset控制器 02 Label(标签)的概念 01 k8s中的常用控制器 之前我们了解了Pod是k8s集群中调度的最小单元,Pod是由Pause容器+应用容器组成的. 在k8s中,经常会出现一种资源对象管理另一种资源对象的情况,我们把这类资源对象称之为"控制器". 我们简单看看控制器的类型,以及他们的功能,其实每种控制器都有他们的特点,后续我们会逐一分析,现在只需要有个概念即可. RC控制器 它定

  • 详解kubernetes pod的编排和生命周期

    目录 K8S Master基本架构 Pod的编排思想 Pod对象的属性和容器的属性? Pod的生命周期 K8S Master基本架构 K8S的集群运行依赖Master节点和Node节点的通信,为了更好的理解第4部分的Pod生命周期,我们这里先给出K8S Master的简单架构图,后续的文章中,我们会分析Master.Node和Pod之间的关系. Master的架构图: 其中: API Server提供了HTTP Rest接口,它是k8s中的所有资源增删改查的唯一入口,也是集群控制的入口: Sch

  • 详解ASP.NET MVC的整个生命周期

    目录 一.介绍 二.MVC生命周期详述 View的初始化和渲染呈现 三.结束 一.介绍 我们做开发的,尤其是做微软技术栈的,有一个方向是跳不过去的,那就是MVC开发.我相信大家,做ASP.NET MVC 开发有的有很长时间,当然,也有刚进入这个行业的.无论如何,如果有人问你,你知道ASP.NET MVC的生命周期吗?你知道它的来世今生吗?你知道它和 ASP.NET WEBFORM 有什么区别吗?估计,这些问题,有很多人会答不上来,或者说不清楚.今天,我就把我的理解写出来,也是对我自己学习的一次回

  • 一文详解kubernetes 中资源分配的那些事

    目录 概要 一个nginx的配置 我们进入nginx容器所在目录看下 cpu.shares cpu.cpu.cfs_period_us.cpu.cfs_quota_us 资源使用率数据来源 下kubelet相关配置:** 概要 在k8s中,kube-scheduler是Kubernetes中的调度器,用于将Pod调度到可用的节点上.在调度过程中,kube-scheduler需要了解节点和Pod的资源需求和可用性情况,其中CPU和内存是最常见的资源需求.那么这些资源的使用率是怎么来的呢?当Pod调

  • 微信小程序 生命周期和页面的生命周期详细介绍

    微信小程序 生命周期和页面的生命周期详解: 1.小程序的生命周期--App.js App() 必须在 app.js 中注册,且不能注册多个.所以App()方法在一个小程序中有且仅有一个. App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.先上代码: App({ onLaunch: function () { console.log('App onLaunch'); }, onShow:function (){ console.log('App onS

  • kubernetes对象Volume用法详解

    概述 Volume是对各种存储资源的抽象.虚拟化.为管理.控制.使用存储资源提供统一接口.Openstack中的volume为虚拟机提供存储,Docker中的volume为容器提供存储.因为在kubernetes中可部署运行最小单位是pod ,所以kubernetes的volume为pod提供存储.当然在部署pod时可以不为其提供volume,pod中的容器使用所在节点的硬盘,能同时读写数据的地方称为可读写层.这种存储是容器级的临时存储,不是pod级.其生命周期与容器相同,如果容器crash后被

  • 详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说可以构成 静态内部类, 那别人认为你不错:如果你说了静态导包,那别人认为你很OK: 那我们就先在这几方面一一对static进行总结:然后说一些模糊的地方,以及一些面试中容易问道的地方: 1)static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方

  • python周期任务调度工具Schedule使用详解

    目录 1.准备 2.基本使用 参数传递 获取目前所有的作业 取消所有作业 标签功能 设定作业截止时间 3.高级使用 装饰器安排作业 并行执行 日志记录 异常处理 如果你想周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点: 1.不方便执行秒级任务. 2.当需要执行的定时任务有上百个的时候,Crontab 的管理就会特别不方便. 还有一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Ce

  • k8s编排之StatefulSet知识点详解一

    目录 正文 StatefulSet 的设计理解 Service 如何被访问 Headless Service 对应的 YAML文件 StatefulSet 的 YAML 文件 解析一下 Pod 对应的 Headless Service 正文 Deployment认为,一个应用的所有 Pod,是完全一样的.所以,它们互相之间没有顺序,也无所谓运行在哪台宿主机上.需要的时候,Deployment 就可以通过 Pod 模板创建新的 Pod:不需要的时候,Deployment 就可以“杀掉”任意一个 P

  • nginx pod hook钩子优雅关闭示例详解

    目录 一.系统环境 二.前言 三.pod hook(pod钩子) 四.如何优雅的关闭nginx pod 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64 Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点 服务器

随机推荐