k8s实践16:kubernetes监测探针简单测试

1.两种探针

readiness probe(就绪探针)
监测容器是否就绪?只有pod里的容器就绪,kubelet才会认为pod处于就绪状态.
就绪探针的作用是控制哪些pod可以作为svc的后端,如果pod不是就绪状态,就把它从svc load balancer中移除.

liveness probe(存活探针)
监测容器是否存活?如果容器中的应用出现问题,liveness将检测到容器不健康会通知kubelet,kubelet重启该pod容器.

2.使用探针的三种方式

官网介绍了三种,见下:
command命令执行
http request访问
tcp socket连接

个人比较喜欢用第三种方式,tcp socket.

3.tcp socket方式学习测试

tcp socket方式
这个方式比较好理解.
比如说,起一个nginx容器,nginx服务提供的端口是80端口.
配置tcp socket 探针,设定隔一个时间,用tcp方式连接80端口,如果连接成功,就返回容器健康或者就绪,如果连接失败,返回容器不健康或者不就绪,kubelet重启容器.

逆向思维示例:
简单思路:探针tcp socket连接不存在的8080端口,必然连接失败报错,从而实现pod不断重启.

[[email protected] k8s_tanzhen]# cat tcp_ness
apiVersion: v1
kind: Pod
metadata:
? name: httpd
? labels:
? ? app: httpd
spec:
? containers:
? - name: httpd
? ? image: nginx
? ? ports:
? ? - containerPort: 80
? ? readinessProbe:
? ? ? tcpSocket:
? ? ? ? port: 8080
? ? ? initialDelaySeconds: 45
? ? ? periodSeconds: 20
? ? livenessProbe:
? ? ? tcpSocket:
? ? ? ? port: 8080
? ? ? initialDelaySeconds: 45
? ? ? periodSeconds: 20
[[email protected] k8s_tanzhen]#

起一个nginx的pod容器,提供服务端口80.
配置探针连接端口8080,第一次监测时间为pod容器启动后的45s,第一次监测后每隔20s监测一次.
测试结果,pod容器一直在重启.

[[email protected] k8s_tanzhen]# kubectl get pod -o wide
NAME? ? ? ? ? ? ? ? ? ? ? ? READY? ? STATUS? ? ? ? ? ? RESTARTS? AGE? ? ? IP? ? ? ? ? ? NODE
httpd? ? ? ? ? ? ? ? ? ? ? 0/1? ? ? CrashLoopBackOff? 7? ? ? ? ? 18m? ? ? 172.30.35.3? k8s-master3

describe报错

?Warning? Unhealthy? 6m (x19 over 16m)? kubelet, k8s-master3? Liveness probe failed: dial tcp 172.30.35.3:8080: connect: connection refused
?Warning? Unhealthy? 2m (x15 over 16m)? kubelet, k8s-master3? Readiness probe failed: dial tcp 172.30.35.3:8080: connect: connection refused

探针自动tcp连接容器ip:8080端口,失败.所以容器一直重启.

正常配置示例
正常配置是连接提供服务的80端口
简单思路:理论上来说,长时间运行的应用程序最终会过渡到中断状态,除非重新启动,否则无法恢复.Kubernetes提供了活性探针来检测和补救这种情况.这是配置探针的根本原因,以防万一.

[[email protected] k8s_tanzhen]# cat tcp_ness
apiVersion: v1
kind: Pod
metadata:
? name: httpd
? labels:
? ? app: httpd
spec:
? containers:
? - name: httpd
? ? image: nginx
? ? ports:
? ? - containerPort: 80
? ? readinessProbe:
? ? ? tcpSocket:
? ? ? ? port: 80
? ? ? initialDelaySeconds: 45
? ? ? periodSeconds: 20
? ? livenessProbe:
? ? ? tcpSocket:
? ? ? ? port: 80
? ? ? initialDelaySeconds: 45
? ? ? periodSeconds: 20
[[email protected] k8s_tanzhen]# kubectl get pod -o wide
NAME? ? ? ? ? ? ? ? ? ? ? ? READY? ? STATUS? ? RESTARTS? AGE? ? ? IP? ? ? ? ? ? NODE
httpd? ? ? ? ? ? ? ? ? ? ? 1/1? ? ? Running? 0? ? ? ? ? 2m? ? ? ? 172.30.35.3? k8s-master3

正常配置模拟测试案例
简单思路:起nginx容器,然后执行命令杀死nginx进程,设定探针监测连接tcp socket 80端口,当nginx进程被杀死后,tcp socket连接失败,探针监测容器为不健康不就绪,kubelet重启容器.

[[email protected] k8s_tanzhen]# cat tcp_ness
apiVersion: v1
kind: Pod
metadata:
? name: httpd
? labels:
? ? app: httpd
spec:
? containers:
? - name: httpd
? ? image: nginx
? ? args:
? ? - /bin/sh
? ? - -c
? ? - sleep 60;nginx -s quit
? ? ports:
? ? - containerPort: 80
? ? readinessProbe:
? ? ? tcpSocket:
? ? ? ? port: 80
? ? ? initialDelaySeconds: 20
? ? ? periodSeconds: 10
? ? livenessProbe:
? ? ? tcpSocket:
? ? ? ? port: 80
? ? ? initialDelaySeconds: 20
? ? ? periodSeconds: 10
[[email protected] k8s_tanzhen]#

