我进行了有关K8s指标监控和日志分析的调查备忘录

Kubernetes的CNCF项目文件种类繁多,包括旧版本的、新版本的、目标宣言等等,其中令人困惑的是难以确定应该采纳哪个版本。当然,最好是结合云服务提供商的文档一同查阅,但即便如此,基本的知识仍需从开源项目的资料中学习…由于存在这样一种态度,让人觉得学习Kubernetes技术很困难。

这次我要记录下关于Kubernetes的任务、监控工具、日志和调试工具的一部分信息,通过调查了解到的。

本次我们将继续实际运行软件,以及在确认文档和实施的同时进行编写。 Kubernetes集群的构建和应用的YAML文件等相关内容可在https://github.com/takara9/vagrant-k8s 上找到。


核心度量管道

如果安装了 Heapster,则可以使用 kubectl top 命令。不需要操作网络浏览器,通过这个便利的命令可以以绝对值和相对值的形式获取 CPU 和内存的使用情况。可以通过 k8s 的 API 服务器端点下的路径 /apis/metrics.k8s.io/ 访问,据称提供安全性、可扩展性和可靠性。

然而,注意事项指出”Metrics Server”未部署则无法使用。但是,按照安装指南进行操作,正如”kubectl top的执行示例”所显示的,它并未被成功安装。

kubectl top命令的示例运行

vagrant@node-1:~$ kubectl top node
NAME      CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
node-1    85m          8%        931Mi           49%       
node-2    37m          3%        846Mi           44%       
node-3    32m          3%        1342Mi          70%       

vagrant@node-1:~$ kubectl top pod
NAME                     CPU(cores)   MEMORY(bytes)   
nginx-6f596bfb6d-dc5l6   0m           2Mi             

vagrant@node-1:~$ kubectl top pod --all-namespaces
NAMESPACE     NAME                                    CPU(cores)   MEMORY(bytes)   
default       nginx-6f596bfb6d-dc5l6                  0m           2Mi             
kube-system   elasticsearch-59d89bf8d-wlp4h           6m           793Mi           
kube-system   etcd-node-1                             8m           53Mi            
kube-system   fluentd-9rbz6                           2m           72Mi            
kube-system   fluentd-9wnp9                           2m           77Mi            
kube-system   heapster-69b5d4974d-84d9n               0m           28Mi            
kube-system   kibana-7959c48fd-8glxv                  3m           235Mi           
kube-system   kube-apiserver-node-1                   16m          239Mi           
kube-system   kube-controller-manager-node-1          23m          39Mi            
kube-system   kube-dns-86f4d74b45-plmnd               0m           23Mi            
kube-system   kube-flannel-ds-8g82w                   1m           9Mi             
kube-system   kube-flannel-ds-bfj67                   1m           9Mi             
kube-system   kube-flannel-ds-tz9nj                   1m           10Mi            
kube-system   kube-proxy-5lcb5                        1m           10Mi            
kube-system   kube-proxy-g75c9                        1m           10Mi            
kube-system   kube-proxy-vjph7                        2m           10Mi            
kube-system   kube-scheduler-node-1                   7m           11Mi            
kube-system   kubernetes-dashboard-7d5dcdb6d9-lzl86   0m           16Mi     

当查看源代码https://github.com/kubernetes-incubator/metrics-server时,我们可以看到”metrics-server”位于”kubernetes-incubator”中。同时,在https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md中,可以看到该提案被接纳为Kubernetes的设计方案。

从这样的信息来看,除非是通过k8s的安装程序正常安装,否则这里的依赖性来得太早了。


资源监控工具涵盖了计算、存储和网络的监测。

(用于监控计算、存储和网络资源的工具)

在本章中,我們經常引用下圖作為Kubernetes監控的架構。從這張圖中可以理解到,Heapster常駐在一個節點上,與自身所在的節點以及其他所有節點的kubelet進行協作,並將數據傳送到儲存後端。

スクリーンショット 2018-05-06 10.18.18.png

Kubelet: 立方体

