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

kubectl简介

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

kubectl命令

kubectl  --help  

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

1)get

列举资源信息,如pod,service,deployment等
kubectl  get pods 
kubectl  get deployment
kubectl  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: v1
kind: Pod
metadata:
  name: web
  namespace: default
  labels:
    web1: tomcat
    web2: nginx
spec:
  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

技术交流

为了大家更快速的学习知识,掌握技术,随时沟通问题,特组建了技术交流群,大家在群里可以分享自己的技术栈,抛出日常问题,群里会有很多大佬及时解答,这样我们就会结识很多志同道合的人,长按下图可加我微信,备注运维或者k8s或者devops即可进群,让我们共同努力,向着美好的未来出发吧~~~

微信:luckylucky421302

按如下指纹可关注公众

粉丝福利

扫码注册之后关联登陆

访问活动页或者华为云首页

可参与华为云产品1折秒杀活动

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩先超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值