bon now

ありのままの現実を書き殴る吐き溜め。底辺SEの備忘録。
Written by bon who just a foolish IT Engineer.

metricbeatを使ってKubernetes v1.11以降のメトリックを取る方法

Created Date: 2019/06/05 23:13
Updated Date: 2022/09/29 03:28

分かる人にとってはとても簡単なことなんだろうけど、 雰囲気で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を使っていろいろ検証したいところ。 (お金がないので難しいけど)

local_offer
folder work