Kubelet作为Kubernetes主节点和每个节点之间的桥梁发挥作用。Kubelet将每个Pod转换为配置容器,并从cAdvisor获取各个容器的使用统计。然后,通过REST API公开聚合的Pod资源使用统计。

有关cAdvisor的信息

顾问是一个用于监控开源容器资源使用情况和性能分析的代理工具。它专为容器而设计,并原生支持Docker容器。在Kubernetes中,cAdvisor已集成到Kubelet二进制文件中。cAdvisor会自动检测机器上的所有容器,并收集CPU、内存、文件系统和网络使用统计信息。也就是说,cAdvisor是作为kubelet的一部分运行的。文档中提到它在端口4194提供Web UI,但是目前(1.10版本),由于安全考虑,k8s安装程序的软件包已关闭了4194端口,所以请注意不要仅凭文档内容相信。另外,所述的Prometheus是一个用于抓取度量指标的时序数据库,但如果不将端口号更改为10255,将无法收集指标数据。

vagrant@node-1:~$ cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |grep cadvisor
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"

堆战士

目前,在Kubernetes的官方仪表板中,使用Heapster来显示CPU/内存使用率指标。虽然有一个开放的功能需求,要求仪表板支持Prometheus和其他可插件监控解决方案,但目前来说,Heapster对于任何生产级集群来说都是必不可少的组件。

Heapster的功能摘要如下:

    • モニターおよびイベント・データをKubernetesクラスター全体から集約する

 

    • ネイティブにサポートされ, すべてのバージョンで動作

 

    • クラスタ内でポッドとして動作、アプリケーション実行と同様

 

    • クラスタ内のすべてのノードを検出し、各ノードのKubeletから情報を収集、Kubeletは、cAdvisorからデータを取得

 

    • 関連するラベルとともにポッドで情報をグループ化、ストレージとビジュアライゼーションのために構成可能なバックエンドにプッシュ

 

    現在サポートされているバックエンドには、InfluxDB(視覚化のためのGrafana)

存储后端

InfluxDB和Grafana正在被介绍。与目前流行的Prometheus和Grafana组合相比,这个组合提供了专用容器,可以立即开始使用,非常方便。

Heapster-InfluxDB-Grafana 示例执行

以下使用的 YAML 文件是根据 https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb 在 k8s 1.10 的 vagarant 环境下进行了修正以使其正常运行。由于事先已经运行了 heapster 以执行 ‘kubectl top’,因此它保持不变。只需应用这四个 YAML 文件,即可创建上面提到的配置,并在 Grafana 的 web 页面上进行监控。

vagrant@node-1:~$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-influxdb/heapster-rbac.yaml
clusterrolebinding.rbac.authorization.k8s.io "heapster" configured

vagrant@node-1:~$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-influxdb/heapster.yaml
serviceaccount "heapster" unchanged
deployment.extensions "heapster" unchanged
service "heapster" unchanged

vagrant@node-1:~$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-influxdb/influxdb.yaml
deployment.extensions "monitoring-influxdb" created
service "monitoring-influxdb" created

vagrant@node-1:~$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-influxdb/grafana.yaml
deployment.extensions "monitoring-grafana" created
service "monitoring-grafana" created

vagrant@node-1:~$ kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
heapster               ClusterIP   10.244.216.216   <none>        80/TCP                          1h
monitoring-grafana     NodePort    10.244.20.94     <none>        80:31500/TCP                    24s
monitoring-influxdb    ClusterIP   10.244.163.105   <none>        8086/TCP                        48s

InfluxDB – Grafana 监控界面

您可以通过在浏览器中输入 http://(节点1的IP地址):31500/ 来访问Grafana页面,这是在前面提到的YAML应用结果中的vagrant虚拟服务器。如果您使用了GitHub Vagrantfile的设置,则IP地址将会是192.168.1.91。

スクリーンショット 2018-05-06 11.15.15.png

仪表板模板和普及情况

