NetDns
English | 简体中文
介绍
对于这种任务, kdoctor-controller 会根据 agentSpec 生成对应的 agent 等资源 ,每一个 agent Pod 都会向指定的 DNS server 发送 DNS 请求,默认并发量为 50 可覆盖多副本情况,并发量可在 kdoctor 的 configmap 中设置,并获得成功率和平均延迟。根据成功条件来判断结果是否成功。并且,可以通过聚合 API 获取详细的报告。
-
应用场景:
- 生产或 E2E 环境下,检测集群每个角落可访问 CoreDNS 服务
- 在应用部署阶段,用以配合调整 CoreDNS 的资源和副本数量,以确认能够支撑期望的访问压力
- 给 CoreDNS 注入压力,配合 CoreDNS 升级测试、混沌测试、bug 复现等目的
- 测试集群外部的 DNS 服务
-
关于 NetDns CRD 的更多描述,可参考NetDns
-
功能列表:
- 支持集群内外 DNS server 测试
- 支持 typeA 、typeAAAA 记录
- 支持 UDP、TCP、TCP-TLS 协议
使用步骤
接下来将展示 NetDNS
的使用示例
安装 kdoctor
参照安装教程安装 kdoctor
安装测试 server (选做)
kdoctor 官方仓库中包含了一个名为 server 的应用,内包含 http server,https server, DNS server,可用来测试 kdoctor 功能,若存在其他测试的 server 可跳过安装。
helm repo add kdoctor https://kdoctor-io.github.io/kdoctor
helm repo update kdoctor
helm install server kdoctor/server -n kdoctor-test-server --wait --debug --create-namespace
查看测试 server 状态
kubectl get pod -n kdoctor -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server-7649566ff9-dv4jc 1/1 Running 0 76s 172.40.1.45 kdoctor-worker <none> <none>
server-7649566ff9-qc5dh 1/1 Running 0 76s 172.40.0.35 kdoctor-control-plane <none> <none>
获取测试 server 的 service 地址
kubectl get service -n kdoctor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
server ClusterIP 172.41.71.0 <none> 80/TCP,443/TCP,53/UDP,53/TCP,853/TCP 2m31s
创建 NetDns
创建 NetDns
,该任务将执行一轮持续 10s 的任务,任务会向集群内 DNS server 以 QPS 为 10 的速度使用 UDP 协议,请求解析 kubernetes.default.svc.cluster.local
域名的 typeA 记录,并且立即执行。
cat <<EOF | kubectl apply -f -
apiVersion: kdoctor.io/v1beta1
kind: Netdns
metadata:
name: netdns-cluster
spec:
expect:
meanAccessDelayInMs: 1500
successRate: 1
request:
domain: kubernetes.default.svc.cluster.local
durationInSecond: 10
perRequestTimeoutInMS: 1000
protocol: udp
qps: 10
schedule:
roundNumber: 1
roundTimeoutMinute: 1
schedule: 0 1
target:
targetDns:
serviceName: kube-dns
serviceNamespace: kube-system
testIPv4: true
EOF
查看任务状态
当执行完成一轮后就可以使用 kdoctor 聚合 api 查看当前轮的报告,当 FINISH 为 true 时任务全部完成,可查看整体报告
kubectl get netdns
NAME FINISH EXPECTEDROUND DONEROUND LASTROUNDSTATUS SCHEDULE
netdns-cluster true 1 1 succeed 0 1
- FINISH:任务是否完成
- EXPECTEDROUND:希望任务执行轮数
- DONEROUND:当前执行完成轮数
- LASTROUNDSTATUS:最后一轮任务执行情况
- SCHEDULE:任务的调度规则
查看任务报告
-
查看已有报告
kubectl get kdoctorreport NAME CREATED AT netdns-cluster 0001-01-01T00:00:00Z
-
查看具体任务报告
节点 kdoctor-control-plane 和节点 kdoctor-worker 上 agent 分别都执行一轮发压后,将 agent 报告聚合而成,报告名称由
${TaskKind}-${TaskName}
组成root@kdoctor-control-plane:/# kubectl get kdoctorreport netdns-cluster -oyaml apiVersion: system.kdoctor.io/v1beta1 kind: KdoctorReport metadata: creationTimestamp: null name: netdns-cluster spec: FailedRoundNumber: null FinishedRoundNumber: 1 Report: - NodeName: kdoctor-control-plane PodName: kdoctor-agent-ntp9l ReportType: agent test report RoundDuration: 11.025723086s RoundNumber: 1 RoundResult: succeed StartTimeStamp: "2023-08-01T09:09:39Z" EndTimeStamp: "2023-08-01T09:09:50Z" TaskName: netdns.netdns-cluster TaskType: Netdns netDNSTask: detail: - FailureReason: null MeanDelay: 0.2970297 Metrics: DNSMethod: udp DNSServer: 172.41.0.10:53 Duration: 11.002666395s EndTime: "2023-08-01T09:09:50Z" Errors: {} FailedCounts: 0 Latencies: MaxInMs: 0 MeanInMs: 0.2970297 MinInMs: 0 P50InMs: 0 P90InMs: 0 P95InMs: 0 P99InMs: 0 ReplyCode: NOERROR: 101 RequestCounts: 101 StartTime: "2023-08-01T09:09:39Z" SuccessCounts: 101 TPS: 9.179593052634765 TargetDomain: kubernetes.default.svc.cluster.local. Succeed: true SucceedRate: 1 TargetName: typeA_172.41.0.10:53_kubernetes.default.svc.cluster.local TargetProtocol: udp TargetServer: 172.41.0.10:53 succeed: true targetNumber: 1 targetType: kdoctor agent MaxCPU: 30.651% MaxMemory: 97.00MB netDNSTaskSpec: ... - NodeName: kdoctor-worker PodName: kdoctor-agent-krrnp ReportType: agent test report RoundDuration: 10.024533428s RoundNumber: 1 RoundResult: succeed StartTimeStamp: "2023-08-01T09:09:39Z" EndTimeStamp: "2023-08-01T09:09:49Z" TaskName: netdns.netdns-cluster TaskType: Netdns netDNSTask: detail: - FailureReason: null MeanDelay: 0.58 Metrics: ... Succeed: true SucceedRate: 1 TargetName: typeA_172.41.0.10:53_kubernetes.default.svc.cluster.local TargetProtocol: udp TargetServer: 172.41.0.10:53 succeed: true targetNumber: 1 targetType: kdoctor agent MaxCPU: 30.651% MaxMemory: 97.00MB netDNSTaskSpec: ... ReportRoundNumber: 1 RoundNumber: 1 Status: Finished TaskName: netdns-cluster TaskType: Netdns
若报告与预期结果不符合,可关注报告中的 MaxCPU和 MaxMemory 字段,对比 agent 资源是否充足,调整 agent 的资源限制。
集群外 DNS server 测试
下面是携带 body 的 http 请求示例和 https 的请求示例:
-
创建
NetDns
任务,该任务将执行一轮持续 10s 的任务,任务会向指定的 DNS server 以 QPS 为 10 的速度进行 UDP 请求kubernetes.default.svc.cluster.local
域名的 typeAAAA,并且立即执行。这里使用 server 的 service 地址,若有其他 server 地址 可使用其他 server 地址。
创建
NetDns
SERVER="172.41.71.0" apiVersion: kdoctor.io/v1beta1 kind: Netdns metadata: name: netdns- user spec: expect: meanAccessDelayInMs: 1500 successRate: 1 request: domain: kubernetes.default.svc.cluster.local durationInSecond: 10 perRequestTimeoutInMS: 1000 protocol: udp qps: 10 schedule: roundNumber: 1 roundTimeoutMinute: 1 schedule: 0 1 target: targetUser: port: 53 server: ${SERVER} EOF
环境清理
kubectl delete netdns netdns-cluster netdns- user