目录

    1. Kubectl 基本命令

    1.1 创建对象

    # 创建资源,也可以使用远程 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 显示和查找资源

    # 列出所有 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 更新资源

    # 滚动更新 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 删除资源

    # 删除 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 交互

    # 流式输出 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:

    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:

    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 状态:

    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 日志:

    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
    

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

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

    更新 Heapser:

    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 安装包

    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 和内存使用量也陡增。

    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

    并发请求数1252505001000
    持续时间(second)317265313338
    吞吐率(/second)1260150812761182
    用户平均请求等待时间(ms)99165391845
    服务器平均处理时间(ms)0.790.660.780.845

    两个 Pod

    并发请求数1252505001000
    持续时间(second)329311337375
    吞吐率(/second)1213128411861065
    用户平均请求等待时间(ms)102194421938
    服务器平均处理时间(ms)0.8240.7780.8430.939

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

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

    6. 参考