基于 Kubernetes 的 Admission controller webhook 机制的混沌网络测试工具。
# deploy kntool make image make deploy kubectl label name test-ns kntool-inject=enabled # deploy test app kubectl apply app.yml or helm insall ...
kubectl get pod test-pod-name -o yaml | grep podIP
ping podIP
curl podIP:2332/latency/100ms
ping podIP- 抽象 tc 接口,支持多种实现
- 实现 Server Client 注册交互
- 实现 Server Dashboard
流量控制(Traffic Control, tc)是 Linux 内核提供的流量限速、整形和策略控制机制。
它以 qdisc-class-filter 的树形结构来实现对流量的分层控制。
在 Debian 中,tc 命令工具与 iproute2 软件包捆绑在一起:
apt-get install iproute2
Traffic control processing of network data
Linux 操作系统中的流量控制器 TC(Traffic Control)用于 Linux 内核的流量控制, 主要是通过在输出端口
处建立一个队列来实现流量控制。 Linux 流量控制的基本原理如下图所示。接收包从输入接口(Input Interface)
进来后, 经过流量限制(Ingress Policing)丢弃不符合规定的数据包, 由输入多路分配器(Input De-Multiplexing)
进行判断选择:如果接收包的目的是本主机, 那么将该包送给上层处理;否则需要进行转发,将接收包交到转发块
(Forwarding Block)处理。 转发块同时也接收本主机上层(TCP、UDP 等)产生的包。转发块通过查看路由表,
决定所处理包的下一跳。 然后,对包进行排列以便将它们传送到输出接口(Output Interface)。 一般我们只能限制网卡
发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。
流量控制包括一下几种方式:
Shaping(整形):交通成形时,其传输速度受到控制。整形可能不仅仅是降低可用带宽 - 它还可以用来消除流量突发,实现更好的网络行为。在出口处形成整形。Scheduling(调度):通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。只适于向外的流量。Policing(策略):用于处理接收到的数据。Dropping(丢弃):如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。Marking(标记)
流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和 filter(过滤器)。
qdisc通过队列将数据包缓存起来,用来控制网络收发的速度。分为无类别和有类别。class用来表示控制策略filter用来将数据包划分到具体的控制策略中
# 增加网络延时 sudo tc qdisc add dev eth0 root netem delay 1000ms # 查看流量管理 tc qdisc show # 删除策略 sudo tc qdisc del dev eth0 root netem delay 1000ms # 测试 ping 10.244.0.52 -c 10 # 模拟延迟波动 tc qdisc add dev eth0 root netem delay 100ms 10ms # 该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。还可以更进一步加强这种波动的随机性。 # 延迟波动随机性 tc qdisc add dev eth0 root netem delay 100ms 10ms 30% # 该命令将 eth0 网卡的传输设置为 100ms,同时大约有 30% 的包会延迟 ± 10ms 发送。 # 模拟网络丢包 tc qdisc add dev eth0 root netem loss 1% # 模拟包重复 tc qdisc add dev eth0 root netem duplicate 1% # 该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包
先说场景,如果我们需要在 pod 创建出来之前,对其进行配置修改或者检查,这部分工作如果放在 APIServer 里,
需要管理员在 APIServer 中将其编译成二进制文件,如果配置修改想做成自定义的形式会非常麻烦。而
Admission controllers 就是为这种场景而生的工具,以插件的形式附着到 APIServer 中,AdmissionWebhooks
就是其中一种准入插件。
K8s 的 AdmissionWebhooks 分两种:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook,
二者合起来就是一个特殊类型的 Admission controllers,一个处理资源更改,一个处理验证。
可参考如下定义:
apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: name labels: app: kntool webhooks: - name: mutating-kntool.loulan.me clientConfig: service: # 服务名称 name: kntool # 租户 namespace: "kntool" # 请求路径 path: "/mutate" # 必须提供 CA Bundle 验证服务端证书 caBundle: "$CA_BUNDLE" rules: # 监听的操作 - operations: [ "CREATE", "UPDATE" ] apiGroups: [""] apiVersions: ["v1"] # 监听的资源 resources: ["pods"] # 用户特定打上特定 label 租户才启用注入 namespaceSelector: matchLabels: kntool-inject: enabled admissionReviewVersions: ["v1", "v1beta1"] sideEffects: None timeoutSeconds: 5
通过 Kubernetes 的 Dynamic Admission Control 机制定义,在创建指定应用的时候,注入一个带有特权模式的 Pod。 这个特权模式的 Pod 带有 API 接口,可以通过 API 接口适配。然后结合可观测性的监控来优化应用。
Netflix 工程师创建了 Chaos Monkey,使用该工具可以在整个系统中在随机位置引发故障。 正如 GitHub 上的工具维护者所说:"Chaos Monkey 会随机终止在生产环境中运行的虚拟机实例和容器。" 通过 Chaos Monkey,工程师可以快速了解他们正在构建的服务是否健壮, 是否可以弹性扩容,是否可以处理计划外的故障。
混沌工程是在分布式系统上进行实验的学科,目的是建立对系统承受生产环境中恶劣条件能力的信心。