首页 > 其他分享 >kubernetes健康检查配置解析

kubernetes健康检查配置解析

时间:2024-01-30 10:58:43浏览次数:34  
标签:容器 kubernetes deploy nginx html 健康检查 pod 解析 port

参考:
https://zhuanlan.zhihu.com/p/542202680

一,健康检查种类

在kubernetes中,经常会看到健康检查相关的配置。一般有两种健康检查方式:存活性健康检查和可用性健康检查,也叫做存活探针(livenessProbe)或者就绪探针(readinessProbe)。
livenessProbe探测应用是否处于健康状态,如果不健康会杀掉容器并根据容器策略决定是否重启容器。
readinessProbe探测应用是否就绪并处于正常服务的状态,探测失败后隔离服务(不分配流量)。
startupProbe用于容器启动时判断容器是否启动完成,在这个探针探测成功前,即容器启动成功前,livenessProbe和readinessProbe探针都不会起作用,防止某些启动很慢的容器在启动过程中被检测。
在实际的使用中只需要配置livenessProbe和readinessProbe,通过一段工作中使用到的配置给大家作以说明。

livenessProbe:
  failureThreshold: 3
  httpGet:
    path: /sams/webapi/health
    port: 19201
    scheme: HTTP
  initialDelaySeconds: 120
  periodSeconds: 20
  successThreshold: 1
  timeoutSeconds: 30
readinessProbe:
  failureThreshold: 3
  httpGet:
    path: /sams/webapi/health
    port: 19201
    scheme: HTTP
  initialDelaySeconds: 120
  periodSeconds: 20
  successThreshold: 1
  timeoutSeconds: 30

二,字段含义

字段 含义
ailureThreshold 不正常阈值。检测失败次数超过此值表示容器不健康(默认3次)
httpGet 采用http健康检查的方式
path 服务器上的访问URI
port 容器上要访问端口号
scheme 用于连接host的协议(HTTP或HTTPS),默认为HTTP
initialDelaySeconds 等待时间。从容器启动开始算起到检查开始时间差
periodSeconds 每次探测时间间隔(默认10秒)
successThreshold 正常阈值,失败后检查成功的最小次数,即从错误到正确要多少次表示健康(默认1次)
timeoutSeconds 探测超时时间(默认1秒)
httpHeaders 自定义请求头

三、三种检查方式

kubernetes中每种健康检查有三种方式。上面示例中采用的是httpGet的方式,其他两种为TCP和EXEC。

区别:

http(httpGet)检查方式会向容器中运行的服务发送HTTP GET请求,返回任何大于等于200且小于400的值,均表示健康,反之为不健康。
TCP(tcpSocket)检查方式将连接到容器的某个端口(port),如果探测成功,返回值为0,则该容器是健康的,反之为不健康。
EXEC检查方式会在容器中执行特定的命令(command),如果命令执行成功,则返回0,那么就认为容器是健康的,反之为不健康。

检查结果:

对于两种健康检查方式,有三种检查结果。

结果 含义
Success 通过了检查
Failure 未通过检查
Unknown 未能进行检查,因此不采取任何措施
可以通过pod描述查看检查结果,如下
# kubectl describe pod nginx-deploy-db66ff67c-kt4dx
...
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  68s                default-scheduler  Successfully assigned default/nginx-deploy-db66ff67c-kt4dx to k8s-worker2
  Normal   Pulled     23s (x3 over 67s)  kubelet            Container image "nginx" already present on machine
  Normal   Created    23s (x3 over 67s)  kubelet            Created container mynginx
  Normal   Started    23s (x3 over 67s)  kubelet            Started container mynginx
  Normal   Killing    23s (x2 over 43s)  kubelet            Container mynginx failed liveness probe, will be restarted
  Warning  Unhealthy  12s (x6 over 57s)  kubelet            Readiness probe failed: dial tcp 192.168.126.4:8000: connect: connection refused
  Warning  Unhealthy  8s (x8 over 53s)   kubelet            Liveness probe failed: dial tcp 192.168.126.4:8000: connect: connection refused

四、验证测试

livenessProbe探测应用是否处于健康状态,如果不健康会杀掉容器并根据容器策略决定是否重启容器。

# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      restartPolicy: Always
      containers:
        - name: mynginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 80
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 5
            successThreshold: 1
            timeoutSeconds: 5

部署

# kubectl apply -f deployment.yaml

查看

# kubectl get pod|grep nginx
nginx-deploy-79f6f77ff6-b7rvr             1/1     Running   0          3m19s
nginx-deploy-79f6f77ff6-f4znp             1/1     Running   0          3m19s

创建service用于负载均衡

# kubectl expose deployment nginx-deploy --port=8000 --target-port=80

解析

# 创建service对应的deployment是nginx-deploy
kubectl expose deployment nginx-deploy 
# service的对应的端口是8000
--port=8000
# 对应的容器端口的80 nginx默认启动80端口
--target-port=80

查看service,需要使用下面显示的集群ip加端口访问,只能在node节点访问

# kubectl get svc|grep nginx-deploy
nginx-deploy                                             ClusterIP      10.0.0.52    <none>        8000/TCP          26m

进入pod分别修改两个pod的index.html

