【Kubernetes运维篇】零故障升级Pod健康探测详解

这篇具有很好参考价值的文章主要介绍了【Kubernetes运维篇】零故障升级Pod健康探测详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Pod健康探测介绍

中文官方参考文档:

Pod探测是Kubernetes中的一种机制,用于检测Pod的状态和健康状况。当探测到Pod状态不正常时,根据重启策略进行相应的Pod操作,探测可以帮助Kubernetes集群自动化地管理容器的健康状态,提高应用程序的可靠性和可用性。

探测针对Pod中容器进行操作,所以探测定义在kubectl explain pod.spec.containers 字段下面

1、三种容器探测方法

  • 启动探测(StartupProbe):探测Pod中容器中的应用 是否已经启动,如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

  • 存活探测(Liveness Probe):探测Pod中容器是否正常运行,如果探测失败,kubelet根据重启策略判断是否重启该容器。

  • 就绪探测(Readiness Probe):检测容器中的应用是否可以接受请求,当探测成功后才使Pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前端负载,如果探测失败,则将容器标记为未就绪状态,会把pod从前端负载移除。

三种探测的优先级是 启动探测最高,存活探测、就绪探测并行,启动探测成功后才会进行下面的探测。

2、常用三种探测探针

启动探测、存活探测、就绪探测都支持下面三种探针:

  • exec:在容器执行命令,通过返回码判断是否执行成功,非零表示失败。
  • tcpSocket:通过容器的IP地址和端口执行TCP检查,如果可以建立TCP连接,则表示探测成功。
  • httpGet:通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康。

探针探测结果有以下值:

  • Success:表示通过检测。

  • Failure:表示未通过检测。

  • Unknown:表示检测没有正常进行

3、探针相关属性说明

使用帮助命令查看相关属性:

kubectl explain pod.spec.containers.startupProbe
  • periodSeconds:执行探测的间隔时间,单位秒,默认10秒
  • timeoutSeconds:执行探测后,超时时间,单位秒,默认1秒
  • successThreshold:连续探测几次成功,才算成功,默认1秒
  • failureThreshold:探测失败重试次数,默认3次,最小1次

二、探测案例

1、Pod启动探测案例-startupProbe

案例一:使用 exec 探测容器内是否可以查看到tomcat进程,如果没有表示探测失败,根据重启策略做出对应的操作。

cat startupProbe-exec.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: tomcat
    env: uat
spec:
  containers:
  - name: container-startupprobe
    image: tomcat
    startupProbe:
      exec:      # 探测命令,返回非零表示失败
        command: ["/bin/bash", "-c", "ps -ef |grep  tomcat|grep -v grep|awk '{print $2}'"]

      initialDelaySeconds: 20  # 容器启动后多久开始探测
      periodSeconds: 20        # 执行探测间隔时间
      successThreshold: 1      # 成功多少次才算成功
      timeoutSeconds: 30       # 执行探针后,等待多少s,才算超时
      failureThreshold: 2      # 失败多少次才算失败

执行YAML文件:

kubectl apply -f startupProbe-exec.yaml

动态查看Pod状态:

get pods pod-startupprobe  -w

【Kubernetes运维篇】零故障升级Pod健康探测详解

案例二:使用 tcpSocket 探测容器内是否可以查看到 8080端口,如果探测失败,根据重启策略做出对应的操作。

cat startupProbe-tcpsocket.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: tomcat
    env: uat
spec:
  containers:
  - name: container-startupprobe
    image: tomcat
    ports:
    - containerPort: 8080
    startupProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 20  # 容器启动后多久开始探测
      periodSeconds: 20        # 执行探测间隔时间
      successThreshold: 1      # 成功多少次才算成功
      timeoutSeconds: 30       # 执行探针后,等待多少s,才算超时
      failureThreshold: 2      # 失败多少次才算失败

执行YAML文件:

kubectl apply -f startupProbe-tcpsocket.yaml 

案例三:使用 httpGet 探测容器内网络是否可以正常访问,如果探测失败,根据重启策略做出对应的操作。

cat startupProbe-httpget.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-startupprobe
  namespace: default
  labels:
    app: nginx
    env: uat
spec:
  containers:
  - name: container-1
    image: nginx
    ports:
    - containerPort: 80
    startupProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 20
      periodSeconds: 20
      successThreshold: 1
      failureThreshold: 2
      timeoutSeconds: 20

执行YAML文件:

kubectl apply -f startupProbe-httpget.yaml 

2、Pod存活探测案例-livenessProbe

案例一:使用 tcpSocket80端口 进行存活检测,如果探测失败,根据重启测试做出相应操作。

cat livenessProbe-tcp.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    livenessProbe: 
      tcpSocket:
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f livenessProbe-tcp.yaml 

案例二:使用 httpGet/index.html 进行 存活检测,如果探测失败,根据重启测试做出相应操作。

cat livenessProbe-http.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    livenessProbe: 
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f livenessProbe-tcp.yaml 

3、Pod就绪探测案例-readinessProbe

就绪探测,如果探测失败会从Pod前端负载移除,所以我们要借助Service 资源才能看到效果,如下案例检测 80端口是否启动,如果没有检查到,则从 Service 中移除:

cat readinessProbe-http.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: svc-readiness
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: server
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-readiness
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    readinessProbe: 
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

查看service、pod资源信息:

kubectl get pod,svc -l app=nginx

查看service 中关联的Pod:

kubectl describe svc|grep Endpoints

【Kubernetes运维篇】零故障升级Pod健康探测详解

