01 什么是巡检
集群巡检是对集群系统进行定期检查和评估的过程
,其主要目的是确保集群的稳定性、性能和安全性。以下是集群巡检的几个主要用途:
故障排除和问题诊断
:巡检可以帮助发现集群中的故障和问题,并提供诊断和解决方案。通过检查集群的各个组件、配置和运行状况,可以及时发现潜在的故障源和性能瓶颈,并采取适当的措施进行修复。性能优化
:巡检可以评估集群的性能和资源利用情况。通过分析集群的负载、资源分配和配置,可以发现性能瓶颈、资源浪费和瓶颈等问题,并提供优化建议,以提高集群的性能和效率。安全审计和合规性
:巡检可以检查集群的安全性和合规性,包括访问控制、身份验证、数据保护等方面。通过审计集群的安全配置、漏洞管理和合规性规定,可以发现潜在的安全风险和合规性问题,并采取相应的措施进行修复和合规性调整。容量规划和伸缩性
:通过巡检,可以评估集群的容量使用情况和伸缩性需求。这有助于预测未来的资源需求、规划扩展策略,并提供建议来确保集群具有足够的容量和伸缩性,以满足业务的增长和变化。高可用性和冗余策略
:巡检可以评估集群的高可用性和冗余策略。通过检查集群的故障转移、备份和恢复机制,可以发现潜在的单点故障和可用性问题,并提供建议来增强集群的可靠性和冗余性。
02 传统网络主动巡检痛点
主动巡检多采用手工方式,通过 CLI 工具或者脚本,向集群主动注入压力,获取集群响应情况,因此存在很多不足之处。
当采用手动输入命令实现巡检时,会因为集群规模大、巡检频率高或巡检流程复杂等原因而难以实施。
当采用 shell 编程方式实现巡检时,
提高了运维人员的巡检门槛
,编程 bug影响了巡检结论的准确性
。当需要多台发压机时,以提高请求量和连接数,需要对发压机进行配置调优成本较大,
提高了压测环境的准备成本
。测试工具
需要调优
、配置经验不足
等问题,使得发压能力有限,测试不能达到预期目的,产生了错误的结论。对于 K8s 的应用更多的依赖产品自身的巡检能力,通过采集应用指标、日志、状态等信息来确认集群状态,
应用产生的指标信息有限
,无法完整得出巡检结论。对于
大规模 K8s 集群
,希望确认所有节点间 POD 的网络连通性,避免某个节点存在网络故障,发现网络中是否存在偶发丢包问题
,而通信渠道非常多
,包括 Pod IP、ClusterIP、NodePort、Loadbalancer IP、Ingress IP, 甚至是 POD 多网卡、双栈IP,手工方式巡检的效率低下,且维护成本较高。对于不同的应用需要使用不同的工具检查,如
dns 服务
、业务应用服务
、磁盘等
,需要运维人员对不同的巡检工具有深入了解,大大提高了运维人员的门槛。不同巡检工具的
巡检报告样式不同
,无法云原生式的展示出巡检结果的详细报告。
03 解决方案:kdoctor
kdoctor 是一个基于主动式压力注入的 Kubernetes 数据面测试组件
,对集群进行功能、性能的测试。通过调研和抽象了运维人员的常规运维需求,让网络、存储、应用等运维任务进行了云原生实现,基于 CRD的设计,能够对接观测性组件。
kdoctor 主要包含以下 3 个类型巡检:
kdoctor NetReach:根据任务配置对集群内 Pod IP、ClusterIP、NodePort、Loadbalancer IP、Ingress IP, 甚至是 POD 多网卡、双栈IP进行连通性巡检。
kdoctor AppHttpHealthy:根据任务配置对集群内外指定访问地址,使用 HTTP、HTTPS 协议进行连通性检查,支持 PUT、GET、POST 等多种请求方式。
kdoctor NetDns:根据任务配置,对集群内外的指定 DNS Server 进行连通性检测,支持 udp、tcp、tcp-tls 协议。
kdoctor 通过如下设计解决传统主动巡检问题:
通过下发 CRD 配置巡检任务需求,使用者只需要关注巡检目标、巡检频率、发压参数以及期望巡检结果。
kdoctor 通过读取任务配置,以 Deployment 或 DaemonSet 的方式运行发压 agent,以达到多台发压机器的效果。
kdoctor 会根据任务的 spec 配置,使用 default agent 或创建新的 agent 执行任务,以达到资源重复利用和任务资源隔离。
kdoctor 会绑定相对应的资源目标,如 ingress 、service,每一个 agent pod 根据任务配置相互访问绑定的资源,根据请求结果得出结论 。
kdocotr 的发压 client 通过性能调优,大大降低了发压请求时的资源消耗。
kdoctor 的巡检报告通过日志、聚合 api 、文件落盘等方式输出。
04 安装与使用
根据 kdoctor 的官方文档安装 kdoctor。
本文以 NetReach
为例,进行集群联通性巡检。
- 下发集群连通性巡检任务 NetReach,任务将执行一轮持续 10s 的任务,每个节点的 default agent 会相互使用 http 协议访问 ClusterIP、Endpoint、NodePort、LoadBalancer 的 IPv4 地址,并立即执行。
cat <<EOF | kubectl apply -f -
apiVersion: kdoctor.io/v1beta1
kind: NetReach
metadata:
name: reach-task
spec:
expect:
meanAccessDelayInMs: 1500
successRate: 1
request:
durationInSecond: 10
perRequestTimeoutInMS: 1500
qps: 10
schedule:
roundNumber: 1
roundTimeoutMinute: 1
schedule: 0 1
target:
clusterIP: true
endpoint: true
ingress: false
ipv4: true
loadBalancer: false
multusInterface: false
nodePort: true
EOF
- 查看巡检任务
~# kubectl get netreach
NAME FINISH EXPECTEDROUND DONEROUND LASTROUNDSTATUS SCHEDULE
reach-task true 1 1 succeed 0 1
- 查看巡检任务报告
kdoctor controller 会将巡检任务报告聚合并通过聚合 API 的方式进行展示。
~# kubectl get kdoctorreport reach-task -oyaml
apiVersion: system.kdoctor.io/v1beta1
kind: KdoctorReport
metadata:
creationTimestamp: null
name: reach-task
spec:
FailedRoundNumber: null
FinishedRoundNumber: 1
Report:
- EndTimeStamp: "2023-09-21T11:30:33Z"
NetReachTask:
Detail:
- MeanDelay: 50.294117
Metrics:
Duration: 15.004307799s
EndTime: "2023-09-21T11:30:33Z"
Errors: {}
Latencies:
Max_inMx: 0
Mean_inMs: 50.294117
Min_inMs: 0
P50_inMs: 0
P90_inMs: 0
P95_inMs: 0
P99_inMs: 0
RequestCounts: 102
StartTime: "2023-09-21T11:30:18Z"
StatusCodes:
"200": 102
SuccessCounts: 102
TPS: 6.798047691796755
TotalDataSize: 39295 byte
Succeed: true
SucceedRate: 1
TargetMethod: GET
TargetName: AgentClusterV4IP_10.233.32.45:80
TargetUrl: http://10.233.32.45:80
....
Succeed: true
SucceedRate: 1
TargetMethod: GET
TargetName: AgentPodV4IP_kdoctor-netreach-reach-task-pmndx_10.233.74.96
TargetUrl: http://10.233.74.96:80
NodeName: worker-node-1
PodName: kdoctor-netreach-reach-task-lwbtk
ReportType: agent test report
RoundDuration: 15.049239468s
RoundNumber: 1
RoundResult: succeed
StartTimeStamp: "2023-09-21T11:30:18Z"
TaskName: netreach.reach-task
TaskType: NetReach
ReportRoundNumber: 1
RoundNumber: 1
Status: Finished
TaskName: reach-task
TaskType: NetReach
05 总结
kdoctor 定位,不是取代传统的、专业的测试工具,也不是为了实施一个完整的巡检解决方案,而是希望提供一个简单
、快速
、高效
、云原生化的运维测试工具
,弥补当前运维测试中的功能空白,降低运维负担,并把检查结果对接到产品的生态中。
Top comments (0)