KubernetesクラスタのログをElasticsearchへ保存&Kibanaで可視化

  • Kubernetesクラスタのログをログサーバに転送する.
  • ここではログサーバを新たにKubernetesクラスタとは別の仮想マシンにインストールする.
  • ログサーバには,Elasticsearch 8.2とKibana 8.2をインストールする.
  • KubernetesクラスタにはFilebeatをDaemonSetによりインストールし,Kubernetesクラスタのログをログサーバに転送する.

前提

  • OS: Ubuntu 20.04
  • Kubernetesディストリビューション: K3s v1.22.7+k3s1 (8432d7f2)
  • 4ノードから構成されるKubernetesクラスタ
    • doktor-prod10からdoktor-prod13
cdsl@doktor-prod10:~$ kubectl get node
NAME            STATUS   ROLES                  AGE    VERSION
doktor-prod13   Ready    <none>                 4d3h   v1.22.7+k3s1
doktor-prod11   Ready    <none>                 46d    v1.22.7+k3s1
doktor-prod12   Ready    <none>                 46d    v1.22.7+k3s1
doktor-prod10   Ready    control-plane,master   46d    v1.22.7+k3s1

cdsl@doktor-prod10:~$ kubectl top node
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
doktor-prod10   247m         6%     4478Mi          75%
doktor-prod11   237m         5%     3087Mi          51%
doktor-prod12   122m         3%     2305Mi          38%
doktor-prod13   148m         3%     2169Mi          36%

手順

(1) ログサーバ用のVM(ElasticsearchとKibanaを動かす)を構築する.

[1] VM(CPU: 4コア, RAM: 8GB, SSD: 40GB, LVM無効)を作成する. これはElasticsearchのRequirementsを参考に決めた. OSはUbuntu 20.04を選んだ. IPアドレスは 192.168.201.47 とする.

[2] ElasticsearchとKibanaをインストールする.インストール手順は,以下を参考にした.

Install Elasticsearch with Debian Package | Elasticsearch Guide [8.2] | Elastic

[3] ElasticsearchとKibanaは以下で導入する.

sudo apt install elasticsearch kibana

[4] ElasticsearchをVM外からアクセスできるよう設定を行う.

sudo vi /etc/elasticsearch/elasticsearch.yml

変更箇所(変更後の値)

## 外部のホストからアクセスできるように
network.host: 0.0.0.0

## HTTPでのアクセスを許可
xpack.security.http.ssl:
  enabled: false
  keystore.path: certs/http.p12

[5] それぞれ永続化を行う.

sudo systemctl restart --now elasticsearch
sudo systemctl restart --now kibana

[6] 外部からアクセスできるか確かめる.

curlでElasticsearchをインストールしたVMのIPアドレスへ疎通確認をする. IPアドレスは hostname -I で調べられる.以下ではIPアドレスが192.168.201.47の場合のcurlコマンドをあらわす.

curl -X GET "192.168.201.47:9200/_cluster/health"

コマンドの結果が次のようにJSON形式で得られればよい.

{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/_cluster/health]","header":{"WWW-Authenticate":["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/_cluster/health]","header":{"WWW-Authenticate":["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}},"status":401}koyama@jumpsv-deployment-56fcf7d64d-b7czg:~$

[7] Elasticsearchのパスワードを設定する.

WebブラウザからKibanaにアクセスするとユーザ名とパスワードを求められる.以下の手順を参考にパスワードを設定する.

Built-in users | Elasticsearch Guide [8.2] | Elastic

今回は既に設定されたパスワードをリセットしてみる.以下のコマンドを実行し,パスワードを入力する.

sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i

[8] Kibanaにアクセスする.

WebブラウザからElasticsearchの動作するVMのIPアドレスのポート5601番へURLを入力しアクセスする.ここではIPアドレスが192.168.201.47の場合に入力するURLを示す.

http://192.168.201.47:5601/

KeyValue
ユーザ名elastic
パスワード先ほど設定したパスワード

(2) Kubernetesへの設定

以下の手順に従いながらKubernetesへFilebeatをDaemonSetとしてインストールする.

