Pod应用控制器进阶
Pod的生命周期
- pod状态 : pending 调度尚未完成
- runing 运行中
- failed 失败
- succeeded 成功
- unknow 未知 有可能某个组件进程挂掉 kubelet…
创建pod过程:
- 请求–> apiserver–>保存请求到etcd中
- apiserver–>scheduler–>将调度的结果保存在etcd的pod资源的状态信息中
- ↑
- 目标节点上的kubelet通过apiserver获取用户创建的清单
- ↓
- kubelet根据清单在当前节点上创建并运行pod并发送节点状态给apiserver
- ↓
- 再次保存信息到etcd当中
pod生命周期的重要行为:
初始化容器
容器探测:
liveness //用于探测容器内主程序或容器是否存活(存活性探测)存活未必就绪
readiness //用于提供容器内服务是否能提供服务,类似于进程 (就绪性探测)
探针类型有三种:
ExecAction 执行命令 ps等
TCPSocketAction TCP套接字探测()
HTTPGetAction 根据响应码判断容器状态
pod内容器探测重启策略:
restartPolicy: //重启逻辑:时间叠加,最长为5分钟
always //默认总是重启
onfailure //当容器状态错误时重启,正常退出不会重启
nerver //从不
Pod终止:宽限期为30s,若30秒后容器未终止,则强制杀死。
容器探测-ExecAction探针demo
apiVersion: v1 kind: Pod //自主式Pod资源 metadata: name: liveness-exec-pod namespace: default spec: containers: - name: liveness-exec-containers image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /heslthy; sleep 30; rm -f /tmp/healthy; sleep 3600"] livenessProbe: //指定为存活性探测 exec: //探针类型 command: ["test","-e","/healthy"] initialDelaySeconds: 5 //容器启动后5秒开始探测 periodSeconds: 3 //失败三次才算失败,重启容器
HTTPGetAction 探针类型演示
apiVersion: v1 kind: Pod //自主式Pod资源 metadata: name: liveness-httpget-pod namespace: default spec: containers: - name: liveness-httpget-containers image: nginx:latest imagePullPolicy: IfNotPresent ports: - name: http containerPort: 90 //指定不存在的端口用于测试 livenessProbe: httpGet: //指定探针类型 port: http //指定名称为http的端口 path: /index.html //指定探测路径 initialDelaySeconds: 5 periodSeconds: 3
就绪性探测demo
apiVersion: v1 kind: Pod //自主式Pod资源 metadata: name: readiness-httpget-pod namespace: default spec: containers: - name: readiness-httpget-containers image: nginx:latest imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 readinessProbe: //指定容器探测为就绪性探测 httpGet: //探针类型为httpGet方法 port: http path: /index.html //监控该文件是否就绪 initialDelaySeconds: 5 periodSeconds: 3
容器启动后钩子
apiVersion: v1 kind: Pod metadata: name: poststart-pod namespace: default spec: containers: - name: busybox-httpd image: busybox:latest imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: ['/bin/sh','-c','echo haha >> /data/web/html/index.html'] //错误示范,此处明白原理即可 command: ['/bin/sh','-c','sleep 3600']
总结:容器探测 liveness 与 readiness 的原因
由于动态有生命周期的pod访问是由service转发至后端,当创建新的pod后由标签选择器立即关联至service,此时当用户请求立即被调度到此pod,但是由于pod内容器未初始化完成或未就绪,可能会导致客户访问失败