4、启动、存活、就绪探测混合使用案例

案例:

cat probe.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: svc-probe
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - name: server
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-probe
  namespace: default
  labels:
    app: nginx
spec:
  containers:
  - name: container-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

    livenessProbe: # 存活探测,探测服务是否正常
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

    readinessProbe: # 就绪探测,探测服务是否可以接受请求
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

    startupProbe:  # 启动探测,探测容器内程序是否启动
      httpGet:
        path: /index.html
        port: 80
      timeoutSeconds: 15
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1

执行YAML文件:

kubectl apply -f probe.yaml 

三、总结

1、探测总结:

一共演示了三种探测,分别是启动探测,存活探测、就绪探测,启动顺序是启动探测最先执行,当启动探测成功后,存活探测和就绪探测并行,三种探测场景如下:

  • 启动探测(startupProbe):探测容器中程序是否启动,如果失败,根据重启策略进行对应操作。
  • 存活探测(livenessProbe):探测容器中程序是否正常运行,如果失败,根据重启策略进行对应操作。
  • 就绪探测(readinessProbe):探测容器中程序是否可以接受请求,如果失败,将从前端代理移除。

2、存活探测和就绪探测区别:

存活探测,探测失败是根据重启策略做对应操作,而就绪探测,探测失败,是将从前端代理移除,如service中移除,移除后就无法正常对外访问了。文章来源地址https://www.toymoban.com/news/detail-481132.html

到了这里,关于【Kubernetes运维篇】零故障升级Pod健康探测详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kubernetes运维篇】ingress-nginx实现业务灰度发布详解

    1、场景一:将新版本灰度给部分用户 假设线上运行了一套对外提供 7 层服务的 Service A 服务,后来开发了个新版本 Service AA需要上线,但不想直接替换掉原来的 Service A,希望先灰度一小部分用户,等运行一段时间足够稳定了再逐渐全量上线新版本,最后平滑下线旧版本。 这

    2024年02月15日
    浏览(50)
  • Kubernetes(k8s)健康性检查:livenessprobe探测和readinessprobe探测

    目录 一.系统环境 二.前言 三.Kubernetes健康性检查简介 四.创建没有探测机制的pod 五.添加livenessprobe探测 5.1 使用command的方式进行livenessprobe探测 5.2 使用httpGet的方式进行livenessprobe探测 5.3 使用tcpSocket的方式进行livenessprobe探测 六.readinessprobe探测 七.总结 本文主要基于Kubernetes1.

    2024年02月07日
    浏览(47)
  • 【Kubernetes运维篇】RBAC之创建集群用户管理K8S

    需求:公司新入职两位运维同事,分别是zhangsan、lisi,刚入职肯定不能给K8S管理员权限,所以需要创建两个系统账号,分别对应不同的权限: zhangsan用户 :对uat名称空间拥有管理员权限 lisi用户 :对所有命名空间拥有查看Pod的权限 第一步:生成一个私钥 第二步:生成一个证

    2024年02月16日
    浏览(50)
  • 解开 Kubernetes 中 Pod 健康检查失败之谜

    Pipedrive Infra 在不同的云中(主要是 AWS 和本地 OpenStack)运营自管理的 Kubernetes 集群。 截至撰写本文时,我们管理着 20 多个不同的集群,规模大小不一,有些非常具体,有些则较小。 我们很久以前就注意到,有时 Pod 健康检查会无缘无故地失败,然后几乎立即恢复。但是,由

    2024年02月03日
    浏览(30)
  • Kubernetes Pod的重启策略+健康检查(实现应用自修复);

    指的是容器什么时候才会被重启,如果没有健康检查的话,默认是根据pod的status来判断的 有三个值,分别是: Always : 只要容器被终止退出后,总是重启容器,默认策略; 应用场景:常驻进程(例如nginx,tomcat、mysql等) OnFailure :只有当容器异常退出(退出状态码非0)时,

    2024年02月03日
    浏览(36)
  • 【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

    大家好,我是秋意零。 上一篇中介绍了,Pod 的服务对象,从而对 Pod 有了更深的理解; 今天的主题是 Pod 健康检查和恢复机制,我们将结束 Pod 的内容。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持!在我主页推广区域,如图: 文章底部推广区域

    2024年02月09日
    浏览(40)
  • Kubernetes Pod卷 - Pod镜像的升级和回滚 - 探针

    目录 扩展: Pod创建的拓扑图: 提出的问题: Pod 卷的使用:Pod的数据持久化问题 配置 Pod 以使用卷进行存储 参考文档:配置 Pod 以使用卷进行存储 | Kubernetes 有状态应用和无状态应用: Pod 配置卷  1、创建 Pod: 2、验证 Pod 中的容器是否正在运行,然后留意 Pod 的更改: 3、因

    2024年02月07日
    浏览(47)
  • 【Kubernetes】Kubernetes之Pod详解

      Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Serv

    2024年02月04日
    浏览(94)
  • 《Linux运维篇:Linux系统运维指南》

    《Linux运维总结:Ubuntu20.04+Ubuntu22.04配置静态固定IP地址》 《Linux运维总结:使用U盘制作Linux镜像》 《Linux运维实战:不重启识别新挂载磁盘》 《Linux运维实战:使用parted进行磁盘分区》 《Linux运维实战:fdisk和parted一键分盘格式化分区》 《Linux运维实战:Centos7.9系统实现在线

    2023年04月24日
    浏览(63)
  • MySQL运维篇(一)日志

    错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为 mysqld

    2024年01月19日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包