• Kubernetes生命周期和探针


    简介

    Pod在整个生命周期中被系统定义为各种状态,熟悉Pod的各种状态对于理解如何设置Pod的调度策略,重启策略很有必要

    1. Pod的状态

    • Pending
      API Server已经创建Pod 但在Pod内还有一个或多个的镜像没有创建,包括正在下载镜像的过程。

    • Running
      Pod内所有容器已经创建完成,且至少有一个容器处于运行状态

    • Successded
      Pod内所有容器均成功执行退出,并且不会再重启

    • Faild
      Pod内所有容器均已退出,但至少有一个容器为退出失败状态

    2. Pod重启策略

    Pod的重启策略应用于Pod内所有的容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作

    重启策略

    • Always: 总是重启;当容器失效时,由kubelete自动重启该容器,默认值
    • OneFailure:当容器终止运行且退出码不为0时候,由kubelete自动重启该容器
    • Never:不论容器运行状态如何都不会重启该容器,Job或CronJob

    配置在spec与containers同级中

    ........
         containers:
         - name: tomcat-app1-container
           image: harbor.magedu.local/tomcat-app1:v1
           command: ["/apps/tomcat/bin/run_tomcat.sh"]
           imagePullPolicy: IfNotPresent
           #imagePullPolicy: Always
           ports:
           - containerPort: 8080
             protocol: TCP
             name: http
           env:
           - name: "password"
             value: "123456"
           resources:
             limits:
               cpu: 1
               memory: "512Mi"
             requests:
               cpu: 500m
               memory: "512Mi"
         restartPolicy: Always      #重启策略
    

    3. Pod探针

    Pod健康检查和服务可用性检查

    Kubernetes对Pod的健康检查可以通过两类探针检查LivenessProbeReadinessProbe,kubelet定期执行这两类探针来诊断容器的监控状态

    • LivenessProber探针
      用于判断容器是否存活(Running状态),如果LivenessProbe探针探测到容器不健康,则kubelete将杀掉该容器,并根据容器的重启策略做相应的处理,如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe弹指值返回永远时Seccess

    • ReadinessProbe探针
      用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接受请求,流量可以接入。对于service管理的Pod service与Pod Endpoint的关联关系也会将基于Pod是否Ready进行设置

    3.1 探针的探测方式

    • ExecAction
      在容器内执行一个命令,如果该命令的返回值为0 则表明容器健康

    • TCPSocketActio
      通过容器的IP地址和端口号执行TCP检
      查,如果能够建立TCP连接,则表明容器健康

    • HTTPGetAction
      通过容器的IP地址,端口号及路径调用Http Get方法,如果状态码大于等于200且小于400,则认为容器健康
      生产建议使用此方法调用你的程序接口进行检测

    3.2 配置方式

    辅助探测的其它配置项目

    • initialDelaySeconds: 5 #启动容器后的多长时间进行探测

    • periodSeconds: 3 #间隔多长时间执行一次探测

    • timeoutSeconds: 5 #探测超时等待多少秒进行下一次探测

    • successThreshold: 1 #从失败转为成功的重试次数,探测器在失败后,被视为成功的最小连续成功数,默认值是1,存活探测的这个值必须是1,最小值是 1

    • failureThreshold: 3 #从成功转为失败的重试次数,当Pod启动了并且探测到失败,Kubernetes的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃Pod 会被打上未就绪的标签,默认值是3,最小值是1

    HttpGet探针
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels: #rs or deployment
          app: ng-deploy-80
      template:
        metadata:
          labels:
            app: ng-deploy-80
        spec:
          containers:
          - name: ng-deploy-80
            image: nginx:1.17.5 
            ports:
            - containerPort: 80
          livenessProbe:
            httpGet:
              path: /index.html
              port: 80
            initialDelaySeconds: 5  #启动容器后的多长时间进行探测
            periodSeconds: 3       #间隔多长时间执行一次探测
            timeoutSeconds: 5     #探测超时等待多少秒进行下一次探测
            successThreshold: 1   #从失败转为成功的重试次数,探测器在失败后,被视为成功的最小连续成功数,默认值是1,存活探测的这个值必须是1,最小值是 1
            failureThreshold: 3   #从成功转为失败的重试次数,当Pod启动了并且探测到失败,Kubernetes的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃Pod 会被打上未就绪的标签,默认值是3,最小值是1
    

    kubelet定时发送HTTP请求到 localhost:80/index.html 来进行容器应用的健康检查

    TcpSocket探针
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels: #rs or deployment
          app: ng-deploy-80
      template:
        metadata:
          labels:
            app: ng-deploy-80
        spec:
          containers:
          - name: ng-deploy-80
            image: nginx:1.17.5 
            ports:
            - containerPort: 80
          livenessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 3
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
    
    ExecAction探针
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels: #rs or deployment
          app: ng-deploy-80
      template:
        metadata:
          labels:
            app: ng-deploy-80
        spec:
          containers:
          - name: ng-deploy-80
            image: nginx:1.17.5 
            ports:
            - containerPort: 80
          livenessProbe:
            exec:
              command:
              - cat 
              - /root/
            initialDelaySeconds: 5
            periodSeconds: 3
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
    

    3.2 livenessProbe和readinessProbe的对比

    配置参数一样

    • livenessProbe 连续探测失败会重启、重建pod,readinessProbe不会执行重启或者重建Pod操作

    • livenessProbe 连续检测指定次数失败后会将容器置于(Crash Loop BackOff)且不可用,readinessProbe不

    • readinessProbe 连续探测失败会从service的endpointd中删除该Pod,livenessProbe不具备此功能,但是会将容器挂起livenessProbe

    • livenessProbe用户控制是否重启pod,readinessProbe用于控制pod是否添加至service

    建议:
    两个探针都配置

    4. 镜像拉取策略

    • imagePullPolicy: IfNotPresent
      node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像。

    • imagePullPolicy: Always
      每次重建pod都会重新拉取镜像

    • imagePullPolicy: Never
      从不到镜像中心拉取镜像,只使用本地镜像

  • 相关阅读:
    【转】理清基本的git(github)流程
    GIT CHEAT SHEET
    failed to push some refs to 'git@github.com:*/learngit.git'
    catch(…) vs catch(CException *)?
    char[]与TCHAR[]互相转换引发的一个问题!
    关于 AfxSocketInit()
    href="#"与href="javascript:void(0)"的区别
    Camera帧率和AE的关系(转)
    详细的摄像头模组工作原理!!!(转)
    高清摄像头MIPI接口与ARM处理器的连接(转)
  • 原文地址:https://www.cnblogs.com/precipitation/p/14071699.html
Copyright © 2020-2023  润新知