HelmでローカルKubernetesにElastic Stackを構築する

2022.02.26
2024.03.24
監視
Elastic StackElasticsearchfilebeatHelmHelmfileKibanaLogstash

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

Elastic Stackについてざっくり解説し、ローカルのKubernetesにHelmでデプロイし、実際に試せる環境を構築していきます。

Elastic Stackとは

Elastic Stackとは、Elasticsearch、Logstash、Kibana、Beatsで構成されるElasticのプロダクト群です。

下記のページを見ると、ELK StackはElasticsearch、Logstash、Kibanaの集まりのことを指し、そこにBeatsが加わったことでElastic Stackと呼ぶようになったようです。

ELK Stack = Elasticsearch、Kibana、Beats、Logstash

ELK Stack = Elasticsearch、Kibana、Beats、Logstash

Elastic Stackを使えばあらゆるソースから、あらゆるフォーマットでデータを取得でき、リアルタイムに検索、分析、可視化することができます。...

Elastic Stackのプロダクトのそれぞれの用途は下記になります。

プロダクト用途
Elasticsearchデータの格納、検索/分析エンジン
Logstashログを処理する投入パイプライン
Kibana可視化
Beatsデータ送信

処理の順番のイメージは下記のようになります。

Beats

Beatsにはいくつかの種類があります。

Beats:| 軽量データシッパー | Elastic

Beats:| 軽量データシッパー | Elastic

Beatsは、データシッピング専用のプラットフォームです。何百、何千ものマシンからElasticsearchやLogstash、Kibanaにデータを転送できます。...

  • Filebeat
  • Metricbeat
  • Packetbeat
  • Winlogbeat
  • Auditbeat
  • Heartbeat
  • Functionbeat

helmfileでローカルKubernetesにデプロイ

ローカルのKubernetesにHelmでデプロイしてみます。

FilebeatからLogstashを経由して、Elasticsearchに格納、Kibanaでログ確認できるようにします。

今回はhelmfileを利用して、コマンド1つで全てデプロイしたいと思います。helmfileは下記を参照してください。

【Helm】helmfile使ってみる

【Helm】helmfile使ってみる

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

今回作成するファイルは下記の通りです。

1.
2├── helmfile.yaml     # 全体をまとめるhelmfile.yaml
3├── elasticsearch     # Elasticsearchのhelmfile
4│   ├── helmfile.yaml
5│   └── values.yaml
6├── filebeat          # Filebeatのhelmfile
7│   ├── helmfile.yaml
8│   └── values.yaml
9├── kibana            # Kiabanaのhelmfile
10│   ├── helmfile.yaml
11│   └── values.yaml
12└── logstash          # Logstashのhelmfile
13    ├── helmfile.yaml
14    └── values.yaml

Namespaceの作成

まずはElastic StackをデプロイするNamespaceを作成します。

1kubectl create ns elk

helmfile.yamlの作成

全体をまとめるhelmfile.yamlを作成します。

1helmfiles:
2  - ./elasticsearch/helmfile.yaml
3  - ./filebeat/helmfile.yaml
4  - ./kibana/helmfile.yaml
5  - ./logstash/helmfile.yaml

Kibana用ファイルの作成

次にKibana用のファイルを作成します。

helmfile.yamlは下記の通りです。

1releases:
2  - chart: elastic/kibana
3    name: kibana
4    namespace: elk
5    values:
6      - ./values.yaml

values.yamlは作成していますが、中身は空です。設定したい内容があれば追記して問題ありません。

デフォルトのvalues.yamlは下記になります。

helm-charts/kibana/values.yaml at main · elastic/helm-charts

helm-charts/kibana/values.yaml at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

Elasticsearch用ファイルの作成

Elasticsearch用のファイルを作成します。

helmfile.yamlは下記の通りです。

1releases:
2  - chart: elastic/elasticsearch
3    name: elasticsearch
4    namespace: elk
5    values:
6      - ./values.yaml

values.yamlは下記の通りです。ローカルで動かすため、レプリカ数を1にし、必要なリソースも少なくなるようにしています。今回はローカルで試すだけなので、Elasticsearchのユーザーとパスワードはこちらにベタ書きしてしまっています。

こちらのサンプルを参考にしています。

helm-charts/elasticsearch/examples/docker-for-mac at main · elastic/helm-charts

helm-charts/elasticsearch/examples/docker-for-mac at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

1replicas: 1
2minimumMasterNodes: 1
3clusterHealthCheckParams: 'wait_for_status=yellow&timeout=1s'
4
5extraEnvs:
6  - name: "ELASTICSEARCH_USERNAME"
7    value: elastic
8  - name: "ELASTICSEARCH_PASSWORD"
9    value: elastic
10
11antiAffinity: "soft"
12
13esJavaOpts: "-Xmx128m -Xms128m"
14
15resources:
16  requests:
17    cpu: "100m"
18    memory: "512M"
19  limits:
20    cpu: "1000m"
21    memory: "512M"
22
23volumeClaimTemplate:
24  accessModes: [ "ReadWriteOnce" ]
25  storageClassName: "hostpath"
26  resources:
27    requests:
28      storage: 100M

