Docker$Kubernetes笔记---04---Pod基础&生命周期
2023-12-12 14:40:48 0 举报
登录查看完整内容
为你推荐
查看更多
Docker$Kubernetes笔记---04---Pod基础&生命周期
作者其他创作
大纲/内容
用户自定义容器:数量可多可少
可以以根容器作为依据,评估整个pod的健康状态
可以在根容器上设置IP地址,用户可以通过根容器IP访问到其他容器(实现Pod内部通信)
Pause根容器:每个pod都会有一个根容器,根容器的作用有两个
每个pod中都包含一个或多个容器,这些容器可以分为两类:
pod之间相互通信可以采用虚拟二层网络技术来实现,我们当前实验环境为calico网络插件实现
apiVersion 版本,由k8s内部定义,版本号必须可以通过kubectl api-versions 查询到
kind \t 类型,由k8s内部定义,类型必须可以通过kubectl api-resources查询到
metadata 主要是指定资源标识与说明,常用的有name、namespace、labels等
spec 描述,这是配置中最重要的一部分,里边对各种资源配置的详细描述
status 状态信息,里边的内容不需要定义,有k8s自动生成
在kubernetes中基本所有资源的一级属性都是一样的,主要分为五部分
命令格式:kubect explain 资源名称
查看pod资源文档kubectl explain pods
explain选项用于查看资源文档
Pod定义的资源清单
KIND: Pod 资源类型类型VERSION: v1 资源版本DESCRIPTION: 资源描述FIELDS: 资源可配置的属性,如下
apiVersion: v1 \t必选的一级属性,版本号,例如v1
kind: Pod\t\t\t必选的一级属性,资源类型,例如Pod
name: 必选的二级属性,Pod名称
namespace: dev 二级属性,Pod所属的名称空间,例如dev,默认为default名称空间
name: 三级属性,标签名称
labels: 二级属性,自定义标签列表
metadata:\t\t\t必选的一级属性,元数据
name:\t\t\t必选的三级属性,容器名称
image:\t\t\t必选的三级属性,容器镜像名称
imagePullPolicy:\t三级属性,镜像的拉取策略
command:\t\t\t三级属性,容器的启动命令列表,如不指定,使用打包时使用的启动命令
args:\t\t\t三级属性,容器的启动命令参数列表
workingDir:\t\t三级属性,容器的工作目录
name:\t\t\t四级属性,引用pod定义的共享存储卷的名称
mountPath:\t\t四级属性,存储卷在容器内mount的绝对路径,应少于512字节
readOnly:\t\t四级属性,是否为只读模式
volumeMounts:\t三级属性,挂载到容器内部的存储卷配置
name:\t\t\t四级属性,端口的名称
containerPort:\t四级属性,容器需要监听的端口号
hostPort:\t\t四级属性,容器所在的主机需要监听的端口号,默认与Container相同
ports:\t\t\t三级属性,需要暴露的端口库号列表
name:\t\t\t四级属性,环境变量名称
value:\t\t\t四级属性,环境变量的值
env:\t\t\t\t三级属性,容器运行前需要设置的环境变量列表
CPU:\t\t五级属性,CPU资源限制,单位为core数,将用于docker run --cpu-shares参数
memory:\t\t五级属性,内存资源限制,单位可以为Mib/Gib,将用于docker run --memory参数
limits:\t\t四级属性,资源限制的设置
CPU:\t\t五级属性,CPU请求,容器启动的初始可用数量
memory:\t\t五级属性,内存请求,容器启动的初始可用数量
requests:\t\t四级属性,资源请求的设置
resources:\t\t三级属性,资源限制和请求的设置
postStart:\t\t四级属性,容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop:\t\t四级属性,容器终止前执行此钩子,无论结果如何,容器都会终止
lifecycle:\t\t三级属性,生命周期钩子
livenessProbe:\t三级属性,对Pod内个容器健康检查设置,当探测容器无响应后将自动重启该容器
tcpSocket:\t\t三级属性,对Pod内容器健康检查方式
initialDelaySeconds:\t\t三级属性,容器启动完成后,首次探测时间,单位为秒
timeoutSeconds:\t\t\t三级属性,对容器健康检查探测等待相应的超时时间,单位秒,默认1秒
periodSeconds:\t\t\t三级属性,对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
containers:\t\t必选的二级属性,Pod中容器列表
restartPolicy:\t\t二级属性,Pod的重启策略
nodeName:\t\t\t二级属性,设置pod调度到指定的node节点上
nodeSelector:\t\t二级属性,设置Pod调度到指定的label的node节点上
imagePullSecrets:\t二级属性,拉取镜像时,使用secret名称,以key:secretkey格式指定
hostNetwork:\t\t二级属性,是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
name:\t\t\t三级属性,共享存储卷名称
emptyDir:\t\t三级属性,类型为emptyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
path:\t\t\t四级属性,Pod所在宿主机的目录,将被用于容器中挂载的目录
hostPath:\t\t三级属性,类型为hostPath的存储卷,挂载集群与定义的secret对象到容器内部
secret:\t\t\t三级属性,类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
configMap:\t\t三级属性,类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
volumes:\t\t\t二级属性,在该Pod上定义共享存储卷列表
spec:\t\t\t\t必选的一级属性,Pod中容器的详细定义
以下是比较详细的资源清单介绍
Pod基础---结构定义
containers 容器列表,用于定义容器的详细信息,这是pod配置中最关键的一项配置
nodeName 根据nodeName的值将pod调度到指定的Node节点上
nodeSelector 根据NodeSelector中定义的信息选择将该pod调度到包含这些label的Node节点
hostNetwork 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes 存储卷,用于定义pod上面挂载的存储信息
restartPolicy 重启策略,表示pod在遇到故障时的处理策略
以下是对spec属性下常见的子属性介绍
RESOURCE: containers <[]Object> 数组,代表可以有多个容器
name\t<string>\t\t 容器名称,类型<字符串>
image\t<string> 容器镜像地址,类型<字符串>
imagePullPolicy\t<string> 镜像拉取策略,类型<字符串>
command\t<[]string>\t\t 容器启动的命令列表,如不指定,使用打包时使用的命令,类型<字符串>
args\t<[]string> \t 容器启动的命令需要的参数列表,类型<字符串>
env\t <[]Object>\t\t 容器环境变量的配置,类型<对象>
ports\t<[]Object>\t\t 容器需要暴露的端口号列表,类型<对象>
resources\t<Object> 资源限制和资源请求的设置,类型<对象>
FIELDS:
通过下边命令可以获取containers支持的子属性kubectl explain pod.spec.containers
以下是对containers属性的说明
vim pod-base.yml
先删除dev名称空间,主要将dev下的pod删除,创建dev名称空间kubectl delete ns devkubectl create ns dev
通过配置文件创建podkubectl create -f pod-base.yml
查看pod信息kubectl describe pods pode-base -n devNAME:pod名称READY:准备好的pod数量STATUS:pod状态,CrashLoopBackOff(崩溃)RESTARTS:重启次数
通过配置文件创建两个pod,nginx镜像用于提供web服务,busybox是一个小巧的linux命令集合,可以用来当测试工具使用
以下是对containers下的name、image属性的案例演示
Pod基础---基本配置
Always:总是从远程仓库拉取镜像
IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
Never:只使用本地镜像,从不去远程仓库拉取,本地如果没有就报错
默认值说明:如果镜像标签为具体版本号,默认策略是IfNotPresent,如果镜像标签为latest,默认策略是Always
imagePullPolicy用于设置镜像拉取策略,k8s支持三种拉取策略,可通过下边命令查看
vim pod-imagepullpolicy.yml
创建podkubectl create -f pod-imagepullpolicy.yml
查看pod信息kubectl get po -n dev
查看pod详细描述信息kubectl describe pod pod-imagepullpolicy -n dev
PS:提示:本实验集群环境默认没有下载过nginx:1.17.2镜像,所以会创建失败
创建pod,并指定镜像拉取策略为Never,只使用本地镜像,不从远程仓库拉取
vim pod-ifnotpresent.yml
创建podkubectl create -f pod-ifnotpresent.yml
查看pod详细信息kubectl describe pod pod-ifnotpresent -n dev
创建pod,并指定镜像拉取策略为IfNotPresent,本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
imagePullPolicy属性案例演示
Pod基础---镜像拉取策略
前边案例中,busybox容器没有运行成功,是应为busybox并不是一个程序,而是类似于一个工具类的集合,k8s集群启动管理后,会自动关闭,解决方式就是让其一直运行,这时候可以使用command属性配置
创建pod-command.yml文件,并设置busybox容器的启动命令
\"/bin/sh\
\"touch /tmp/hello.txt; 创建文件在tmp目录
while true;do /bin/echo $(date +%T) >> /tmp/hello.txt;sleep 3;done;\" 每隔3秒向文件写入当前时间
命令解释
vim pod-command.yml
创建podkubectl create -f pod-command.yml
exec 进入容器
pod-command pod名称
-it \t\t 交互进入容器,并为容器分配一个终端
-c 容器名称\t 指定容器名称,容器名称通过配置文件中定义的名称进入
/bin/sh\t\t 容器内执行命令的程序
容器内部查看文件内容ls tmpcat tmp/hello.txt
进入busybox容器,查看文件内容kubectl exec pod-command -n dev -it -c busybox /bin/sh
对command属性的案例演示
Pod基础---启动命令
env属性是用于设置容器环境变量的列表,环境变量的定义要根据容器具体需求定义
vim pod-env.yml
创建podkubectl create -f pod-env.yml
进入容器并查看变量kubectl exec -it pod-env -n dev -c busybox /bin/sh
对env属性的案例演示
Pod基础---环境变量
ports属性用于配置容器需要暴露的端口列表
通过下边命令可以获取ports属性可以使用的子属性kubectl explain pod.spec.containers.ports
name\t\t\t端口名称,如果指定,必须保证name在pod中是唯一的containerPort\t容器要监听的端口hostPort\t\t容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略)hostIP\t\t\t要将外部端口帮定到的主机IP(一般省略)protocol\t\t端口协议,必须是TCP、UDP或SCTP,默认为TCP
创建pod-ports.yml文件,指定容器暴露的端口vim pod-ports.yml
创建podkubectl create -f pod-ports.yml
查看pod描述信息kubectl describe po pod-ports -n dev
访问pod中的容器需要访问pod的IP加容器端口curl http://10.244.196.171:80
对ports属性的案例演示
Pod基础---端口设置
resources属性用于限制容器对系统的资源的使用量(资源配额),避免容器出现问题大量吞噬系统资源,k8s目前提供了对内存和CPU的资源限制;当我们对容器配置资源限额以后,如果容器超出资源使用量,k8s则会认位该容器出现故障,则重新启动该容器。
kubectl explain pod.spec.containers.resources
limits 用于限制容器运行时最大的资源使用量,当容器超出该使用量时,容器会被终止,并进行重启(上限)
requests 用于限制容器需要的最小资源,如果环境资源不够,容器将无法启动(下限)
resources属性提供了两个子属性用于资源限制,可通过下边命令查看
cpu:cpu数量可以为整数或小数
memory:内存大小,单位可以使用Gi、Mi、G、M等形式
这里对cpu与memory的单位做一个说明:
编写pod-resources.yml文件,设置容器资源的上下限vim pod-resources.yml
创建podkubectl create -f pod-resources.yml
查看pod描述信息kubectl describe po pod-resources -n dev
对resources属性的案例演示
Pod基础---资源配额
pod创建过程:创建pod的过程
运行初始化容器(init container)过程
容器启动后钩子(post start)函数执行的过程
容器终止前钩子(pre stop)函数执行的过程
容器的存活性探测(liveness probe)过程
容器就绪性探测(readiness probe)过程
运行主容器(maincontainer)过程:主容器也叫用户容器,在运行主容器时又有很多的子过程
pod终止过程
我们将pod从创建到终止的这段时间范围称为pod的生命周期,主要包含下面几个过程:
挂起状态(Pending):pod正在被调度到node节点或者正在下载镜像的过程
运行中(Running):pod已经被调度到node节点,并且所有容器都已经创建完成
成功(Succeeded):pod中的所有容器执行完毕并且都成功终止且不会被再次重启
失败(Failed):终止失败的容器处于该状态
未知(Unknown):apiserver无法正常获取到pod的状态信息,通常由于网络通信失败导致(少见)
在整个pod的生命周期中,pod会出现5种状态,分别如下:
1.用户通过kubectl或其他的api客户端提交需要创建的pod信息给apiServer
2.apiServer开始生成pod对象的信息,并将信息存储到etcd数据库,然后返回确认信息至客户端
3.apiServer开始反映etcd中的pod对象的变化,其他组件使用watch机制来跟踪检查apiServer上的变动
4.scheduler发现有新的pod对象要创建,开始为pod分配主机并将结果信息更新至apiServer
5.node节点上的kubelet发现有pod调度过来,调用docker启动容器,并将结果返回至apiServer
6.apiServer将接收到的pod状态信息存入etcd中
pod创建过程
1.用户向apiServer发送删除pod对象的命令
2.apiServer会将该pod标记为termination(终止)状态
3.kubelet在监控到pod转为terminating状态的同时启动pod关闭过程
4.端点控制器监控到pod关闭以后,会从对应的service列表中移除该pod
5.如果当前pod对象定义了preStop钩子处理器,则执行preStop中的参数,如果用户没定义,则不执行
6.pod对象中的容器进程收到停止信号
7.宽限期结束后(默认30s),若pod中还存在运行的进程,那么pod对象会收到强制终止的信号
8.kubelet请求apiServer将此pod的宽限期设置为0从而完成删除操作,此时pod对于用户已不可见
Pod生命周期---概述
初始化容器是在pod的主容器启动之前要运行的容器,我们称为初始化容器,主要是做一些主容器的前置工作
1.初始化容器必须运行完成,主容器才可以运行,若某初始化容器运行失败,那么k8s需要重启它,直到启动成功为止
2.初始化容器必须按照定义的顺序执行,前一个运行成功,后一个才能运行
初始化容器有两大特征:
提供主容器镜像中不具备的工具程序或自定义代码
初始化容器要先于应用容器启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足
初始化容器有很多的应用场景,下面列举几个常见的:
假设要以主容器来运行nginx,但是要求在运行nginx之前先要能够连接上MySQL与Redis所在的服务器
为了简化测试,事先定义好MySQL地址(192.168.18.20)和Redis地址(192.168.18.21)
如下案例模拟上边第二个需求:
创建pod-initcontainer.yml文件vim pod-initcontainer.yml
创建podkubectl create -f pod-initcontainer.yml
动态查看该pod信息:-w动态查看kubectl get po pod-initcontainer -n dev -w
接下来为集群中的master节点添加以上两个IP地址,添加以后初始化容器则可以ping通该地址ifconfig ens192:1 192.168.18.20 netmask 255.255.255.0 upifconfig ens192:2 192.168.18.21 netmask 255.255.255.0 up
Pod生命周期---初始化容器
钩子函数能够感知自生命周期的时间,并在相应的时刻到来时,运行用户指定的程序代码
post start:容器启动后钩子,定义在该钩子中的代码在容器启动后被执行,如果代码执行失败,会重启容器
pre stop:容器终止前钩子,定义在该钩子中的代码在容器终止前执行,代码执行完毕后,容器将被终止
k8s在主容器的启动之后和终止之前提供了两个钩子函数:
kubectl explain pod.spec.containers.lifecycle
钩子处理器支持定义动作可通过下边命令查看:
exec\t\t 在容器内执行一次命令lifecycle: postStart: exec: command: - cat - /etc/passwd
httpGet:\t在当前容器中向某url发起http请求lifecycle: postStart: tcpSocket: port: 8080
tcpSocket:\t在当前容器尝试访问指定的socketlifecycle: postStart: httpGet: path: / URL地址 port: 80 端口号 host: 192.168.18.10 主机地址 Scheme: HTTP 支持的协议,HTTP/HTTPS
创建podkubectl create -f pod-hook-exec.yml
查看pod详细信息kubectl get po pod-hook-exec -n dev -o wide
访问nginx页面curl http://10.244.196.174:80
提示:以上三种钩子处理器定义方式,第一种exec使用场景较多,本案例也已exec定义方式演示
kubectl explain pod.spec.containers.lifecycle.postStartkubectl explain pod.spec.containers.lifecycle.preStop
钩子处理器支持三种方式定义动作,可通过下边命令查看
Pod生命周期---钩子函数
容器探测类似于健康检查,用来探测容器中的程序是否可以正常工作,如果探测到容器出现故障,k8s会尝试重启,如果重启失败,k8s不会将流量分配给该容器,不承担业务流量
kubectl explain pod.spec.containers.livenessProbe
livenessProbe 存活性探针,用于检测容器当前是否处于正常运行状态,如果不是,k8s会重启该容器
kubectl explain pod.spec.containers.readinessProbe
readinessProbe 就绪性探针,用于检测容器当前是否可以接收请求,如果不能,k8s不会转发流量
FIELDS:exec 命令探测方式tcpSocket 端口探测方式httpGet\t\t\t\t\tURL 请求探测方式initialDelaySeconds 容器启动后等待多少秒执行第一次探测timeoutSeconds 探测超时时间,默认1秒,最小可设置1秒failureThreshold 连续探测失败多少次才被认定失败,默认3次为失败,最小可设置1periodSeconds 执行探测频率,默认是10秒,最小可设置1秒successThreshold 连续探测成功多少次才被认定为成功,默认1次
k8s提供了两种探针来实现容器的探测,可通过下边命令查看kubectl explain pod.spec.containers
exec:命令探测方式,在容器内执行一次命令,如果命令执行的退出码为0,则认位程序正常,否则不正常livenessProbe: exec: command: - cat - /etc/passwd
tcpSocket:端口探测方式,访问容器的端口,如果能够建立连接,则认位程序正常,否则不正常livenessProbe: tcpSocket: port: 8080
httpGet:调用容器内web应用的URL,如果返回的状态码在200与399之间,则为程序正常,否则不正常livenessProbe: httpGet: path: / #URL地址 port: 80 #端口号 host: 192.168.18.10 #主机地址 Scheme: HTTP #支持的协议,HTTP/HTTPS
这里给大家介绍三种常用的探测方式:
创建pod-livenessProbe-exec.yml文件,并用探针在容器执行一条命令,如果命令执行成功,容器则正常vim pod-livenessProbe-exec.yml
创建podkubectl create -f pod-livenessProbe-exec.yml
查看pod信息(pod启动失败)kubectl get po -n dev
查看pod详细描述kubectl describe po pod-livenessprobe-exec -n dev
修改pod-livenessProbe-exec.yml文件,并用探针在容器执行一条成功的命令测试vim pod-livenessProbe-exec.yml
查看pod信息 PS:提示:pod属于正常运行状态,并没有出现重启kubectl describe pod pod-livenessprobe-exec -n dev
方式一:exec
创建pod-livenessProbe-tcpSocket.yml文件,探测容器端口是否可以访问vim pod-livenessProbe-tcpSocket.yml
创建podkubectl create -f pod-livenessProbe-tcpSocket.yml
查看pod信息 提示:发现pod在重启kubectl get po -n dev
查看pod描述信息kubectl describe po pod-livenessprobe-tpcsocket -n dev
修改 pod-livenessProbe-tcpSocket.yml文件,指定探测端口为80vim pod-livenessProbe-tcpSocket.yml
查看pod信息 提示:pod属于正常运行状态,并没有出现重启kubectl get po -n dev
方式二:tcpSocket
创建pod-livenessProbe-httpGet.yml文件,探测容器内不存在的一个路径vim pod-livenessProbe-httpGet.yml
创建podkubectl create -f pod-livenessProbe-httpGet.yml
查看pod描述信息 提示:HTTP探测失败,状态码404kubectl describe po pod-livenessprobe-httpget -n dev
修改pod-livenessProbe-httpGet.yml文件,探测一个存在的路径vim pod-livenessProbe-httpGet.yml
创建podkubectl create -f pod-livenessProbe-httpGet.yml
查看pod信息 提示:pod运行正常,并没有出现重启kubectl get po -n dev
方式三:httpGet
下面以livenessProbe存活性探针做使用的讲解
Pod生命周期---容器探测
Always:容器失效时,自动重启该容器,默认策略
OnFailure:容器终止运行且退出码不为0时重启
Never:无论容器状态如何,都不重启该容器
kubectl explain pod.spec.restartPolicy
重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作延时时长为10s、20s、40s、80s、160s、300s,最长延时为300s,以后重启延时均为300s,直至重启成功
容器一旦出现了问题,K8s就会对容器所在的pod进行重启,重启操作是由pod的重启策略决定的,pod的重启策略有三种,可通过下边命令查看
创建pod-restartpolicy.yml,通过探针探测一个不存在的路径,然后设置重启策略为Nevervim pod-restartpolicy.yml
创建podkubectl create -f pod-restartpolicy.yml
查看pod信息 PS:提示:发现该pod并没有出现重启,但是该pod并没有运行kubectl create -f pod-restartpolicy.yml
查看pod描述信息 PS:提示:HTTP探测失败,状态码404,停止了该容器,容器并没有出现重启kubectl describe po pod-restartpolicy -n dev
Pod生命周期---重启策略
Docker$Kubernetes笔记---04---Pod基础&生命周期
0 条评论
回复 删除
下一页