Run Filebeat on Kubernetes | Filebeat Reference [8.2] | Elastic

[1] Kubernetesクラスタへ kubectl コマンドでアクセスできる状態になる.以下のコマンドでノードが取得できればよい.

kubectl get nodes

以下はコマンドの実行結果の例である.

NAME            STATUS   ROLES                  AGE    VERSION
doktor-prod13   Ready    <none>                 4d3h   v1.22.7+k3s1
doktor-prod11   Ready    <none>                 46d    v1.22.7+k3s1
doktor-prod10   Ready    control-plane,master   46d    v1.22.7+k3s1
doktor-prod12   Ready    <none>                 46d    v1.22.7+k3s1

[2] Filebeat用のKubernetesマニュフェストを以下のコマンドを実行することでダウンロードする.

curl -L -O https://raw.githubusercontent.com/elastic/beats/8.2/deploy/kubernetes/filebeat-kubernetes.yaml

ファイルがダウンロードできているか以下のコマンドを実行して確かめる.

ls filebeat-kubernetes.yaml

ファイルが存在する場合,以下の結果が得られる.

filebeat-kubernetes.yaml

[3] マニュフェストを環境にあわせて編集する.

テキストエディタを使い filebeat-kubernetes.yaml を編集する.以下はvimを使い編集を行う例である.

vim filebeat-kubernetes.yaml

変更箇所を以下に示す.Elasitcsearchの動作するサーバのIPアドレスを ELASTICSEARCH_HOST に設定する.ここでは 192.168.201.47 に設定した. また,先ほど設定したパスワードを ELASTICSEARCH_PASSWORD に設定する.ここでは xxxx に設定した.

env:
- name: ELASTICSEARCH_HOST
  value: 192.168.201.47
- name: ELASTICSEARCH_PORT
  value: "9200"
- name: ELASTICSEARCH_USERNAME
  value: elastic
- name: ELASTICSEARCH_PASSWORD
  value: xxxx
- name: ELASTIC_CLOUD_ID
  value:
- name: ELASTIC_CLOUD_AUTH
  value:
- name: NODE_NAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName

変更が保存されているか cat コマンドを実行して確かめる.

cat filebeat-kubernetes.yaml

[4] Kubernetesクラスタへ設定を適用する.以下のコマンドを実行しFilebeatを配置する.

kubectl apply -f filebeat-kubernetes.yaml

以下はコマンドの実行結果の例である.

configmap/filebeat-config unchanged
daemonset.apps/filebeat configured
clusterrolebinding.rbac.authorization.k8s.io/filebeat unchanged
rolebinding.rbac.authorization.k8s.io/filebeat unchanged
rolebinding.rbac.authorization.k8s.io/filebeat-kubeadm-config unchanged
clusterrole.rbac.authorization.k8s.io/filebeat unchanged
role.rbac.authorization.k8s.io/filebeat unchanged
role.rbac.authorization.k8s.io/filebeat-kubeadm-config unchanged
serviceaccount/filebeat unchanged

[5] Kubernetesクラスタへ設定が適用できたか確かめる.

以下のコマンドを実行して,FilebeatがDaemonSetとして配置されて起動しているか確かめる.

kubectl get ds -n kube-system

コマンドの結果が以下になるか確かめる.READYがノード数と一致すればよい.以下はノード数( kubectl get nodes で表示されるノードの数)が4の場合の実行結果をあらわす.

NAME       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
filebeat   4         4         4       4            4           <none>          45m

(3) Kibanaでログを閲覧

[1] Data Viewの設定を行う.

Kibanaへログインし,左上のメニューボタンを押す.

ページをスクロールし,Magement → Stack Managementを選ぶ.

左側のメニューをスクロールし,Kibana → Data Viewsを選ぶ.

右上にある Create data view を押し,表示されるフォームのNameに filebeat-* と入力する.

右下の Create data viewを押す.

[2] データを閲覧する.

左上のメニューを押し,Analytics → Discoverを押す.

ダッシュボードにログが表示されればよい.