如果一个这么方便简便的工具能被广泛使用并成为主流工具,那真让人想这么想。但现实却不是这样。当在社区中使用条件:InfluxDB 来搜索创建的仪表板时,只能找到五个仪表板,而且下载数量也不到1000。

スクリーンショット 2018-05-06 11.26.14.png

Kubernetes 管理面板 (Kubernetes

既然已经运行了Heapster,我想看一下仪表盘的图表。请参考K8s on Vagrant、仪表盘的设置方法。如果Heapster没有运行,则CPU使用率和内存使用率的饼图将不会显示。

スクリーンショット 2018-05-06 11.31.52.png

在下一个Pod的总结界面上,如果Heapster没有运行,将不会显示CPU(核心数量)和内存(字节)列。

スクリーンショット 2018-05-06 11.32.12.png

普罗米修斯

当我听到”Prometheus”这个词时,不知为何我就联想到《银河铁道999》中温柔美丽的梅缇儿的吓人的妈妈,普罗米修斯。普罗米修斯(Promethium)是元素Pm的名字,尽管尚未发现自然存在的普罗米修斯,但于1945年首次在核分裂产物中确认了其存在,因此元素以希腊神话中英雄普罗米修斯从天上偷火而被铁链束缚在岩石上的故事而得名。

不重要的话题就到此为止吧,

Prometheus原本是一个在SoundCloud上构建的开源系统监视和警报工具包。自2012年创立以来,许多企业和组织都采用了Prometheus,并且该项目拥有活跃的开发者和用户社区。它目前是一个独立的开源项目,并且受到独立管理,以强调这一点并明确项目的治理结构,Prometheus在2016年作为Kubernetes之后的第二个主机项目加入了Cloud Native Computing Foundation。可以在https://prometheus.io/docs/introduction/overview/中找到有关Prometheus的特点和其擅长的用例的描述。

Prometheus是一种软件,被称为cAdvisor、node-exporter、kube-state-metrics等度量收集器,用于按节点、容器和Pod等单位收集CPU、内存和网络等使用量数据。

在使用Prometheus时,可以通过在prometheus.yaml文件中定义度量收集器作业来进行设置。例如,可以每10秒收集一次信息并进行累积。在k8s中使用Prometheus时,需要将prometheus.yaml设置为ConfigMap,并在命名空间下的集群环境中进行管理,然后在Prometheus的Pod中挂载ConfigMap作为卷进行使用。

以下是对于Prometheus的执行案例,通过自定义适用于vagrant的k8s集群,并应用了https://github.com/takara9/vagrant-k8s/tree/master/mon-prometheus上的YAML文件。

vagrant@node-1:/vagrant$ kubectl top node
NAME      CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
node-1    83m          8%        968Mi           50%       
node-2    37m          3%        848Mi           44%       
node-3    34m          3%        1418Mi          74% 

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/rbac.yaml 
clusterrolebinding.rbac.authorization.k8s.io "kube-state-metrics" created
clusterrole.rbac.authorization.k8s.io "kube-state-metrics" created
serviceaccount "kube-state-metrics" created
clusterrolebinding.rbac.authorization.k8s.io "prometheus" created
clusterrole.rbac.authorization.k8s.io "prometheus" created
serviceaccount "prometheus-k8s" created

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/node-exporter.yaml 
daemonset.extensions "node-exporter" created

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/kube-state-metrics.yaml 
deployment.extensions "kube-state-metrics" created

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/prometheus-configmap.yaml 
configmap "prometheus-core" created
configmap "prometheus-rules" created

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/prometheus.yaml 
deployment.extensions "prometheus-core" created
service "prometheus" created

vagrant@node-1:/vagrant/prometheus$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-prometheus/grafana.yaml 
deployment.extensions "grafana-prometheus" created
service "grafana-prometheus" created

vagrant@node-1:/vagrant/prometheus$ kubectl top node
NAME      CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
node-1    126m         12%       992Mi           52%       
node-2    171m         17%       874Mi           46%       
node-3    189m         18%       1525Mi          80%     

Grafana安装设置

如果您未更改上述设置,则可以在 http://192.168.1.91:31510/ 上看到Grafana的登录页面。您可以使用admin/admin登录到Grafana。

スクリーンショット 2018-05-06 13.21.28.png

数据源的设置

刚才使用的是专为InfluxDB创建的Grafana容器,所以无需进行设置操作,但是这里需要进行设置操作。请在接下来的界面上点击”添加数据源”。

スクリーンショット 2018-05-06 13.21.45.png

在设置界面中,需要输入三个地方。在“名称”处设置一个能够识别数据源的名称。在“类型”处选择Prometheus,因为它是一个选择列表。最后,在HTTP URL字段中设置为http://prometheus:9090,并点击“保存并测试”。如果显示出“数据源正常工作”,则完成。

スクリーンショット 2018-05-06 13.22.35.png

仪表板选项

点击侧边栏的仪表盘图标,然后点击屏幕上的“首页”显示,即可打开下一个画面。然后点击右侧菜单的最底部的“在Grafana.com上查找仪表盘”。

スクリーンショット 2018-05-06 13.23.49.png

在另一个标签页上,出现了Grafana.com的仪表板搜索页面。在那里,将”Filter by:”字段设置如下,以便缩小仪表板范围:在数据源中选择”Prometheus”,在此列表中搜索”kubernetes”,将显示与Kubernetes相关的Prometheus仪表板。在这些仪表板中,选择下载次数第二多的仪表板进行点击。

スクリーンショット 2018-05-06 13.25.39.png

由于控制面板上显示了一个编号,您可以选择将其复制到剪贴板上或者记住该编号。然后回到导入页面,输入该编号并点击“加载”按钮。

スクリーンショット 2018-05-06 13.26.16.png

从数据源中选择在Prometheus中设置的名称。这样,监控k8s集群的仪表板将显示出来。这很简单。而且,仪表板上有许多由社区创建的资产,所以即使不熟悉Grafana,也可以在各种视图中查看。

スクリーンショット 2018-05-06 13.26.51.png

设置度量集合器

在下一个画面中,Prometheus可以通过对Metric Collector进行轮询并收集情况来查看。这是通过在NodePort上打开Prometheus服务并通过浏览器访问来查看的。在这里,可以通过访问http://192.168.1.91:31600/target来查看。这表示它是由prometheus.yaml文件中定义的作业执行结果,并且如果存在不适当的配置,则会显示为DOWN在State列中。

スクリーンショット 2018-05-06 13.55.07.png

这个 Prometheus 的配置已经以 ConfigMap 的形式部署到环境中,因此您可以列出 configmap,确认名称并进行编辑。您也可以使用原始的 YAML 文件 prometheus-configmap.yaml 进行编辑。

vagrant@node-1:~$ kubectl get configmap -n kube-system
NAME                                 DATA      AGE
prometheus-core                      1         1h

vagrant@node-1:~$ kubectl edit configmap prometheus-core -n kube-system

编辑文件后,如果想要使更改生效,请删除相应的文件夹并重启系统,以便应用设置。

$ kubectl get po -n kube-system |grep prometheus-core
prometheus-core-7c5bfbb4d4-sf79n        1/1       Running   0          1h

$ kubectl delete po prometheus-core-7c5bfbb4d4-sf79n -n kube-system 
pod "prometheus-core-7c5bfbb4d4-sf79n" deleted

$ kubectl get po -n kube-system |grep prometheus-core
prometheus-core-7c5bfbb4d4-9zjr7        0/1       ContainerCreating   0          18s

$ kubectl get po -n kube-system |grep prometheus-core
prometheus-core-7c5bfbb4d4-9zjr7        1/1       Running   0          26s

普罗米修斯操作员(Pu Luo Mi Xiu Si Cao Zuo Yuan)

Kubernetes AddOn中的Prometheus代码是用于E2E测试的,对于生产使用,建议确认成熟的设置,如Kubernetes Operator或Kube-Prometheus等。在KubeCon2018的RedHat主题演讲中,还介绍了操作员框架,因此认为这是一个值得关注的项目。


日志分析 ElassticSearch

在并行分布式集群的执行环境中,如果在构成集群的服务器中每个都输出日志,那么日志的分析和问题判断将会变得非常困难。为了解决这个问题,在集群环境中通常使用日志传送工具fluentd将日志积累到全文搜索数据库ElasticSearch中,并利用浏览器UI Kibana进行可视化和分析。Kubernetes的集群环境也面临同样的情况。

ElasticSearch,Kibana和Fluentd都可以作为容器,在DockerHub上公开,并且可以在Kubernetes上使用。此外,还有适用于生产环境的YAML文件配置等。

然而,Elasticsearch是一款针对大规模日志分析而设计的工具,因此在生产环境的配置下,无法轻松地在小小的vagrant上运行。所以,我们将构建一个开发者模式下的Elasticsearch环境,并进行验证。

以下的三个YAML文件是为标准RBAC环境定制的Fluentd、用于Vagrant环境的Elasticsearch和Kibana。

$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-elasticsearch/elasticsearch.yaml

$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-elasticsearch/kibana.yaml

$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-elasticsearch/fluentd-daemonset-elasticsearch-rbac.yaml
スクリーンショット 2018-05-06 14.52.15.png

使用NGINX进行试用日志分析

提供以下的YMAL,建立一个NGINX服务器,使用curl来连续访问,并输出访问日志,然后使用ElassticSearch进行收集,最后在Kibana中进行图形化呈现。

$ kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-k8s/master/mon-elasticsearch/nginx.yaml

$ imac:~ maho$ while true; do curl http://192.168.1.91:32000/;sleep 1; done
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
...continue...
スクリーンショット 2018-05-06 15.32.55.png

总结

我来列举一下今次我所理解到的内容。单纯阅读文档并不能形成正确的理解,只有实际运行并亲自体验后,我才深刻体会到还有很多东西是需要通过实际动手去理解的。

    • CNCFプロジェクトTask, Moniror, Log and Debugの幾つかの文書は古かったり、早すぎるものがあり、読者自身が吟味しなければならない。

 

    • Metrics_server は、インキュベーションレベルであり、インストーラによるセットアップでは導入されない。

 

    • Heapsterは、ダッシュボードやkubectl topコマンドで、CPUやメモリの使用量を表示するために必須なコンポーネントである。

 

    • Heapster – InfluxDB – Grafana は簡単に設定できて便利であるが、利用者は少数であり、コミュニティも活発ではない。

 

    • Prometheus – Grafana の組み合わせは、活発で、メトリックス・コレクタ、Grafanaダッシューボードなども活発な活動が続いている。

 

    • Prometheusオペレータ、kube-Prometheusは、注目しておくべき、プロジェクトであろうと思う。

 

    Fluentd – ElassticSeach – Kibana は、k8sでもログ分析の主流である、しかし、Javaで開発されている事もあり、大量のメモリを消費するため、本番運用時には注意が必要である。

关于Vagrant上运行的Kubernetes的其他文章

这篇文章是记录在我自己的MacOS上使用Vagrant环境构建小型Kubernetes集群并进行验证的一部分。到目前为止,我已经在Vagrant虚拟服务器的k8s集群中进行了以下验证工作,以下是相关链接供参考。

    1. 用Vagrant搭建Kubernetes v1.10集群的记录

 

    1. 关于Vagrant上Kubernetes节点故障时的行为验证

 

    1. 在Vagrant上设置Kubernetes仪表盘

 

    1. 使用Vagrant的NFS持久卷的使用记录

 

    1. 使用Vagrant的NGINX Ingress Controller

 

    1. 在Vagrant上添加和删除Worker节点

 

    1. 使用kube-keepalived-vip在Vagrant上进行服务IP设置

 

    使用MetalLB BGP ECMP在Vagrant上进行负载均衡器验证
广告
将在 10 秒后关闭
bannerAds