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開発元が提供するプロダクト
ELKStackって?ELKは、広く使われている3つのオープンソースプロジェクトから頭文字をとったもの。E=Elasticsearch(Luceneをベースに開発)、L=Logstash、K=Kibanaです。その後ラインナップにBeatsが加わり、現在はElasticStackと呼ばれています。

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

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

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

Beats

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

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使ってみる
はじめにHelmfileについてざっくり解説し、シンプルな例で実際に使ってみたいと思います。Helmについては下記で解説しています。HelmfileとはHelmfileとは、Helmチャートを宣言的にデプロイするツールです。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は下記になります。

helm-charts/values.yaml at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.

Elasticsearch用ファイルの作成

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

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

releases:
  - chart: elastic/elasticsearch
    name: elasticsearch
    namespace: elk
    values:
      - ./values.yaml

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

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

helm-charts/elasticsearch/examples/docker-for-mac at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.
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にならない問題があったため、下記を参考に設定を追加しています。

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts
Chartversion:7.7.1Kubernetesversion:1.16Kubernetesprovider:E.g.GKE(GoogleKubernetesEngine)EKSHelmVersion:2.16.10helmgetreleaseoutpute.g.helmgetelasticsearch(rep...

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

helm-charts/values.yaml at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.

Logstash用ファイルの作成

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

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

releases:
  - chart: elastic/logstash
    name: logstash
    namespace: elk
    values:
      - ./values.yaml

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

helm-charts/logstash/examples/elasticsearch at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.

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は下記になります。

helm-charts/values.yaml at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.

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は下記になります。

helm-charts/values.yaml at main · elastic/helm-charts
Youknow,forKubernetes.Contributetoelastic/helm-chartsdevelopmentbycreatinganaccountonGitHub.

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してみてください。

elastic/helm-charts/elasticsearch: Readiness probe failed: Waiting for elasticsearch cluster to become ready · Issue #783 · elastic/helm-charts
Chartversion:7.7.1Kubernetesversion:1.16Kubernetesprovider:E.g.GKE(GoogleKubernetesEngine)EKSHelmVersion:2.16.10helmgetreleaseoutpute.g.helmgetelasticsearch(rep...

使ってみる

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

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

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

参考

タイトルとURLをコピーしました