wyh-l6

导航

k8s控制器探针

Health Check:由发起者对容器进行周期性检测
 
dockers health check实现方式:
#第一种方式:docker-compose
cat <<EOF >docker-compose.yaml
version: '3.6'
service:
  nginx-service:
    image: nginx
    expose:
    - 80
    - 443
    ports:
    - "80:80"
    - "443:443"
    restart: always
    healthcheck: #添加服务健康状态检查
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 5s #健康状态检查的间隔时间,默认为30s
      timeout: 5s #单次检查的失败超时时间,默认为30s
      retries: 3 #连续失败次数默认3次,当连续失败retrise次数后将容器置为unhealthy状态
      start_period: 60s #容器启动60s后,interval做第一次健康检查
EOF
#第二种方式:dockerfile制作镜像的时候加上
FROM nginx:1.20.2
HEALTHCHECK --interval=5s --timeout=2s --retries=3  CMD curl --silent --fail localhost:80 || exit 1
 
验证:
  1. 在检查通过之前容器处于starting状态
  2. 检测通过(检测返回状态码为0)之后为healthy状态
  3. 检测失败(检测返回状态码为1)之后为unhealthy状态
 
######################################################################################################
 
pod生命周期:
    initcontainer -> poststart ->{ readinessProbe - livenessProbe} -> prestop
 
探针简介:探针是有kubelet对容器执行的定期诊断,以保证pod的状态始终处于运行状态,要执行诊断,kubelet调用由容器实现的Handler(处理程序),也称为Hook(钩子),由三种类型处理程序:
  • ExecAction:在容器执行指定命令,如果命令退出时返回码为0则认为诊断成功
  • TCPSocketAction:对指定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断成功
  • HTTPGetAction:对容器指定的端口和地址执行HTTPGet请求,如果相应的状态码是200和400之间(包括200小于400),则诊断被认为是成功的
 
pod一旦配置探针,在检测失败的时候会基于restartPolicy对Pod进行下一步操作
pod重启策略(restartPolicy):
  • Always:当容器异常的时,k8s自动重启该容器,默认为Always
  • OnFailure:当容器失败时(容器停止运行退出码不为0),k8s自动重启该容器
  • Never:不论容器运行状态如何都不会重启该容器,适用于Job或CronJob
 
镜像拉取策略(imagePullPolicy):
  • IfNotPresent:node节点没有此镜像就去指定镜像仓库拉取,node服务器有镜像就使用node本地镜像
  • Always:每次pod重建都会重新拉取镜像
  • Nerver:从不到镜像仓库拉取镜像,只使用本地镜像
 
探针类型:
  • startupProbe:判断容器内的应用程序是否已经启动完成,配置启动探测后,会先禁用其他探测,直到startupProbe检测成功为止,如果startupProbe检测失败,kubelet会杀掉容器,然后根据配置的restartPolicy策略决定是否启动,如果没有配置startupProbe默认视为检测通过
  • livenessProbe:检测容器是否存活,如果存活探测失败,kubelet会杀死容器,是否重启会根据重启策略来定,如果没有配置存活探针,默认视为检测通过
  • readnessProbe:检测容器是否能提供服务,如果检测失败,端点空机器将匹配pod的所有service的端点(Endpoint)删除该pod地址,pod的status下的ready也会变为false(不会重启pod)
 
探针参数说明:
  • initialDelaySeconds:容器启动后要等待多少秒后猜启动存活和就绪探测器,默认是0秒,最小值是0
  • periodSeconds:执行探测的时间间隔(单位是秒),默认是10秒,最小值1秒
  • timeoutSeconds:探测的超时后等待多少秒,默认是1秒,最小值是1秒
  • successThreshold:探测器在失败后的最小连续成功数,默认是1,存活和就绪探针这个值也只能为1
  • failureThresnold:探测失效时,k8s的重试次数,对存活探针来说,探测失败意味着重启pod,对于就绪探针来说,探测失败意味着pod被打上未就绪标签,默认3次,最小1次
 
HTTPGetAction:
HTTPGetAction的yaml示例:
containers:
- name: pod-HTTPGetAction
  #readnessProbe:
  livenessProbe:
    httpGet:
      path: /index.html
      port: 80
      scheme: http
    initialDelaySeconds: 10
    periodSeconds: 5
    timeoutSeconds: 5
    successThreshold: 1
    failureThresnold: 3
 
TCPSocketAction的yaml示例:
containers:
- name: pod-TCPSocketAction
  #readnessProbe:
  livenessProbe:
    tcpSocket:
      port: 80
    initialDelaySeconds: 10
    periodSeconds: 5
    timeoutSeconds: 5
    successThreshold: 1
    failureThresnold: 3
 
ExecAction的yaml示例:
containers:
- name: pod-ExecAction
  #readnessProbe:
  livenessProbe:
    exec:
      command:
      - /usr/local/bin/redis-cli
      - quit
    initialDelaySeconds: 10
    periodSeconds: 5
    timeoutSeconds: 5
    successThreshold: 1
    failureThresnold: 3
 
 
postStart和preStop说明:
  • postStart:pod创建后立即执行的检测,即不等待pod中的服务启动,如果postStart执行失败,pod不会继续创建
  • preStop:在pod被停止之前执行
yaml示例:
containers:
- name: pod-lifecycle
  #readnessProbe:
  livenessProbe:
    postStart:
      exec:
        command: ["/bin/bash", "-c", "echo 'Hellow from then postStart handler' >> /usr/local/tomcat/webapps/ROOT/index.html"]
    preStop:
      exec:
        command: ["/usr/local/tomcat/bin/catalina.sh", "stop"]
 
pod的创建流程和终止流程:
#创建
  1. 创建pod
  2. 完成调度
  3. 容器启动并执行postStart
  4. 探针检测(readness和liveness)容器进入running状态
  5. service关联pod
  6. 接收客户端请求
#删除
  1. 删除pod
  2. pod被设置为“Terminating”状态,从service的Endpoint里面中删除端点
  3. 执行preStop
  4. k8s想pod中的容器发送SIGTERM信号(正常终止信号)终止pod里面的主进程,这个信号让容器知道自己即将要被关闭(默认宽限30s,30秒内可以优雅的关闭)
  5. 默认的30s内关闭或者30s后发送信号SIGKILL到Pod,并删除Pod
延长优雅关闭的时间(deploy.spec.template.spec.terminationGracePeriodSeconds):
    terminationGracePeriodSeconds:终止等待时间,如果未设置,最多等待30s,k8s将等待关闭的时间称为优雅终止宽限期,值得注意的地方是等待期与preStop和SIGTERM一起执行,即k8s可能不会等待preStop HOOK的完成
        
 
 
 
 

posted on 2022-08-15 09:55  IT老六  阅读(252)  评论(0编辑  收藏  举报