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

```:コマンドと実行結果
$ 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

$ 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をインストールする．<br>インストール手順は，以下を参考にした．

[Install Elasticsearch with Debian Package | Elasticsearch Guide [8.2] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html)

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

```:コマンド
sudo apt install elasticsearch kibana
```

[4] ElasticsearchをVM外からアクセスできるよう設定を行う．テキストエディタを使い elasticsearch.yaml を編集する．以下はvimを使い編集を行う例である．

```:コマンド
sudo vim /etc/elasticsearch/elasticsearch.yml
```

変更箇所(変更後の値)

```yaml:設定ファイル
# 外部のホストからアクセスできるように
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](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html#set-built-in-user-passwords)

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

```:コマンド
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/
```

![Screen Shot 2022-05-05 at 22.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/32e055af-113a-3064-97df-04bb74695f7c.png)

| Key | Value |
| --- | --- |
| ユーザ名 | elastic |
| パスワード | 先ほど設定したパスワード |

## (2) Kubernetesへの設定

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

[Run Filebeat on Kubernetes | Filebeat Reference [8.2] | Elastic](https://www.elastic.co/guide/en/beats/filebeat/current/running-on-kubernetes.html)

[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 に設定した．

```yaml:設定ファイル（抜粋）
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」を選ぶ．

![Screen Shot 2022-05-05 at 22.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/3aee85b1-ed32-88a1-939e-35dd2edd921b.png)

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

![Screen Shot 2022-05-05 at 22.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/92f1dbdc-a51d-6011-c535-186a7694add0.png)

右下の「Create data view」を押す．

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

左上のメニューを押し，「Analytics → Discover」を押す．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/4d7de6aa-e0b5-4830-e3df-fc183a6d8e09.png)

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