HelmでローカルKubernetesにElastic Stackを構築する
はじめに
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
Elastic Stackを使えばあらゆるソースから、あらゆるフォーマットでデータを取得でき、リアルタイムに検索、分析、可視化することができます。...
Elastic Stackのプロダクトのそれぞれの用途は下記になります。
プロダクト | 用途 |
---|---|
Elasticsearch | データの格納、検索/分析エンジン |
Logstash | ログを処理する投入パイプライン |
Kibana | 可視化 |
Beats | データ送信 |
処理の順番のイメージは下記のようになります。
Beats
Beatsにはいくつかの種類があります。
Beats:Elasticsearchのためのデータシッパー | 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使ってみる
:::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
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
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
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
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
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
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
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
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のログが送られていることが確認できます。
参考
- ELK Stack:Elasticsearch開発元が提供するプロダクト | Elastic
- Getting Started [8.0] | Elastic
- elastic
- elastic/helm-charts: You know, for Kubernetes
- Beats| 軽量データシッパー | Elastic