# kubectl exec -it nginx-deploy-79f6f77ff6-b7rvr bash
root@nginx-deploy-79f6f77ff6-b7rvr:/# cd /usr/share/nginx/html/
root@nginx-deploy-79f6f77ff6-b7rvr:/usr/share/nginx/html# echo 111 > index.html 

另外一个pod修改成222
使用集群ip加端口访问测试,负载均衡第一次访问返回111第二次访问返回222

# curl 10.0.0.52:8000
111
# curl 10.0.0.52:8000
222

删除其中一个pod的index.html会触发pod重启
image
查看pod的描述可以看到健康检查失败

# kubectl describe pod nginx-deploy-79f6f77ff6-f4znp

image
访问测试一次返回111一次返回默认的index.html页面
image

dinessProbe探测应用是否就绪并处于正常服务的状态,探测失败后隔离服务。

# cat deployment2.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      restartPolicy: Always
      containers:
        - name: mynginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 80
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /index.html
              port: 80
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 5
            successThreshold: 1
            timeoutSeconds: 5

部署

# kubectl apply -f deployment2.yaml

进入pod分别修改index.html为111和222
删除一个pod的index.html
容器不会重启,但是服务被隔离了,curl一直返回没有被删除的index.html内容
image
查看pod状态有一个容器没有重启但是一直处于未准备状态

# kubectl get pod|grep nginx
nginx-deploy-5d9989944-g66m8              1/1     Running   0          4m16s
nginx-deploy-5d9989944-mfc5h              0/1     Running   0          4m16s

查看pod描述
image
查看endpoint可以看到负载均衡服务被踢出了只剩一个pod提供服务了
image

六,梳理总结

存活性健康检查在检测失败后杀死容器,可用性健康检查失败后隔离服务(不分配流量)。容器是否重启由容器的重启策略restartPolicy决定的。
三种检查方式配置类似,区别在于方式的不同。HTTP为httpGet,TCP为tcpSocket,EXEC为exec(command)。
如果一个容器不包含存活探针,则Kubelet认为容器的存活探针的返回值永远成功,即永远不会重启。

标签:容器,kubernetes,deploy,nginx,html,健康检查,pod,解析,port
From: https://www.cnblogs.com/minseo/p/17996635

相关文章

  • 如何评价搜索算法的好坏?多角度解析
    前言大家好,我是chowley,搜索算法无处不在,程序员中比较高级的算法工程师,也大多数是做搜推广方向的,今天我就简单讲解一下,如何评价搜索算法!评价搜索算法搜索算法影响着用户的搜索体验和信息获取效率。在评价搜索算法的好坏时,需要从多个角度综合考量。本文将从准确性、排序质量、响......
  • kubeadm安装Kubernetes集群踩坑笔记
    目录背景步骤一安装DockerEngine步骤二:安装前配置步骤三:安装kubeadm步骤四:安装kubernetes的Master节点镜像准备开始安装安装Flannel网络插件步骤五:安装kubernetes的Worker节点总结思考背景最近在极客时间上跟Chrono大神学习Kubernetes基础,在实践过程中遇到一些运维、使用方面......
  • 【揭秘】ForkJoinTask全面解析
    内容摘要ForkJoinTask的显著优点在于其高效的并行处理能力,它能够将复杂任务拆分成多个子任务,并利用多核处理器同时执行,从而显著提升计算性能,此外,ForkJoinTask还提供了简洁的API和强大的任务管理机制,使得开发者能够更轻松地编写并行化代码,高效地利用系统资源。核心概念ForkJoinT......
  • 【揭秘】RecursiveAction全面解析
    内容概要RecursiveAction是Java中一个强大的工具,它允许将复杂任务分解为更小的子任务,这些子任务可以并行执行,从而提高整体性能,其主要优点在于能够有效地利用多核处理器,减少任务执行时间,并简化并行编程的复杂性。核心概念RecursiveAction是Java并发包java.util.concurrent......
  • C++ Qt开发:运用QJSON模块解析数据
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析功能。JSON(JavaScriptObjectNotation)是一种轻量级......
  • 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构
    英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力的支持。以ChatGPT为例,其高效的运行依赖于一台由微软投资建造的超级计算机。这台超级计算机配备了数万个NVIDIA......
  • 无涯教程-Swift - 解析构造
    在需要释放一个类实例之前,必须调用"deinitializer"来释放内存空间,关键字"deinit"用于取消分配系统资源占用的内存空间。释放内存空间当不再需要实例时,Swift4会自动释放其实例,以释放资源。Swift4通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述。通常,在实例......
  • 如何修改Azure Kubernetes Services节点池VM Size
    如何修改AzureKubernetesServices节点池大小今天和大家聊聊AzureKubernetesServices(AKS)修改节点池VMSize的问题。这也是很多客户在使用AKS的过程中都会遇到的一个问题。随着AKS群集使用时间的增长,很多客户都会面临扩展或修改AKS节点池VMSize的问题,具体的原因大致如下:性能优化......
  • 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构
    英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力的支持。以ChatGPT为例,其高效的运行依赖于一台由微软投资建造的超级计算机。这台超级计算机配备了数万个NVIDI......
  • Kotlin扩展函数原理解析
    一、扩展函数扩展函数可以方便地给现有类增加属性和方法而不改动类地代码。二、原理funString.addTo(s:String):String{returnthis+s}反编译:@Metadata(mv={1,6,0},k=2,d1={"\u0000\n\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u......