了解pod和pod的生命周期-这一篇文章就够了

kubectl简介

kubectl是操作k8s的命令行工具,能连接到apiserver上实现k8s中各种资源的增删改查

kubectl命令

kubectl  --help  

#查看kubectl的帮助命令,有哪些参数,常用的如下:

1)get


列举资源信息,如pod,service,deployment等kubectl  get pods kubectl  get deploymentkubectl  get service

2)describe

列举资源的详细信息

3)logs

查看pod输出的日志信息

4)edit

编辑服务器上定义的资源

5)delete

删除指定的资源

6)exec

可以交互式的登录到pod中的容器

7)apply

对资源做配置

8)explain

显示资源文档信息,可以查看某个资源的具体用法

9)run

运行一个pod实例如:kubectl  run nginx --image=nginx   #可以创建一个nginx应用,实际创建pod应用都是通过编写资源清单文件进行创建

kubernetes中的资源对象pod

(1)什么是pod?

pod翻译成中文是豌豆荚的意思,它是kubernetes中的最小调度单元,由一个或者多个容器组成,这些容器共享存储、网络和命名空间,pod中的容器总是被同时调度,它们有共同的运行环境,运行在同一个共享上下文中,一个pod相当于一个逻辑主机--比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机,虚拟机或者云主机上,那么出现k8s之后,我们就可以把应用部署到pod中,所以pod充当的是一个逻辑主机的角色;

pod的共享上下文是一组linux命名空间,cgroup,以及其他可能隔离的方面;Pod中的容器共享IP地址和端口空间,并且可以通过localhost相互访问。他们还可以使用标准的进程间通信(如SystemV信号量或POSIX共享内存)相互通信,不同Pod中的容器具有不同的IP地址,无需特殊配置即可通过IPC进行通信;在一个Pod中的应用可以访问共享的存储卷,它被认为是Pod的一部分,可以被挂接至每一个应用文件系统;与独立的应用容器一样,Pod是一个临时的实体,它有着自己的生命周期。在Pod被创建时,会被指派一个唯一的ID,并被调度到Node中,直到Pod被终止或删除。如果Pod所在的Node宕机,给定的Pod(即通过UID定义)不会被重新调度。相反,它将被完全相同的Pod所替代。这所说的具有和Pod相关生命周期的情况,例如存储卷,是说和Pod存在的时间一样长。如果Pod被删除,即使完全相同的副本被创建,则相关存储卷等也会被删除,并会为Pod创建一个新的存储卷等。Pod本身就没有打算作为持久化的实体,在调度失败、Node失败和获取其它退出(缺少资源或者Node在维护)情况下,Pod都会被删除。一般来说,用户不应该直接创建Pod,即使创建单个的Pod也应该通过控制器创建。在集群范围内,控制器为Pod提供自愈能力,以及副本和部署管理。

(2)pod是如何管理多个容器的?

Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如下图所示:

图片

(3)和pod相关的api对象

kubectl  explain  pods 

可以看到和pod相关的api对象有哪些,也就是通过资源清单部署一个pod时需要哪些字段

apiVersion

apiVersion定义了此对象表示的版本化模式,服务器应将已识别的模式转换为最新的内部值,并可能拒绝无法识别的值。更多信息参考 https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

kind

Kind是表示此对象表示的REST资源的字符串值。服务器可以从客户端提交请求的端点推断出这一点

metadata

标准对象的元数据。更多信息参考https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

spec

指定容器的所需行为。更多信息参考https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

status

最近观察到了pod的状态。更多信息:https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

(4)通过定义一个pod资源清单yaml创建pod

查看定义资源清单需要哪些字段

kubectl explain pods.apiVersion

kubectl explain pods.kind

kubectl explain pods.metadata

kubectl explain pods.spec

cat  pod.yaml


apiVersion: v1kind: Podmetadata:  name: web  namespace: default  labels:    web1: tomcat    web2: nginxspec:  containers:  - name: tomcat1    image: tomcat:latest  - name:  nginx    image:  nginx:latest

kubectl   apply  -f   pod.yaml    

#通过yaml文件创建一个pod应用

kubectl delete -f pod.yaml       

#yaml文件里定义的资源都会被删除

我们上面创建的pod是一个自主式pod,也就是通过pod创建一个应用程序,如果pod出现故障停掉,那么我们通过pod部署的应用也就会停掉,不安全,所以还有一种pod,还有一种通过控制器管理的pod,通过控制器创建pod,可以对pod的生命周期做管理,如定义pod的副本数,如果有一个pod意外停掉,那么会自动起来一个pod替代之前的pod。

(5)pod生命周期

同一个pod中可以运行多个容器,我们在创建一个pod时可以通过创建多个容器来实现pod的整个生命周期,一个pod创建包含如下过程

Init容器

Init容器就是做初始化工作的容器。可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到,Init Container可以在多种K8S资源里被使用到,如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。

主容器

1)容器钩子

初始化容器启动之后,开始启动主容器,在主容器启动之前有一个post start hook(容器启动后钩子)和pre stop hook(容器结束前钩子)

PostStart

该钩子在容器被创建后立刻触发,通知容器它已经被创建。如果该钩子对应的hook handler执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器,这个钩子不需要传递任何参数

PreStop

该钩子在容器被删除前触发,其所对应的hook handler必须在删除该容器的请求发送给Docker daemon之前完成。在该钩子对应的hook handler完成后不论执行的结果如何,Docker daemon会发送一个SGTERN信号量给Docker daemon来删除该容器,这个钩子不需要传递任何参数

2)容器探针

livenessProbe(存活性探测)

指示容器是否正在运行。如果存活性探测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为Success。

readinessProbe(就绪性探测)

指示容器是否准备好服务请求。如果就绪性探测失败,端点控制器将从与 Pod匹配的所有Service的端点中删除该Pod的IP地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success

整个图如下:

从上面可以看出,我们pod在从创建到结束之前,会一直处于某种状态之中,有一些状态:

(6)常见的pod状态

Pending

挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,比如像我们刚才定义的pod-demo,一定要有node的节点标签是ssd,那么创建的pod才可以调度到这个标签的节点上,如果没有这个node标签的节点,那么就挂起了,已经创建了但是没有适合它运行的节点叫做挂起,调度没有完成

Running

运行状态

Failed

表示失败

Succeeded

表示成功了

Unknown

未知状态,所谓pod什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了

(7)创建pod时大概经历哪些阶段

初始化容器-->主容器

(8)pod重启策略

Always:只要容器挂了就重启

OnFailure:只有容器状态为错误的时候才重启

Never:从不重启容器

默认重启策略就是Always


猜你喜欢

转载自blog.51cto.com/15127502/2655343