k8s pod生命周期
镇楼图
复制到typora效果更佳哦
# 笔记 ### 1、pod ```bash k8s最小的管理单元是pod,pod主要是用来管理pod,在一个pod中包含的是一个调用链的服务。 例如: nginx Django ``` ![pod生命周期](pod%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png) ### 2 、pod生命周期 ```bash 上图就是pod的整个生命周期: 1.容器初始化 2.启动回调(postStart) 3.存活探针(liveness probe) 4.就绪探针(readiness probe) 5.停止回调(pre stop) ``` #### 2.1、容器初始化 ```bash 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么k8s需要重启它直到成功完成 每个初始化容器都必须按定义的顺序串行运行 1.既然有了command,那为什么还要用初始化(initcontainers)呢? #command,不保证在容器启动之前运行,而初始化是一定是容器启动之前运行,运行成功才会继续启动容器否则,重启容器 用法: #initcontainers和containers同级 …… spec: initcontainers: …… containers: …… ``` #### 2.2、启动回调(postStart) ```bash 当Pod中所有的容器创建完成之后,立即调用的命令。 执行失败:如果启动回调钩子执行失败,容器无法进入正常启动状态。 #检测方式又有三种: exec、http、socket三种,分别是通过执行命令、http请求、检测端口是否开启,三种方式检测 --- PostStart:容器创建成功后,运行前的任务,用于资源部署、环境准备等。 ...... containers: - image: sample:v2 name: war lifecycle: postStart: exec: command: - “cp” - “/sample.war” - “/app” ———————————————— 使用方法 --- #exec …… spec: containers: - name: nginx image: nginx:1.18 imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: - "/bin/sh" - "-c" - "echo 'Hello World!' > /root/1.txt" #容器启动成功后执行"echo 'Hello World!' > /root/1.txt"这个命令执行成功则,检测通过,否则检测失败无法进入正常状态 --- #http协议访问 …… spec: restartPolicy: OnFailure containers: - name: nginx image: nginx:1.18 imagePullPolicy: IfNotPresent lifecycle: postStart: httpGet: port: 80 path: / host: www.baidu.com #容器启动成功后访问www.baidu.com这个域名80端口访问成功则检测通过,否则无法进入正常状态 --- #socket 通过ping命令检测端口 …… spec: restartPolicy: OnFailure containers: - name: nginx image: nginx:1.18 imagePullPolicy: IfNotPresent lifecycle: postStart: tcpSocket: port: 80 host: 106.13.81.75 ``` #### 2.3、存活探针(liveness probe) ```bash 存活探针的主要作用就用来测试容器是否存活,如过检测失败,则认为容器不健康,会根据相应的设置来判断是否进行重启操作,如果不配置存活探针则默认为健康状态 initialDelaySeconds。如果没有设置,探针将在启动时立即探测,通常会导致探测失败,因为程序还没准备好开始接收请求 #示例: 存活探针同样有三种探测方式:exec、http、socket三种,分别是通过执行命令、http请求、检测端口是否开启,三种方式检测 liveness probe,在containers下级 --- …… spec: containers: livenessProbe: initialDelaySeconds: 10 #延迟检测时间 periodSeconds: 5 #检测时间间隔 exec: command: - cat - /tmp/healthy #http、socket和上面都一样这里就直接跳过了 --- #相关配置(在livenessProbe下级): initialDelaySeconds: Pod 启动后首次进行检查的等待时间,单位“秒”。 periodSeconds: 检查的间隔时间,默认为 10s,单位“秒”。 timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为 1s,单位“秒”。 successThreshold: 探针检测失败后认为成功的最小连接成功次数,默认为 1s,在 Liveness 探针中必须为 1s,最小值为 1s。 failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3s, ``` #### 2.4、就绪探针(readiness probe) ```bash 用于判断容器中应用是否启动完成,当探测成功后才使 Pod 对外提供网络访问,如果探测失败,将会从负载均衡上驱逐,再接收流量,直到再次检测通过 #示例: readiness probe的配置和livenessProbe是一样的 --- …… spec: containers: readinessProbe: initialDelaySeconds: 10 #延迟检测时间 periodSeconds: 5 #检测时间间隔 exec: command: - cat - /tmp/healthy #http、socket和上面都一样这里就直接跳过了 --- #相关配置(在livenessProbe下级): initialDelaySeconds: Pod 启动后首次进行检查的等待时间,单位“秒”。 periodSeconds: 检查的间隔时间,默认为 10s,单位“秒”。 timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为 1s,单位“秒”。 successThreshold: 探针检测失败后认为成功的最小连接成功次数,默认为 1s,在 Liveness 探针中必须为 1s,最小值为 1s。 failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3s, ``` #### 2.5、停止回调(pre stop) ```bash PreStop:在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。 优雅的删除资源对象: 当用户请求删除含有pod的资源对象时(如RC、deployment等),K8S为了让应用程序优雅关闭(即让应用程序完成正在处理的请求后,再关闭软件),K8S提供两种信息通知: 1)、默认:K8S通知node执行docker stop命令,docker会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认超时时间(30s),会继续发送SIGKILL的系统信号强行kill掉进程。 2)、使用pod生命周期(利用PreStop回调函数),它执行在发送终止信号之前。 --- …… spec: containers: prestop: httpGet: host: monitor.com psth: /waring port: 8080 scheme: HTTP ```