配置参数说明:
容器启动后,执行nginx -s quit杀死Nginx进程
容器启动20s后开始执行readiness和liveness检测

容器启动后35s左右
探针监测到nginx进程已经死掉,无法连接到80端口,报警见下:

? Warning? Unhealthy? 8s (x3 over 28s)? kubelet, k8s-master3? Liveness probe failed: dial tcp 172.30.35.3:80: connect: connection refused
? Warning? Unhealthy? 7s (x3 over 27s)? kubelet, k8s-master3? Readiness probe failed: dial tcp 172.30.35.3:80: connect: connection refused

整个重启事件记录

Events:
? Type? ? Reason? ? Age? ? ? ? ? ? ? From? ? ? ? ? ? ? ? ? Message
? ----? ? ------? ? ----? ? ? ? ? ? ? ----? ? ? ? ? ? ? ? ? -------
? Normal? Scheduled? 2m? ? ? ? ? ? ? ? default-scheduler? ? Successfully assigned default/httpd to k8s-master3
? Normal? Pulled? ? 1m (x2 over 2m)? kubelet, k8s-master3? Successfully pulled image "nginx"
? Normal? Created? ? 1m (x2 over 2m)? kubelet, k8s-master3? Created container
? Normal? Started? ? 1m (x2 over 2m)? kubelet, k8s-master3? Started container
? Warning? Unhealthy? 16s (x6 over 1m)? kubelet, k8s-master3? Liveness probe failed: dial tcp 172.30.35.3:80: connect: connection refed
? Warning? Unhealthy? 15s (x8 over 1m)? kubelet, k8s-master3? Readiness probe failed: dial tcp 172.30.35.3:80: connect: connection resed
? Normal? Pulling? ? 5s (x3 over 2m)? kubelet, k8s-master3? pulling image "nginx"
? Normal? Killing? ? 5s (x2 over 1m)? kubelet, k8s-master3? Killing container with id docker://httpd:Container failed liveness prob. Container will be killed and recreated.

可以看到,nginx进程杀死后,pod自动重启.

[[email protected] k8s_tanzhen]# kubectl get pod -o wide
NAME? ? ? ? ? ? ? ? ? ? ? ? READY? ? STATUS? ? RESTARTS? AGE? ? ? IP? ? ? ? ? ? NODE
httpd? ? ? ? ? ? ? ? ? ? ? 0/1? ? ? Running? 4? ? ? ? ? 5m? ? ? ? 172.30.35.3? k8s-master3

实现测试目的

原文地址:https://blog.51cto.com/goome/2422823

时间: 2024-07-31 08:46:19

k8s实践16:kubernetes监测探针简单测试的相关文章

《软件工程综合实践专题》——1程序简单测试与升级

<软件工程综合实践专题> ———程序简单测试与升级 1759233 目录 <软件工程综合实践专题>... 1 ———程序简单测试与升级... 1 1.  程序代码:... 2 2.  代码解读:... 2 3.  需求增加:... 2 4.  新增需求的测试用例:[可能写的不好,因为软件测试这学期才开始学习]... 3 5.增量开发... 4 6.收获和不足... 9 1.   程序代码: 2.   代码解读: Python是一门很强大的语言主要是因为它包含了很多使用的库,这里的程

k8s实践19:kubernetes二进制部署集群v1.12升级v1.15

1.升级前的版本 [[email protected] ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.4", GitCommit:"5ca598b4ba5abb89bb773071ce452e33fb66339d", GitTreeState:"clean", BuildDa

k8s实践17:kubernetes对接nfs存储实现pvc动态按需创建分配绑定pv

1.开始前的想法.前面测试pv&&pvc的部署和简单配置应用,实现pod应用数据存储到pvc并且和pod解耦的目的.前面操作是全手动操作,手动创建pv,手动创建pvc,如果集群pod少,这样操作可以.假如集群有1000个以上的pod,每个pod都需要使用pvc存储数据,如果只能手动去一个个创建pv,pvc,工作量不可想像.如果可以创建pod的时候,创建pod的用户定义pvc,然后集群能够根据用户的pvc需求创建pv,实现动态的pv&&pvc创建分配.kubernetes支持

k8s实践16:使用job控制器备份Mysql容器pod数据库

job配置和简易测试 官方文档 1.job简单介绍 job也是种控制器,k8s有两种类型的控制器,一种是服务类控制器,比如deployment,deamonset,replicaset等等.一种是工作任务类控制器,job和cronjon就是工作任务类控制器. job的简易参数介绍 spec.template格式同Pod RestartPolicy仅支持Never或OnFailure 单个Pod时,默认Pod成功运行后Job即结束. spec.completions标志Job结束需要成功运行的Po

kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭,无需修改配置文件即可永久生效,CentOS 8默认安装的内核版本是4.18,所以在安装k8s的过程中也无需在进行内核升级,系统环境也可按需升级,如果下载的是最新版的CentOS 8,系统升级也可省略. 2. 基本环境配置 主机信息 192.168.1.19 k8s-master01 192.168

k8s实践(四):Controller

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G 备注 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G 备注 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(八):ConfigMap and Secret

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(九):Helm and Kubeapps UI

环境说明: 主机名 操作系统版本 ip docker version kubelet version helm version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 v2.14.3 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 v2.14.3 2C2G node节点 node02 Centos 7.6.18