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