metricbeatを使ってKubernetes v1.11以降のメトリックを取る方法
Updated Date: 2024/01/01 00:26
分かる人にとってはとても簡単なことなんだろうけど、 雰囲気でKubernetes触ってる僕にとってはあまりにも情報がなくなかなか解決に手間取ったため、ここに同じように苦しむ人が少なくなるようナレッジを残しておく。 とはいえKubernetesおよびElastic製品のの進化はとんでもなく早いので、すぐに古い情報になってしまうかもしれない点はご容赦願いたい。
以下から発生した問題とそれに対する解決策を記載する。
メトリックが一部取れない
自社サーバーにkubeadmを使ってインストールした Kubernetes 1.11 のシングルノードクラスタ環境に対して、 Metricbeatを導入してメトリックを取ろうと考えた。
ElasticsearchとKibanaについてはGithubのpires/kubernetes-elasticsearch-clusterを参考に、 自分でYAMLを書いて、シングルノードの Elasticsearch 7.1.1 をKubernetes上にデプロイした。
上述したとおり、ElasticのドキュメントどおりにMetricbeatをKubernetesにデプロイしたのだが、ノードのCPUやメモリ使用量が全く取れないという問題が発生した。 なお、デプロイされたPod数やPodの状況などは取得できているので、全く動かないというわけではなかった。
解決策
以下のGithub issueどおり。
[Metricbeat] Access Kubernetes metrics from somewhere other than the read-only kublet port -Github
kubernetes 1.11から認証不要な外部連携ポートの10255は、kubeadm実行時にデフォルトでdisabledになるという変更が加わったらしい。
参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md
よって、書かれている通り変わりのポートとして10250を使うようにし、いくつかの設定を追加する。
エラーが起きるのは DaemonSetで動くMetricbeat なので、2つ定義されているConfigMapのうち name: metricbeat-daemonset-modules
のほうに追記する。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
apiVersion: v1
kind: ConfigMap
metadata:
name: metricbeat-daemonset-modules
namespace: kube-system
labels:
k8s-app: metricbeat
data:
system.yml: |-
- module: system
period: 10s
metricsets:
- cpu
- load
- memory
- network
- process
- process_summary
#- core
#- diskio
#- socket
processes: ['.*']
process.include_top_n:
by_cpu: 5 # include top 5 processes by CPU
by_memory: 5 # include top 5 processes by memory
- module: system
period: 1m
metricsets:
- filesystem
- fsstat
processors:
- drop_event.when.regexp:
system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib)($|/)'
kubernetes.yml: |-
- module: kubernetes
metricsets:
- node
- system
- pod
- container
- volume
period: 10s
host: ${NODE_NAME}
# 以下追記
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
ssl.certificate_authorities:
- /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
ssl.verification_mode: "none"
# localhostでうまくいかない場合はNODE_NAMEを指定する。
# ポートは10255から10250へ変更
hosts: ["https://${NODE_NAME}:10250"]
Kibanaでダッシュボードが作れない
メトリックが正しく取れてKibanaでKubernetes Metricsのダッシュボードを作成しようとすると、 「kibana not displaying dashboard XXXX」となりダッシュボードが生成できなかった。
解決策
公式サンプルのmetricbeat-kubernetes.yamlのConfigMapに、以下を追加する。 ConfigMapの定義は2つあるのでどちらも追記する(どっちかだけでいいかもしれないけど細けぇこたぁ……)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(略)
data:
metricbeat.yml: |-
metricbeat.config.modules:
# Mounted `metricbeat-daemonset-modules` configmap:
path: ${path.config}/modules.d/*.yml
# Reload module configs as they change:
reload.enabled: false
# To enable hints based autodiscover uncomment this:
#metricbeat.autodiscover:
# providers:
# - type: kubernetes
# host: ${NODE_NAME}
# hints.enabled: true
processors:
- add_cloud_metadata:
cloud.id: ${ELASTIC_CLOUD_ID}
cloud.auth: ${ELASTIC_CLOUD_AUTH}
# 以下追加
setup.dashboards.enabled: true
setup.kibana.host: '<kibanaのホスト>:<PORT>'
(略)
---
(略)
data:
metricbeat.yml: |-
metricbeat.config.modules:
# Mounted `metricbeat-daemonset-modules` configmap:
path: ${path.config}/modules.d/*.yml
# Reload module configs as they change:
reload.enabled: false
processors:
- add_cloud_metadata:
cloud.id: ${ELASTIC_CLOUD_ID}
cloud.auth: ${ELASTIC_CLOUD_AUTH}
setup.dashboards.enabled: true
setup.kibana.host: 'kibana.elasticsearch:5601'
output.elasticsearch:
(略)
以上でようやくKubernetesのメトリックが正しく取れるようになる。 念の為KibanaのDiscoverでKQLのフィルターに「error.message :*」を指定し、エラーが発生していないことを確認すると良い。
まとめ
Elasticはドキュメントが多く、実は更新されていないとか互換性がないとかいうものも多々あり、 またどちらかといえばオンプレで設定値を変更することを主眼に書かれているため、 コンテナで動かす際にはYAMLの設定ファイルにどう記述するかとか、command実行時の環境変数で渡せば大丈夫なのかとかを いちいち考えなければならない。
2019/6にElastic on Kubernetesがα公開されたが、これも環境によってはAPI監視がうまく行かずにすぐにCrashして使い物にならないので、
今年1年でどのくらい変わるかなーといったところか。
とはいえ機能改修の速度はとんでもなく早く、去年のElastic 6から大幅な進化を遂げているので、今後に期待できる。
できればX-Packを使っていろいろ検証したいところ。 (お金がないので難しいけど)