elasticsearchのPodがReadyにならない問題があったため、下記を参考に設定を追加しています。

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts

Chart version: 7.7.1 Kubernetes version: 1.16 Kubernetes provider: E.g. GKE (Google Kubernetes Engine) EKS Helm Version: 2.16.10 helm get release output e.g. helm get elasticsearch (replace elastic...

デフォルトのvalues.yamlは下記になります。

helm-charts/elasticsearch/values.yaml at main · elastic/helm-charts

helm-charts/elasticsearch/values.yaml at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

Logstash用ファイルの作成

データ加工をするLogstash用のファイルを作成します。

helmfile.yamlは下記の通りです。

1releases:
2  - chart: elastic/logstash
3    name: logstash
4    namespace: elk
5    values:
6      - ./values.yaml

values.yamlは下記の通りです。下記のサンプルを参考に作成しています。

helm-charts/logstash/examples/elasticsearch at main · elastic/helm-charts

helm-charts/logstash/examples/elasticsearch at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

Elasticsearchのユーザーとパスワードはベタ書きしています。また、今回はfilebeatからログを送るので、beats用のポートとServiceの設定を入れています。

1extraEnvs:
2  - name: "ELASTICSEARCH_USERNAME"
3    value: elastic
4  - name: "ELASTICSEARCH_PASSWORD"
5    value: elastic
6
7persistence:
8  enabled: true
9
10extraPorts:
11  - name: beats
12    containerPort: 5044
13
14service:
15  type: ClusterIP
16  ports:
17  - name: beats
18    port: 5044
19    protocol: TCP
20    targetPort: 5044
21
22logstashConfig:
23  logstash.yml: |
24    http.host: 0.0.0.0
25    xpack.monitoring.enabled: false
26    pipeline.ecs_compatibility: disabled
27
28logstashPipeline:
29  logstash.conf: |
30    input {
31      beats {
32        port => 5044
33      }
34    }
35    output {
36      elasticsearch {
37        hosts => ["http://elasticsearch-master:9200"]
38        user => '${ELASTICSEARCH_USERNAME}'
39        password => '${ELASTICSEARCH_PASSWORD}'
40        index => "logstash"
41      }
42    }

デフォルトのvalues.yamlは下記になります。

helm-charts/logstash/values.yaml at main · elastic/helm-charts

helm-charts/logstash/values.yaml at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

Filebeat用ファイルの作成

最後にログを送るFilebeat用のファイルを作成します。

helmfile.yamlは下記の通りです。

1releases:
2  - chart: elastic/filebeat
3    name: filebeat
4    namespace: elk
5    values:
6      - ./values.yaml

values.yamlは下記の通りです。ログを送る先をLogstashにする以外はデフォルトと同じ内容です。

1daemonset:
2  filebeatConfig:
3    filebeat.yml: |
4      filebeat.inputs:
5      - type: container
6        paths:
7          - /var/log/containers/*.log
8        processors:
9        - add_kubernetes_metadata:
10            host: ${NODE_NAME}
11            matchers:
12            - logs_path:
13                logs_path: "/var/log/containers/"
14      output.logstash:
15        hosts: ["logstash-logstash:5044"]

デフォルトのvalues.yamlは下記になります。

helm-charts/filebeat/values.yaml at main · elastic/helm-charts

helm-charts/filebeat/values.yaml at main · elastic/helm-charts

You know, for Kubernetes. Contribute to elastic/helm-charts development by creating an account on GitHub.

helmfileの適用

必要なファイルは作成できたので、ローカルのKubernetesにデプロイします。

まずは、リポジトリの追加をします。

1helm repo add elastic https://helm.elastic.co

helmfileを使ってデプロイします。

1helmfile apply

全てのPodがReadyになれば完了です。少し時間がかかるかもしれません。

1❯ kubectl get pod -n elk
2NAME                            READY   STATUS    RESTARTS   AGE
3elasticsearch-master-0          1/1     Running   0          3m22s
4filebeat-filebeat-v8ch5         1/1     Running   0          3m17s
5kibana-kibana-fc976c796-sxqmw   1/1     Running   0          3m12s
6logstash-logstash-0             1/1     Running   0          3m7s

elasticsearchのPodがReadyにならない

elasticsearchのPodがReadyにならない場合はElasticsearchのPVCを削除してからhelmfile applyしてみてください。

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts

Chart version: 7.7.1 Kubernetes version: 1.16 Kubernetes provider: E.g. GKE (Google Kubernetes Engine) EKS Helm Version: 2.16.10 helm get release output e.g. helm get elasticsearch (replace elastic...

使ってみる

ポートフォワードしてKibanaにアクセスできるようにします。

1kubectl -n elk port-forward svc/kibana-kibana 5601

http://localhost:5601にアクセスするとKibanaからfilebeatのログが送られていることが確認できます。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee