大连网站专业制作,seo教程seo官网优化详细方法,网站突然搜不到了,没有版权可以做视频网站吗一、Pod生命周期
一般将pod对象从创建至终的这段时间范围称为pod的生命周期#xff0c;它主要包含下面的过程#xff1a; pod创建过程 运行初始化容器#xff08;init container#xff09;过程 运行主容器#xff08;main container#xff09; 容器启动后钩子#…一、Pod生命周期
一般将pod对象从创建至终的这段时间范围称为pod的生命周期它主要包含下面的过程 pod创建过程 运行初始化容器init container过程 运行主容器main container 容器启动后钩子post start、容器终止前钩子pre stop 容器的存活性探测liveness probe、就绪性探测readiness probe pod终止过程 在整个生命周期中Pod会出现5种状态分别如下 挂起Pendingapiserver已经创建了pod资源对象但它尚未被调度完成或者仍处于下载镜像的过程中 运行中Runningpod已经被调度至某节点并且所有容器都已经被kubelet创建完成 成功Succeededpod中的所有容器都已经成功终止并且不会被重启 失败Failed所有容器都已经终止但至少有一个容器终止失败即容器返回了非0值的退出状态 未知Unknownapiserver无法正常获取到pod对象的状态信息通常由网络通信失败所导致 二、创建和终止
1pod的创建过程 用户通过kubectl或其他api客户端提交需要创建的pod信息给apiServer apiServer开始生成pod对象的信息并将信息存入etcd然后返回确认信息至客户端 apiServer开始反映etcd中的pod对象的变化其它组件使用watch机制来跟踪检查apiServer上的变动 scheduler发现有新的pod对象要创建开始为Pod分配主机并将结果信息更新至apiServer node节点上的kubelet发现有pod调度过来尝试调用docker启动容器并将结果回送至apiServer apiServer将接收到的pod状态信息存入etcd中
2pod的终止过程 用户向apiServer发送删除pod对象的命令 apiServcer中的pod对象信息会随着时间的推移而更新在宽限期内默认30spod被视为dead 将pod标记为terminating状态 kubelet在监控到pod对象转为terminating状态的同时启动pod关闭过程 端点控制器监控到pod对象的关闭行为时将其从所有匹配到此端点的service资源的端点列表中移除 如果当前pod对象定义了preStop钩子处理器则在其标记为terminating后即会以同步的方式启动执行 pod对象中的容器进程收到停止信号 宽限期结束后若pod中还存在仍在运行的进程那么pod对象会收到立即终止的信号 kubelet请求apiServer将此pod资源的宽限期设置为0从而完成删除操作此时pod对于用户已不可见 三、初始化容器
初始化容器是在pod的主容器启动之前要运行的容器主要是做一些主容器的前置工作它具有两大特征 初始化容器必须运行完成直至结束若某初始化容器运行失败那么kubernetes需要重启它直到成功完成 初始化容器必须按照定义的顺序执行当且仅当前一个成功之后后面的一个才能运行
初始化容器有很多的应用场景下面列出的是最常见的几个 提供主容器镜像中不具备的工具程序或自定义代码 初始化容器要先于应用容器串行启动并运行完成因此可用于延后应用容器的启动直至其依赖的条件得到满足
接下来做一个案例模拟下面这个需求
假设要以主容器来运行tomcat但是要求在运行tomcat之前先要能够连接上ip1和ip2所在服务器
规定好ip1(192.168.31.129)和ip2(192.168.31.130)服务器的地址
创建pod-init.yaml内容如下
apiVersion: v1
kind: Pod
metadata:name: pod-initnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports: - name: tomcat-portcontainerPort: 8080initContainers:- name: test-ip1image: busybox:lastestcommand: [sh, -c, until ping 192.168.31.129 -c 1 ; do echo doing ping 192.168.31.129 ; sleep 2; done;]- name: test-ip2image: busybox:lastestcommand: [sh, -c, until ping 192.168.31.130 -c 1 ; do echo doing ping 192.168.31.130 ; sleep 2; done;]
# 创建pod
kubectl create -f pod-init.yaml
# 查看pod状态
# 发现pod卡在启动第一个初始化容器过程中后面的容器不会运行
kubectl describe pod pod-init -n mk# 动态查看pod
kubectl get pods pod-init -n mk -w# 接下来为当前服务器新增两个ip观察pod的状态变化
ifconfig eth0:1 192.168.31.129 netmask 255.255.255.0 up
ifconfig eth0:2 192.168.31.130 netmask 255.255.255.0 up 四、钩子函数
钩子函数能够感知自身生命周期中的事件并在相应的时刻到来时运行用户指定的程序代码。
kubernetes在主容器的启动之后和停止之前提供了两个钩子函数 post start容器创建之后执行如果失败了会重启容器 pre stop 容器终止之前执行执行完成之后容器将成功终止在其完成之前会阻塞删除容器的操作
钩子处理器支持使用下面三种方式定义动作 Exec命令在容器内执行一次命令 ……lifecycle:postStart: exec:command:- cat- /tmp/start.log
…… TCPSocket在当前容器尝试访问指定的socket …… lifecycle:postStart:tcpSocket:port: 8080
…… HTTPGet在当前容器中向某url发起http请求 ……lifecycle:postStart:httpGet:path: / #URI地址port: 80 #端口号host: 192.168.31.129 #主机地址scheme: HTTP #支持的协议http或者https
……
接下来以exec方式为例演示下钩子函数的使用创建pod-exec.yaml文件内容如下
apiVersion: v1
kind: Pod
metadata:name: pod-execnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports:- name: tomcat-portcontainerPort: 8080lifecycle:postStart: exec: # 在容器启动的时候执行一个命令打日志command: [/bin/sh, -c, echo postStart... /tmp/postStart.log]preStop:exec: # 在容器停止之前停止tomcat服务command: [[/bin/sh, -c, /usr/local/tomcat/bin/shutdown.sh]
# 创建pod
kubectl create -f pod-exec.yaml# 查看pod
kubectl get pods pod-exec -n mk -o wide# 访问pod
kubectl exec -ti pod-exec -n mk /bin/sh
cat /tmp/postStart.log 五、容器探测
容器探测用于检测容器中的应用实例是否正常工作是保障业务可用性的一种传统机制。如果经过探测实例的状态不符合预期那么kubernetes就会把该问题实例 摘除 不承担业务流量。kubernetes提供了两种探针来实现容器探测分别是 liveness probes存活性探针用于检测应用实例当前是否处于正常运行状态如果不是k8s会重启容器 readiness probes就绪性探针用于检测应用实例当前是否可以接收请求如果不能k8s不会转发流量 livenessProbe 决定是否重启容器readinessProbe 决定是否将请求转发给容器。 上面两种探针目前均支持三种探测方式 Exec命令在容器内执行一次命令如果命令执行的退出码为0则认为程序正常否则不正常 ……livenessProbe:exec:command:- cat- /tmp/test
…… TCPSocket将会尝试访问一个用户容器的端口如果能够建立这条连接则认为程序正常否则不正常 …… livenessProbe:tcpSocket:port: 8080
…… HTTPGet调用容器内Web应用的URL如果返回的状态码在200和399之间则认为程序正常否则不正常 ……livenessProbe:httpGet:path: / #URI地址port: 8080 #端口号host: 127.0.0.1 #主机地址scheme: HTTP #支持的协议http或者https
……
下面以liveness probes为例
1Exec
创建pod-exec.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-execnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastetsports: - name: tomcat-portcontainerPort: 8080livenessProbe:exec:command: [/bin/cat,/tmp/start.log] # 执行一个查看文件的命令
创建pod观察效果
# 创建Pod
kubectl create -f pod-exec.yaml
# 查看Pod详情
kubectl describe pods pod-exec -n mk# 观察上面的信息就会发现tomcat容器启动之后就进行了健康检查
# 检查失败之后容器被kill掉然后尝试进行重启这是重启策略的作用后面讲解
# 稍等一会之后再观察pod信息就可以看到RESTARTS不再是0而是一直增长
kubectl get pods pod-exec -n mk当然接下来可以修改成一个存在的文件比如/etc/hosts再试结果就正常
2TCPSocket
创建pod-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-tcpsocketnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports: - name: tomcat-portcontainerPort: 8080livenessProbe:tcpSocket:port: 8081 # 尝试访问8081端口
创建pod观察效果
# 创建Pod
kubectl create -f pod-tcpsocket.yaml
# 查看Pod详情
kubectl describe pods pod-tcpsocket -n mk# 观察上面的信息发现尝试访问8081端口,但是失败了
# 稍等一会之后再观察pod信息就可以看到RESTARTS不再是0而是一直增长
kubectl get pods pod-liveness-tcpsocket -n mk当然接下来可以修改成一个可以访问的端口比如8080再试结果就正常
3HTTPGet
创建pod-get.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-getnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports:- name: tomcat-portcontainerPort: 8080livenessProbe:httpGet: # 其实就是访问http://127.0.0.1:8080/scheme: HTTP #支持的协议http或者httpsport: 8080 #端口号path: /test #URI地址
创建pod观察效果
# 创建Pod
kubectl create -f pod-get.yaml
# 查看Pod详情
kubectl describe pod pod-get -n mk# 观察上面信息尝试访问路径但是未找到,出现404错误
# 稍等一会之后再观察pod信息就可以看到RESTARTS不再是0而是一直增长
kubectl get pod pod-get -n mk # 当然接下来可以修改成一个可以访问的路径path比如/再试结果就正常
查看livenessProbe的子属性除了这三种方式还有一些其他的配置
kubectl explain pod.spec.containers.livenessProbe
FIELDS:exec Object tcpSocket ObjecthttpGet ObjectinitialDelaySeconds integer # 容器启动后等待多少秒执行第一次探测timeoutSeconds integer # 探测超时时间。默认1秒最小1秒periodSeconds integer # 执行探测的频率。默认是10秒最小1秒failureThreshold integer # 连续探测失败多少次才被认定为失败。默认是3。最小值是1successThreshold integer # 连续探测成功多少次才被认定为成功。默认是1
下面稍微配置两个
apiVersion: v1
kind: Pod
metadata:name: pod-getnamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports:- name: tomcat-portcontainerPort: 8080livenessProbe:httpGet:scheme: HTTPport: 8080path: /initialDelaySeconds: 50 # 容器启动后50s开始探测timeoutSeconds: 8 # 探测超时时间为8s 六、重启策略
一旦容器探测出现了问题kubernetes就会对容器所在的Pod进行重启其实这是由pod的重启策略决定的pod的重启策略有 3 种分别如下 Always 容器失效时自动重启该容器这也是默认值。 OnFailure 容器终止运行且退出码不为0时重启 Never 不论状态为何都不重启该容器
重启策略适用于pod对象中的所有容器首次需要重启的容器将在其需要时立即进行重启随后再次需要重启的操作将由kubelet延迟一段时间后进行且反复的重启操作的延迟时长以此为10s、20s、40s、80s、160s和300s300s是最大延迟时长。
创建pod-restartpolicy.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-restartpolicynamespace: mk
spec:containers:- name: tomcatimage: tomcat:lastestports:- name: tomcat-portcontainerPort: 8080livenessProbe:httpGet:scheme: HTTPport: 8080path: /testrestartPolicy: Never # 设置重启策略为Never
运行Pod测试
# 创建Pod
kubectl create -f pod-restartpolicy.yaml# 查看Pod详情发现nginx容器失败kubectl describe pods pod-restartpolicy -n mk# 观察pod的重启次数发现一直是0并未重启
kubectl get pods pod-restartpolicy -n mk