Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

KubernetesをElastic Stackで可視化する。

皆さんこんにちは
あっという間に年末になってびっくりしている@です。

本記事は「Elastic Stack」のアドベントカレンダー19日目の記事です。

qiita.com

アドベントカレンダーで本日公開しようと思ったら、
偶然にも公式のアドベントカレンダーもKubernetesです。びっくりです。

discuss.elastic.co

さて、KubernetesのメトリックをElastic Stack 6.0から標準の機能で取得できるようになりました。
しかし、Kubenetes初心者である私が試しに使ってみると非常に苦労したので、その戦いの記録を掲載します!!!

Kubernetesを可視化することの利点

Kubernetesは複数のコンテナを操作するオーケストレーションツールです。
Elastic Stackを使うことで、Kubernetesから得られるメトリックを取得し、可視化できます。

利点としては、dockerコンテナをオーケストレーションするKubernetesでは
やっぱり、ログ収集をやりたくなりますよね?
それをElastic Stackで実現したら、さらにdockerコンテナの情報や、Kubernetes自身の情報(PodやServiceなど)などの
メトリクス情報を集めて、Kibanaで可視化されると便利ですよね?

そんな便利なことの実現の第一歩として、今回、Kubernetesの可視化に挑戦しました。

実際にやってみた。

Kubernetesの準備

KubernetesのElastic Stack監視をするために
minikube(0.23.0)、kubectl(1.8.0)、kube-state-metrics(1.1.0)のインストールが必要です。
OSによってインストール方法は異なりますが、まずはそれらをインストールしましょう。

インストール方法は次を参考にしてください。

■minikube
github.com

■kubectl
kubernetes.io

■kube-state-metrics
github.com

Elastic Stack 6.0による可視化

Elastic Stack6.0で可視化をします。
Kubernetesのメトリックの取得方法ですが、
MetricbeatのmoduleにKubenetesが標準で追加されたので、それを使用します。

まずは、設定ファイルをKubernetes用に書き換えます。

metricbeat.modules:
# Node metrics, from kubelet:
- module: kubernetes
  metricsets:
    - node
    - system
    - pod
    - container
    - volume
  period: 10s
  hosts: ["http://localhost:8001/api/v1/proxy/nodes/minikube:10255/stats/summary"]
# State metrics from kube-state-metrics service:
- module: kubernetes
  enabled: true
  metricsets:
    - state_node
    - state_deployment
    - state_replicaset
    - state_pod
    - state_container
  period: 10s
  hosts: ["http://localhost:8001/api/v1/namespaces/kube-system/services/kube-state-metrics:8080/proxy/metrics"]

Elasticsearch, Kibana, Metricbeatを起動します。Metricbeatの起動コマンドは次の通りです。

./metricbeat -e -c metricbeat.yml

Discoverを確認して、投入できているか確認しましょう。

f:id:acro-engineer:20171119235637p:plain

非常にシンプルで簡単ですね。
しかし、Kubernetes初心者にとって、意外と正しく取得先を
設定することが難しかったので、その点をこれから紹介します。

hostsについて

意外なハマりポイントとして、「hostsに書くべき項目は何か」といったことです。
これがドキュメントにあまりに書かれておらず、
kubernetesをこれを機に勉強していた人間としてはかなり難しい要素でした。

Kubernetes moduleはkubeletとkube-state-metricsのAPIからメトリックを取得します。
そのため、どちらもAPIの然るべきURL(これを探すのが大変)にアクセスしなければなりません。

Kubernetesのコンテナへアクセスするために、プロキシが必要です。Kubernetesのプロキシの起動は次の通りです。

kubectl proxy

この後、kubeletとkube-state-metricsのurlの探し方を説明します。

kubelet

kubeletのURLは、次の通りです。
URL内のminikubeと記載されている箇所はnodeの名前(NAME)を示しています。

http://localhost:8001/api/v1/proxy/nodes/minikube:10255/stats/summary

$ kubectl get node --all-namespaces=true
NAMESPACE   NAME       STATUS    ROLES     AGE       VERSION
            minikube   Ready     <none>    22h       v1.8.0
kube-state-metrics

次にkube-state-metricsから取得します。

kube-state-metricsをインストールすると、podとserviceが起動します。
serviceの一覧の「kube-state-metrics」の/metricsへアクセスする必要があります。
プロキシを用いたアクセスするurlがKubernetesのバージョンで異なっているので
アクセス先を特定するのに苦労しました。

$ kubectl get service --all-namespaces=true
NAMESPACE     NAME                                  TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
default       banking-ladybird-kube-state-metrics   ClusterIP      10.0.0.201   <none>        8080/TCP            6h
default       edgy-camel-kube-state-metrics         ClusterIP      10.0.0.14    <none>        8080/TCP            6h
default       kubernetes                            ClusterIP      10.0.0.1     <none>        443/TCP             22h
default       snug-sasquatch-kube-state-metrics     ClusterIP      10.0.0.151   <none>        8080/TCP            6h
default       spark-master                          ClusterIP      10.0.0.20    <none>        7077/TCP,8080/TCP   22h
default       spark-ui-proxy                        LoadBalancer   10.0.0.192   <pending>     80:32499/TCP        22h
default       zeppelin                              LoadBalancer   10.0.0.117   <pending>     80:31618/TCP        22h
kube-system   kube-dns                              ClusterIP      10.0.0.10    <none>        53/UDP,53/TCP       22h
kube-system   kube-state-metrics                    ClusterIP      10.0.0.133   <none>        8080/TCP            7h
kube-system   kubernetes-dashboard                  NodePort       10.0.0.157   <none>        80:30000/TCP        22h
kube-system   tiller-deploy                         ClusterIP      10.0.0.237   <none>        44134/TCP           6h

この中からkube-state-metricsのserviceを発見し、urlを作成することで、アクセス可能です。
URLの作り方は次の通りです。
http://localhost:8001/api/v1/namespaces/[namespace]/services/[service:port]/proxy/metrics

■例
http://localhost:8001/api/v1/namespaces/kube-system/services/kube-state-metrics:8080/proxy/metrics

可視化

最後にデータをKibanaのダッシュボードで可視化しましょう。

Kubanetesのダッシュボードですが、Metricbeatのmodulesに標準で搭載されています。
標準ダッシュボードの準備方法ですが、Beatsのバージョン5系と6系でsetupの方法が少々異なっています。
「./scripts/import_dashboards」がなくなり、Metricbeatの実行ファイルを利用します。
metricbeatからindexとダッシュボードを次のコマンドで設定します。

./metricbeat setup

後はKibana上で「 [Metricbeat Kubernetes] Overview」へアクセスします。
アクセスすると次のダッシュボードが見られます。

f:id:acro-engineer:20171210151444p:plain

おっ、なんだかそれっぽいですね!。

最後に

ログ集約していくとElasticに情報集めたくなり、
Kubernetesも一緒に簡単にみられるようになるのはよいですね!
どんどん使っていきたいです!

Acroquest Technologyでは、キャリア採用を行っています。

  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com