使用Heapster和Splunk監控Kubernetes運行性能

Kubernetes已經成為容器編排的事實上的王者,連Docker都已經向K8s女王大人低頭。對於Kubernetes的cluster的數據收集和監控已經成為IT運維的一個重要話題。我們今天來看一看如何利用Splunk最新的Metrics Store來對Kubernetes的集群進行性能監控。

部署架構

下圖是該方案的部署架構,主要包括:

  • 利用Heapster收集K8s的性能數據,包含CPU,Memory,Network,File System等
  • 利用Heapster的Statsd Sink,發送數據到Splunk的Metrics Store
  • 利用Splunk的搜索命令和儀錶盤功能對性能數據進行監控

前期準備

前期主要要準備好兩件事:

  1. 編譯最新的Heapster的鏡像,並上傳到某個公共的Docker鏡像倉庫,例如docker hub
  2. 在Splunk中配置Metrics Store和對應的網路輸入(Network Input UDP/TCP)

這裡主要要做的選擇是Statsd的傳輸協議用UDP還是TCP。這裡我推薦使用TCP。 最新的Heapster代碼支持不同的Backend,包含了log, influxdb, stackdriver, gcp monitoring, gcp logging, statsd, hawkular-metrics, wavefront, openTSDB, kafka, riemann, elasticsearch等等。因為Splunk的Metrics Store支持statsd協議,所以可以很容易的和Heapster集成。

首先我們需要利用最新的heapster代碼,編譯一個容器鏡像,因為docker hub上的heapsterd的官方鏡像的版本比較舊,並不支持statsd。所以需要自己編譯。

mkdir myheapsternmkdir myheapster/srcnexport GOPATH=myheapsterncd myheapster/srcngit clone https://github.com/kubernetes/heapster.gitncd heapsternmake containern

運行以上的命令來編譯最新的heapster鏡像。

注意,heapster預設使用udp協議,如果想要使用tcp,需要修改代碼

github.com/kubernetes/h

func (client *statsdClientImpl) open() error {ntvar err errorntclient.conn, err = net.Dial("udp", client.host)ntif err != nil {nttglog.Errorf("Failed to open statsd client connection : %v", err)nt} else {nttglog.V(2).Infof("statsd client connection opened : %+v", client.conn)nt}ntreturn errn}n

把udp改成tcp。

我在docker hub上放了兩個鏡像,分別對應udp版本的tcp版本,大家可以直接使用

  • naughtytao/heapster-amd64:v1.5.0-beta.3 udp
  • naughtytao/heapster-amd64:v1.5.0-beta.4 tcp

然後需要在Splunk中配置Metrics Store,參考這個文檔

安裝配置Heapster

在K8s上部署heapster比較容易,創建對應的yaml配置文件,然後用kubectl命令行創建就好了。

以下是Deployment和Service的配置文件:

deployment.yaml

apiVersion: extensions/v1beta1nkind: Deploymentnmetadata:n name: heapstern namespace: kube-systemnspec:n replicas: 1n template:n metadata:n labels:n task: monitoringn k8s-app: heapstern version: v6n spec:n containers:n - name: heapstern image: naughtytao/heapster-amd64:v1.5.0-beta.3n imagePullPolicy: Alwaysn command:n - /heapstern - --source=kubernetes:https://kubernetes.defaultn - --sink=statsd:udp://ip:port?numMetricsPerMsg=1n

service.yaml

apiVersion: v1nkind: Servicenmetadata:n labels:n task: monitoringn # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)n # If you are NOT using this as an addon, you should comment out this line.n kubernetes.io/cluster-service: truen kubernetes.io/name: Heapstern name: heapstern namespace: kube-systemnspec:n ports:n - port: 80n targetPort: 8082n selector:n k8s-app: heapstern

注意這裡deployment的--sink的配置,ip是Splunk的IP或者主機名,port的對應的Splunk的data input的埠號。當使用udp協議的時候,需要配置的numMetricsPerMsg的值比較小,當這個值比較大的時候,會出message too long的error。當使用tcp的時候可以配置較大的數值。

運行 kubectl apply -f *.yaml 來部署heapster

如果正常運行,對應的heapster pod的日誌如下

I0117 18:10:56.054746 1 heapster.go:78] /heapster --source=kubernetes:https://kubernetes.default --sink=statsd:udp://ec2-34-203-25-154.compute-1.amazonaws.com:8124?numMetricsPerMsg=10nI0117 18:10:56.054776 1 heapster.go:79] Heapster version v1.5.0-beta.4nI0117 18:10:56.054963 1 configs.go:61] Using Kubernetes client with master "https://kubernetes.default" and version v1nI0117 18:10:56.054978 1 configs.go:62] Using kubelet port 10255nI0117 18:10:56.076200 1 driver.go:104] statsd metrics sink using configuration : {host:ec2-34-203-25-154.compute-1.amazonaws.com:8124 prefix: numMetricsPerMsg:10 protocolType:etsystatsd renameLabels:map[] allowedLabels:map[] customizeLabel:0x15fc8c0}nI0117 18:10:56.076248 1 driver.go:104] statsd metrics sink using configuration : {host:ec2-34-203-25-154.compute-1.amazonaws.com:8124 prefix: numMetricsPerMsg:10 protocolType:etsystatsd renameLabels:map[] allowedLabels:map[] customizeLabel:0x15fc8c0}nI0117 18:10:56.076272 1 heapster.go:202] Starting with StatsD SinknI0117 18:10:56.076281 1 heapster.go:202] Starting with Metric SinknI0117 18:10:56.090229 1 heapster.go:112] Starting heapster on port 8082n

在Splunk中進行監控

好了如果一切正常的化,heapster會用statsd的協議和格式發送metrics到Splunk的metrics store。

然後就可以用利用SPL的mstatsmcatalog命令來分析,監控metrics數據了。

以下搜索語句列出所有的Metrics

| mcatalog values(metric_name)n

以下搜索語句列出整個cluster的CPU使用,我們可以用Area或者Line Chart來可視化搜索結果。

| mstats avg(_value) WHERE metric_name=cluster.cpu/usage_rate span=30mn

kube-system namespace的對應內存使用情況

| mstats avg(_value) WHERE metric_name=namespace.kube-system.memory/usage span=30mn

大家可以把自己感興趣的分析結果放在Dashboard中,利用Realtime設置進行監控。

好了,更多的分析選項可以參考Splunk文檔。

參考

  • github.com/DataDog/the-
  • kubernetes.io/docs/task
  • kubernetes.io/docs/task
  • itnext.io/kubernetes-mo
  • http://docs.splunk.com/Documentation/Splunk/7.0.1/Metrics/GetStarted

原 文:開源中國社區

作 者:naughty

更多文章:SDK.CN - 中國領先的開發者服務平台

Kubernetes相關信息及資訊:Kubernetes - SDK.CN - 中國領先的開發者服務平台


推薦閱讀:

docker 編排工具 2017最佳選擇是 swarm/kubernetes/Mesos ?
有人在嘗試使用Kubernetes嗎?
現在做雲計算的出路到底在哪?

TAG:Kubernetes | Docker | 微服务架构 |