Please enable Javascript to view the contents

开启 Kubernetes 监控并实施压力测试

 ·  ☕ 4 分钟

1. Kubectl 基本命令

1.1 创建对象

1
2
3
4
5
6
7
8
# 创建资源,也可以使用远程 URL
kubectl create -f ./my.yaml
# 使用多个文件创建资源
kubectl create -f ./my1.yaml -f ./my2.yaml
# 使用目录下的所有清单文件来创建资源
kubectl create -f ./dir
# 启动一个 nginx 实例
kubectl run nginx --image=nginx

1.2 显示和查找资源

1
2
3
4
5
6
7
8
# 列出所有 namespace 中的 service
kubectl get services
# 列出所有 namespace 中的 pod
kubectl get pods --all-namespaces
# 列出 kube-system 中的 pod
kubectl get pods -n kube-system
# 列出所有 pod 并显示详细信息
kubectl get pods -o wide

1.3 更新资源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 滚动更新 pod frontend-v1
kubectl rolling-update frontend-v1 -f frontend-v2.json
# 更新资源名称并更新镜像
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
# 更新 frontend pod 中的镜像
kubectl rolling-update frontend --image=image:v2
# 强制替换,删除后重新创建资源。会导致服务中断。
kubectl replace --force -f ./pod.json
# 为 nginx RC 创建服务,启用本地 80 端口连接到容器上的 8000 端口
kubectl expose rc nginx --port=80 --target-port=8000

1.4 删除资源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 删除 pod.json 文件中定义的类型和名称的 pod
kubectl delete -f ./pod.json
# 删除名为 "baz" 的 pod 和名为 "foo" 的 service
kubectl delete pod, service baz foo
# 删除具有 name=myLabel 标签的 pod 和 serivce
kubectl delete pods, services -l name=myLabel
# 删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的
kubectl delete pods, services -l name=myLabel --include-uninitialized
# 删除 my-ns namespace 下的所有 pod 和 serivce,包括尚未初始化的
kubectl -n my-ns delete po,svc --all

1.5 与运行中的 Pod 交互

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 流式输出 pod 的日志(stdout
kubectl logs -f my-pod
# 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
kubectl logs -f my-pod -c my-container
# 交互式 shell 的方式运行 pod
kubectl run -i --tty busybox --image=busybox -- sh
 # 连接到运行中的容器
kubectl attach my-pod -i
# 在已存在的容器中执行命令(pod 中有多个容器的情况下)
kubectl exec my-pod -c my-container -- ls /

2. Dashboard 简介

Kubernetes Dashboard 是一个管理 Kubernetes 集群的全功能 Web 界面,旨在以 UI 的方式完全替代命令行工具(kubectl 等)。

在 Dashboard 页面上,可以查看 Kubernetes 的集群状态,对集群进行相关的操作。但是,Dashboard 无法图形化展现集群度量指标信息,需要安装 Heapser 插件。

下面来了解一下 Kubernetes 的监控系统,并配置监控试试。

3. 监控系统

架构图如下:

  • cAdvisor,是 Kubelet 内置的容器资源收集工具。它会自动收集本机容器 CPU、内存、网络和文件系统的资源占用情况,并对外提供 API。
  • InfluxDB,是一个开源分布式时序、事件和指标数据库。
  • Grafana,是 InfluxDB 的 Dashboard,提供了强大的图表展示功能。常和 InfluxDB 组合使用,展示图表化的监控数据。
  • Heapster,提供了整个集群的资源监控,并支持持久化数据存储到 InfluxDB 等后端存储。
  • kube-state-metrics,除了配置 cAdvisor、Heapster、Influx、Grafana,还可以考虑部署 kube-state-metrics。kube-state-metrics 会轮询 Kubernetes API 调度了多少个replicas、现在可用的有几个、多少个 Pod 是 running、stopped、terminated 状态、Po 重启了多少次。

4. 配置监控

获取官方配置 yaml:

1
2
3
4
5
6
git clone https://github.com/kubernetes/heapster.git
# 查看 yaml 配置列表
ls -l deploy/kube-config/influxdb/
grafana.yaml
heapster.yaml
influxdb.yaml

Heapster、InfluxDB、Grafana 均以 Pod 的形式启动和运行,创建 Pod:

1
2
3
4
5
6
7
8
kubectl create -f deploy/kube-config/influxdb/
deployment.extensions/monitoring-grafana created
service/monitoring-grafana created
serviceaccount/heapster created
deployment.extensions/heapster created
service/heapster created
deployment.extensions/monitoring-influxdb created
service/monitoring-influxdb created

可能需要等待几分钟,Pod 才会处于 Running 状态:

1
2
3
4
5
kubectl get pods -n kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
heapster-7ff8d6bf9f-ngb9p               1/1       Running   0          31m
monitoring-grafana-68b57d754-4qwjm      1/1       Running   0          31m
monitoring-influxdb-cc95575b9-5j556     1/1       Running   0          31m

配置完毕之后,发现 Dashboard 并没有显示 CPU、内存等信息,查看 Heapser 日志:

1
2
kubectl logs -f heapster-7ff8d6bf9f-ngb9p  -n kube-system
1 reflector.go:190] k8s.io/heapster/metrics/util/util.go:30: Failed to list *v1.Node: nodes is forbidden: User "system:serviceaccount:kube-system:heapster" cannot list nodes at the cluster scope

