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/
Key | Value |
---|---|
ユーザ名 | 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を押す.
ダッシュボードにログが表示されればよい.