はじめに
Elastic Stackについてざっくり解説し、ローカルのKubernetesにHelmでデプロイし、実際に試せる環境を構築していきます。
Elastic Stackとは
Elastic Stackとは、Elasticsearch、Logstash、Kibana、Beatsで構成されるElasticのプロダクト群です。
下記のページを見ると、ELK StackはElasticsearch、Logstash、Kibanaの集まりのことを指し、そこにBeatsが加わったことでElastic Stackと呼ぶようになったようです。
Elastic Stackのプロダクトのそれぞれの用途は下記になります。
プロダクト | 用途 |
---|---|
Elasticsearch | データの格納、検索/分析エンジン |
Logstash | ログを処理する投入パイプライン |
Kibana | 可視化 |
Beats | データ送信 |
処理の順番のイメージは下記のようになります。
Beats
Beatsにはいくつかの種類があります。

- Filebeat
- Metricbeat
- Packetbeat
- Winlogbeat
- Auditbeat
- Heartbeat
- Functionbeat
helmfileでローカルKubernetesにデプロイ
ローカルのKubernetesにHelmでデプロイしてみます。
FilebeatからLogstashを経由して、Elasticsearchに格納、Kibanaでログ確認できるようにします。
今回はhelmfileを利用して、コマンド1つで全てデプロイしたいと思います。helmfileは下記を参照してください。

今回作成するファイルは下記の通りです。
.
├── helmfile.yaml # 全体をまとめるhelmfile.yaml
├── elasticsearch # Elasticsearchのhelmfile
│ ├── helmfile.yaml
│ └── values.yaml
├── filebeat # Filebeatのhelmfile
│ ├── helmfile.yaml
│ └── values.yaml
├── kibana # Kiabanaのhelmfile
│ ├── helmfile.yaml
│ └── values.yaml
└── logstash # Logstashのhelmfile
├── helmfile.yaml
└── values.yaml
Namespaceの作成
まずはElastic StackをデプロイするNamespaceを作成します。
kubectl create ns elk
helmfile.yamlの作成
全体をまとめるhelmfile.yaml
を作成します。
helmfiles:
- ./elasticsearch/helmfile.yaml
- ./filebeat/helmfile.yaml
- ./kibana/helmfile.yaml
- ./logstash/helmfile.yaml
Kibana用ファイルの作成
次にKibana用のファイルを作成します。
helmfile.yaml
は下記の通りです。
releases:
- chart: elastic/kibana
name: kibana
namespace: elk
values:
- ./values.yaml
values.yaml
は作成していますが、中身は空です。設定したい内容があれば追記して問題ありません。
デフォルトのvalues.yaml
は下記になります。
Elasticsearch用ファイルの作成
Elasticsearch用のファイルを作成します。
helmfile.yaml
は下記の通りです。
releases:
- chart: elastic/elasticsearch
name: elasticsearch
namespace: elk
values:
- ./values.yaml
values.yaml
は下記の通りです。ローカルで動かすため、レプリカ数を1にし、必要なリソースも少なくなるようにしています。今回はローカルで試すだけなので、Elasticsearchのユーザーとパスワードはこちらにベタ書きしてしまっています。
こちらのサンプルを参考にしています。
replicas: 1
minimumMasterNodes: 1
clusterHealthCheckParams: 'wait_for_status=yellow&timeout=1s'
extraEnvs:
- name: "ELASTICSEARCH_USERNAME"
value: elastic
- name: "ELASTICSEARCH_PASSWORD"
value: elastic
antiAffinity: "soft"
esJavaOpts: "-Xmx128m -Xms128m"
resources:
requests:
cpu: "100m"
memory: "512M"
limits:
cpu: "1000m"
memory: "512M"
volumeClaimTemplate:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "hostpath"
resources:
requests:
storage: 100M
elasticsearchのPodがReadyにならない問題があったため、下記を参考に設定を追加しています。
デフォルトのvalues.yaml
は下記になります。
Logstash用ファイルの作成
データ加工をするLogstash用のファイルを作成します。
helmfile.yaml
は下記の通りです。
releases:
- chart: elastic/logstash
name: logstash
namespace: elk
values:
- ./values.yaml
values.yaml
は下記の通りです。下記のサンプルを参考に作成しています。
Elasticsearchのユーザーとパスワードはベタ書きしています。また、今回はfilebeatからログを送るので、beats用のポートとServiceの設定を入れています。
extraEnvs:
- name: "ELASTICSEARCH_USERNAME"
value: elastic
- name: "ELASTICSEARCH_PASSWORD"
value: elastic
persistence:
enabled: true
extraPorts:
- name: beats
containerPort: 5044
service:
type: ClusterIP
ports:
- name: beats
port: 5044
protocol: TCP
targetPort: 5044
logstashConfig:
logstash.yml: |
http.host: 0.0.0.0
xpack.monitoring.enabled: false
pipeline.ecs_compatibility: disabled
logstashPipeline:
logstash.conf: |
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch-master:9200"]
user => '${ELASTICSEARCH_USERNAME}'
password => '${ELASTICSEARCH_PASSWORD}'
index => "logstash"
}
}
デフォルトのvalues.yaml
は下記になります。
Filebeat用ファイルの作成
最後にログを送るFilebeat用のファイルを作成します。
helmfile.yaml
は下記の通りです。
releases:
- chart: elastic/filebeat
name: filebeat
namespace: elk
values:
- ./values.yaml
values.yaml
は下記の通りです。ログを送る先をLogstashにする以外はデフォルトと同じ内容です。
daemonset:
filebeatConfig:
filebeat.yml: |
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
output.logstash:
hosts: ["logstash-logstash:5044"]
デフォルトのvalues.yaml
は下記になります。
helmfileの適用
必要なファイルは作成できたので、ローカルのKubernetesにデプロイします。
まずは、リポジトリの追加をします。
helm repo add elastic https://helm.elastic.co
helmfileを使ってデプロイします。
helmfile apply
全てのPodがReadyになれば完了です。少し時間がかかるかもしれません。
❯ kubectl get pod -n elk
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 3m22s
filebeat-filebeat-v8ch5 1/1 Running 0 3m17s
kibana-kibana-fc976c796-sxqmw 1/1 Running 0 3m12s
logstash-logstash-0 1/1 Running 0 3m7s
elasticsearchのPodがReadyにならない
elasticsearchのPodがReadyにならない場合はElasticsearchのPVCを削除してからhelmfile apply
してみてください。
使ってみる
ポートフォワードしてKibanaにアクセスできるようにします。
kubectl -n elk port-forward svc/kibana-kibana 5601
http://localhost:5601
にアクセスするとKibanaからfilebeatのログが送られていることが確認できます。