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

简介: 了解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

                          相关实践学习
                          容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
                          通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
                          云原生实践公开课
                          课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
                          相关文章
                          |
                          1天前
                          |
                          Kubernetes API 调度
                          Kubernetes详解(十四)——Pod对象生命周期
                          Kubernetes详解(十四)——Pod对象生命周期
                          9 2
                          |
                          1天前
                          |
                          Kubernetes API 调度
                          Kubernetes详解(十五)——Pod对象创建过程
                          Kubernetes详解(十五)——Pod对象创建过程
                          19 5
                          |
                          6天前
                          |
                          存储 Kubernetes 调度
                          深入理解Pod的核心知识
                          【4月更文挑战第17天】Pod是Kubernetes中的基本执行单元,代表一个或多个紧密耦合的容器,共享存储/网络资源。
                          |
                          6天前
                          |
                          存储 Kubernetes 调度
                          Kubernetes Pod生命周期
                          Kubernetes Pod生命周期
                          32 0
                          Kubernetes Pod生命周期
                          |
                          6天前
                          |
                          存储 Kubernetes 调度
                          深入理解 Pod 的核心知识
                          【2月更文挑战第27天】
                          |
                          7月前
                          |
                          Perl
                          Pod高级用法:如何管理pod生命周期
                          Pod高级用法:如何管理pod生命周期
                          |
                          10月前
                          |
                          Kubernetes 监控 NoSQL
                          12-Kubernetes-Pod详解-生命周期
                          12-Kubernetes-Pod详解-生命周期
                          |
                          10月前
                          |
                          存储 SpringCloudAlibaba Kubernetes
                          K8S核心篇:Pod
                          Pod 是k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod 对象功能的,比如控制器对象是用来管控Pod 对象的,Service 或者Ingress 资源对象是用来暴露Pod 引用对象的,PersistentVolume 资源对象是用来为Pod提供存储等等,k8s 不会直接处理容器,而是Pod,Pod 是由一个或多个container 组成。
                          897 0
                          K8S核心篇:Pod
                          |
                          10月前
                          |
                          Kubernetes 调度 容器
                          【2023】Kubernetes之Pod与容器状态关系
                          【2023】Kubernetes之Pod与容器状态关系
                          174 0
                          |
                          12月前
                          |
                          存储 Prometheus Kubernetes
                          细说Kubernetes Pod的驱逐
                          细说Kubernetes Pod的驱逐