大规模集群下，如何快速实现无死角网络连通性的主动巡检
Tags: kubernetes, sre, cloudnative, patrol
Published: 2024-01-15 09:11:52

## 01 什么是巡检

集群巡检是对`集群系统进行定期检查和评估的过程`，其主要目的是确保集群的稳定性、性能和安全性。以下是集群巡检的几个主要用途：

- 
`故障排除和问题诊断`：巡检可以帮助发现集群中的故障和问题，并提供诊断和解决方案。通过检查集群的各个组件、配置和运行状况，可以及时发现潜在的故障源和性能瓶颈，并采取适当的措施进行修复。

- 
`性能优化`：巡检可以评估集群的性能和资源利用情况。通过分析集群的负载、资源分配和配置，可以发现性能瓶颈、资源浪费和瓶颈等问题，并提供优化建议，以提高集群的性能和效率。

- 
`安全审计和合规性`：巡检可以检查集群的安全性和合规性，包括访问控制、身份验证、数据保护等方面。通过审计集群的安全配置、漏洞管理和合规性规定，可以发现潜在的安全风险和合规性问题，并采取相应的措施进行修复和合规性调整。

- 
`容量规划和伸缩性`：通过巡检，可以评估集群的容量使用情况和伸缩性需求。这有助于预测未来的资源需求、规划扩展策略，并提供建议来确保集群具有足够的容量和伸缩性，以满足业务的增长和变化。

- 
`高可用性和冗余策略`：巡检可以评估集群的高可用性和冗余策略。通过检查集群的故障转移、备份和恢复机制，可以发现潜在的单点故障和可用性问题，并提供建议来增强集群的可靠

- 
性和冗余性。

## 02 传统网络主动巡检痛点

主动巡检多采用手工方式，通过 CLI 工具或者脚本，向集群主动注入压力，获取集群响应情况，因此存在很多不足之处。

- 
当采用手动输入命令实现巡检时，会因为集群规模大、巡检频率高或巡检流程复杂等原因而难以实施。

- 
当采用 shell 编程方式实现巡检时，`提高了运维人员的巡检门槛`，编程 bug `影响了巡检结论的准确性`。

- 
当需要多台发压机时，以提高请求量和连接数，需要对发压机进行配置调优成本较大，`提高了压测环境的准备成本`。

- 
测试工具`需要调优`、`配置经验不足`等问题，使得发压能力有限，测试不能达到预期目的，产生了错误的结论。

- 
对于 K8s 的应用更多的依赖产品自身的巡检能力，通过采集应用指标、日志、状态等信息来确认集群状态，`应用产生的指标信息有限`，无法完整得出巡检结论。

- 
对于`大规模 K8s 集群`，希望确认所有节点间 POD 的网络连通性，避免某个节点存在网络故障，发现网络中是否存在`偶发丢包问题`，而`通信渠道非常多`，包括 Pod IP、ClusterIP、NodePort、Loadbalancer IP、Ingress IP, 甚至是 POD 多网卡、双栈IP，手工方式巡检的效率低下，且维护成本较高。

- 
对于不同的应用需要使用不同的工具检查，如 `dns 服务`、`业务应用服务`、`磁盘等`，需要运维人员对不同的巡检工具有深入了解，大大提高了运维人员的门槛。

- 
不同巡检工具的`巡检报告样式不同`，无法云原生式的展示出巡检结果的详细报告。

## 03 解决方案：kdoctor

[kdoctor](https://github.com/kdoctor-io/kdoctor) 是`一个基于主动式压力注入的 Kubernetes 数据面测试组件`，对集群进行功能、性能的测试。通过调研和抽象了运维人员的常规运维需求，让网络、存储、应用等运维任务进行了云原生实现，基于 CRD的设计，能够对接观测性组件。

kdoctor 主要包含以下 3 个类型巡检：

- 
[kdoctor NetReach](https://github.com/kdoctor-io/kdoctor/blob/main/docs/reference/netreach-zh_CN.md)：根据任务配置对集群内 Pod IP、ClusterIP、NodePort、Loadbalancer IP、Ingress IP, 甚至是 POD 多网卡、双栈IP进行连通性巡检。

- 
[kdoctor AppHttpHealthy](https://github.com/kdoctor-io/kdoctor/blob/main/docs/reference/apphttphealthy-zh_CN.md)：根据任务配置对集群内外指定访问地址，使用 HTTP、HTTPS 协议进行连通性检查，支持 PUT、GET、POST 等多种请求方式。

- 
[kdoctor NetDns](https://github.com/kdoctor-io/kdoctor/blob/main/docs/reference/netdns-zh_CN.md)：根据任务配置，对集群内外的指定 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 的[官方文档](https://github.com/kdoctor-io/kdoctor/blob/main/docs/usage/install-zh_CN.md)安装 kdoctor。

本文以 `NetReach` 为例，进行集群联通性巡检。

- 
下发集群连通性巡检任务 NetReach，任务将执行一轮持续 10s 的任务，每个节点的 default agent 会相互使用 http 协议访问 ClusterIP、Endpoint、NodePort、LoadBalancer 的 IPv4 地址，并立即执行。

```bash
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
```

- 
查看巡检任务

```bash
~# kubectl get netreach
NAME         FINISH   EXPECTEDROUND   DONEROUND   LASTROUNDSTATUS   SCHEDULE
reach-task   true     1               1           succeed           0 1
```

- 
查看巡检任务报告

kdoctor controller 会将巡检任务报告聚合并通过聚合 API 的方式进行展示。

```bash
~# 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 定位，不是取代传统的、专业的测试工具，也不是为了实施一个完整的巡检解决方案，而是希望提供一个`简单`、`快速`、`高效`、`云原生化的运维测试工具`，弥补当前运维测试中的功能空白，降低运维负担，并把检查结果对接到产品的生态中。