[TOC]
---
##### **Q:测试过程中,发现经常有虚拟节点NotReady?过一会又好了?**
A:经过排查,发现只有10-14主机上的有这个问题,而这几台主机上有650个Pod,其他主机是500个Pod。这些主机发现ssh上去需要很久,而且ping 127.0.0.1时会有`ping: sendmsg: Invalid argument`的报错。当调整了external集群节点的如下参数,就好了:
```
net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 10240
```
---
##### **Q:在load测试中发现,测试结果显示成功,但Grafana中SLO这个dashboard中的API调用延时还是超过threshold?而Experimental中的API调用延时却没有超过threshold?**
A:根据源码,latency_query用的windows是一分钟,也就是Experimental中,所以Experimental中没有超过threshold,测试也是成功的。
---
##### **Q:PodStartupLatency中,Pod的启动时间是从create到watch,而在测试中我们发现调度吞吐量只有80个/秒,如果一次性创建1000个Pod,那不是要12.5秒才能把所有的Pod调度成功,那不会超过5秒的阈值吗?**
A:这个可能是因为kube-controller-manager每秒钟只能创建不超过80个Pod(被kube-api-qps参数限制),所以不会有大量Pod被同时创建。
---
##### **Q:PodStartupLatency中,我们发现500个Latency Pod中有将近100个Pod的schedule_to_run的时间超过了20秒,但所有Pod的pod_startup(create_to_watch)时间却没有超过5秒,这是为什么?**
```
"dataItems": [
...
{
"data": {
"Perc50": 0,
"Perc90": 26426.999372,
"Perc99": 26890.430573
},
"unit": "ms",
"labels": {
"Metric": "schedule_to_run"
}
},
...
{
"data": {
"Perc50": 1358.349293,
"Perc90": 1915.898719,
"Perc99": 2206.542551
},
"unit": "ms",
"labels": {
"Metric": "pod_startup"
}
}
]
```
A:通过修改clusterloader2源码打印Pod的四个阶段的时间点,我们发现有些Pod的watch的时间点比run的时间点要早
> map[test-xfs9b7-1/latency-deployment-0-755db5fb5d-bb7v7:map[create:2022-09-07 16:49:52 +0800 CST run:2022-09-07 16:50:19 +0800 CST schedule:2022-09-07 16:49:52.36205469 +0800 CST watch:2022-09-07 16:49:53.358585277 +0800 CST m=+340.455753216] test-xfs9b7-1/latency-deployment-1-5cf86787f8-q64ls:map[create:2022-09-07 16:49:52 +0800 CST run:2022-09-07 16:49:52 +0800 CST schedule:2022-09-07 16:49:52.556760051 +0800 CST watch:2022-09-07 16:49:53.615868179 +0800 CST m=+340.713036120] ...
很明显这不合理。watch的时间是clusterloader2收到Pod为Running事件时的时间点,它是以clusterloader2所在主机的时间为准,而run的时间点是hollow-node的时间,所以怀疑是该Pod所在的hollow-node的时间与clusterloader2所在主机的时间不一致。最终发现的确是这个原因,有问题的Pod都是在11主机上,该主机是后来加进来的,没有和clusterloader2主机做时间同步。
---
##### **Q:在grafana的SLO这个dashboard中,经常看到有{resource="services", subresource="proxy", scope="resource", verbs="GET"}超过了threshold,但测试结果却是Success?**
![](https://img.kancloud.cn/dc/26/dc26f994399ebbd47ac7fa030cfa04e6_3642x558.png)
A:在clusterloader2中,是不会统计`subresource="proxy"`的,源码如下:
```
filters = `verb!="WATCH", subresource!~"log|exec|portforward|attach|proxy"`
```
因为上面的这些API是属于streaming API,而在SLI的定义中,是说Non-streaming API。通过clusterloader2测试时打印的日志也可以看到它的统计方式:
```
I0908 16:12:04.582486 23317 prometheus.go:109] Executing "quantile_over_time(0.99, apiserver:apiserver_request_latency_1m:histogram_quantile{verb!=\"WATCH\", subresource!~\"log|exec|portforward|attach|proxy\"}[95m])" at 2022-09-08T16:12:04+08:00
```
---
##### **Q:在load测试中,发现主机的网络流量特别大,发包达300MiB/s,这是为什么?**
![](https://img.kancloud.cn/49/62/49625c0637c53956f740dc808a02d95c_3629x613.png)
A:这里因为某类资源的watch事件比较多,如下为service与endpoints的watch流量:
![](https://img.kancloud.cn/29/91/299184880b6a08807d49fd0cf4332c1d_3658x1508.png)
而造成这一现象的原因是,当创建一个Service对象时,apiserver需要给controller-manager发送一个事件(因为controller-manager需要根据service创建对应的Endpoints),同时apiserver还要给每个节点的kube-proxy发送一个事件(因为kube-proxy要根据service及endpoints对象更新本机的iptables或ipvs规则)。当节点规模太大的时候,创建service需要发送的event就很多。而且,当创建了一个endpoints时,apiserver还要给每个节点上的kube-proxy发送一个event。
在load测试中,6000节点时,会创建9720个service。
##### **Q:在load测试中,为什么services与endpoints这两类资源的list操作的API调用经常超过阈值而导致测试失败?**
A:我们检查了etcd的各项性能指标,目测都在正常范围内。检查apiserver中关于etcd的metrics,发现apiserver在调用etcd来list services时,99%的延时最大也就200多毫秒,应该也正常:
![](https://img.kancloud.cn/f7/d7/f7d7a1295a6d92a56faab01a1a079b5e_3648x1690.png)
但是在load测试过程中,我们发现有上千个Node会变成NotReady状态:
![](https://img.kancloud.cn/b6/23/b623fda0dc24ccaa9063e9d02c395799_3623x591.png)
我们发现,External集群的节点,CPU与内存的使用率已经快到100%,而且有些节点的Prometheus在压测过程中还出现停止上报数据的情况:
![](https://img.kancloud.cn/d7/7c/d77c0532652a44cd3b7eba8cad6327b2_1862x1285.png)
External节点的资源被耗尽猜测是由于这上面的hollow-pod接收了大量的apiserver发送的service与endpoints的event所造成。
当这上千个hollow-pod重启恢复正常时,就会list所有的services与endpoints。6000节点时有9720个service与9720个endpoints,`kubectl get service --all-namespaces -o yaml > service.output` 得到的service.output的文件大小有xxM,那么apiserver要发送给1000个hollow-pod,相当于要发送xx * 1000 M,约为xxG,如果Master主机为万兆网卡,那么发送完成需要的时间为 `xx/1.25` 秒。
要解决这个问题,有几种优化方法:(1)给External集群增加物理资源,保持Hollow Pod的稳定性(2)增加kubemark-master节点,比如增加至5个,减少每个kube-apiserver发送事件的数量(比如5个kube-apiserver,6000节点,那么
- 常用命令
- 安装
- 安装Kubeadm
- 安装单Master集群
- 安装高可用集群(手动分发证书)
- 安装高可用集群(自动分发证书)
- 启动参数解析
- certificate-key
- ETCD相关参数
- Kubernetes端口汇总
- 安装IPv4-IPv6双栈集群
- 下载二进制文件
- 使用Kata容器
- 快速安装shell脚本
- 存储
- 实践
- Ceph-RBD实践
- CephFS实践
- 对象存储
- 阿里云CSI
- CSI
- 安全
- 认证与授权
- 认证
- 认证-实践
- 授权
- ServiceAccount
- NodeAuthorizor
- TLS bootstrapping
- Kubelet的认证
- 准入控制
- 准入控制示例
- Pod安全上下文
- Selinux-Seccomp-Capabilities
- 给容器配置安全上下文
- PodSecurityPolicy
- K8S-1.8手动开启认证与授权
- Helm
- Helm命令
- Chart
- 快速入门
- 内置对象
- 模板函数与管道
- 模板函数列表
- 流程控制
- Chart依赖
- Repository
- 开源的Chart包
- CRD
- CRD入门
- 工作负载
- Pod
- Pod的重启策略
- Container
- 探针
- 工作负载的状态
- 有状态服务
- 网络插件
- Multus
- Calico+Flannel
- 容器网络限速
- 自研网络插件
- 设计文档
- Cilium
- 安装Cilium
- Calico
- Calico-FAQ
- IPAM
- Whereabouts
- 控制平面与Pod网络分开
- 重新编译
- 编译kubeadm
- 编译kubeadm-1.23
- 资源预留
- 资源预留简介
- imagefs与nodefs
- 资源预留 vs 驱逐 vs OOM
- 负载均衡
- 灰度与蓝绿
- Ingress的TLS
- 多个NginxIngressController实例
- Service的会话亲和
- CNI实践
- CNI规范
- 使用cnitool模拟调用
- CNI快速入门
- 性能测试
- 性能测试简介
- 制作kubemark镜像
- 使用clusterloader2进行性能测试
- 编译clusterloader2二进制文件
- 搭建性能测试环境
- 运行density测试
- 运行load测试
- 参数调优
- Measurement
- TestMetrics
- EtcdMetrics
- SLOMeasurement
- PrometheusMeasurement
- APIResponsivenessPrometheus
- PodStartupLatency
- FAQ
- 调度
- 亲和性与反亲和性
- GPU
- HPA
- 命名规范
- 可信云认证
- 磁盘限速
- Virtual-kubelet
- VK思路整理
- Kubebuilder
- FAQ
- 阿里云日志服务SLS