提示缺角色,无权访问。新增授权:

1
2
kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml
clusterrolebinding.rbac.authorization.k8s.io/heapster created

更新 Heapser:

1
kubectl replace --force -f deploy/kube-config/influxdb/heapster.yaml

再次查看 Dashboard,Nodes 和 Pods 中,可以非常直观的看到 CPU 和 MEM 的使用情况。

5. 压力测试

下面 Apache 提供的 ab 工具,对 Kubernetes 托管的 Nginx 服务进行简单的压力测试实验。

5.1 安装 Apache

安装 Apache 可以使用 Chocolatey ,也可以使用官方提供的 Windows 安装包

1
choco install apache-httpd

5.2 执行测试

硬件配置:

  • CPU,i7-4790,3.6G,4 核 8 线程
  • MEM,16 GB
  • VirtualBox,5.2.8

分配给 minikube 虚拟机 2 核 CPU,2 GB MEM

软件版本:

  • Windows 7
  • Minikube 0.28.2
  • Nginx 1.15.4
  • ApacheBench 2.3

压测开始后,在 Dashboard 看到 CPU 和内存使用量也陡增。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ab -c 125 -n 400000 http://192.168.99.100:31925/
//并发请求数
Concurrency Level:      125
//整个测试持续的时间
Time taken for tests:   317.350 seconds
//完成的请求数
Complete requests:      400000
//失败的请求数
Failed requests:        0
//吞吐率
Requests per second:    1260.44 [#/sec] (mean)
//用户平均请求等待时间
Time per request:       99.172 [ms] (mean)
//服务器平均请求处理时间
Time per request:       0.793 [ms] (mean, across all concurrent requests)

一个 Pod

并发请求数 125 250 500 1000
持续时间(second) 317 265 313 338
吞吐率(/second) 1260 1508 1276 1182
用户平均请求等待时间(ms) 99 165 391 845
服务器平均处理时间(ms) 0.79 0.66 0.78 0.845

两个 Pod

并发请求数 125 250 500 1000
持续时间(second) 329 311 337 375
吞吐率(/second) 1213 1284 1186 1065
用户平均请求等待时间(ms) 102 194 421 938
服务器平均处理时间(ms) 0.824 0.778 0.843 0.939

从上面的表格可以看到,在一定的硬件环境下,Nginx 服务:

  • 增加 Pod 数量,并不能显著增加服务质量(吞吐率和用户等待时间)

6. 参考


微信公众号
作者
微信公众号