Pod应用控制器进阶

Pod应用控制器进阶

Pod的生命周期

  1. pod状态 : pending 调度尚未完成
  2. runing 运行中
  3. failed 失败
  4. succeeded 成功
  5. 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内容器未初始化完成或未就绪,可能会导致客户访问失败

上一篇:react hooks useMemo和useCallback


下一篇:不要再滥用useMemo了!你应该重新思考Hooks memoization