将位于Kubernetes集群上的容器日志保存到Elasticsearch,并在Kibana上进行可视化
简介
-
- Kubernetesクラスタのログをログサーバに転送する.
-
- ここではログサーバを新たにKubernetesクラスタとは別の仮想マシンに構築する.
-
- ログサーバには,Elasticsearch 8.2とKibana 8.2をインストールする.
- KubernetesクラスタにはFilebeatをDaemonSetによりインストールし,Kubernetesクラスタのログをログサーバに転送する.
前提 tí)
-
- 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) 建立用于日志服务器的虚拟机(运行Elasticsearch和Kibana)。
创建一个具有以下规格的虚拟机:CPU:4核,RAM:8GB,SSD:40GB,LVM禁用。这是根据Elasticsearch的要求决定的。选择操作系统为Ubuntu 20.04。将IP地址设置为192.168.201.47。
[2] 安装Elasticsearch和Kibana。安装步骤如下所示。
使用Debian软件包安装Elasticsearch | Elasticsearch指南 [8.2] | Elastic
请参照以下步骤进行Elasticsearch和Kibana的安装。
sudo apt install elasticsearch kibana
进行设置,以便从VM外部访问Elasticsearch。使用文本编辑器编辑elasticsearch.yaml文件。下面是使用vim进行编辑的示例。
sudo vim /etc/elasticsearch/elasticsearch.yml
更改部分(更改后的值)
# 外部のホストからアクセスできるように
network.host: 0.0.0.0
# HTTPでのアクセスを許可
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
[5] Each one conducts permanence. (English)
[5] 每个人都进行永久化。 (Simplified Chinese)
sudo systemctl restart --now elasticsearch
sudo systemctl restart --now kibana
确认是否可以从外部访问。
通过 curl 命令确认与安装了 Elasticsearch 的虚拟机的 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的密码。
当您尝试从网络浏览器访问Kibana时,系统会要求您提供用户名和密码。请参考以下步骤来设置密码。
内置用户 | Elasticsearch指南 [8.2] | 弹性搜索
本次尝试重置已设定的密码。请执行以下命令,并输入密码。
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
[8] 访问Kibana。
通过Web浏览器输入连接至运行Elasticsearch的虚拟机的IP地址端口5601的URL来访问。此处以IP地址为192.168.201.47为例展示输入的URL。
http://192.168.201.47:5601/

(2) 对Kubernetes的配置
按照以下步骤,将Filebeat安装为Kubernetes的DaemonSet。
在Kubernetes上运行Filebeat | Filebeat参考手册[8.2] | Elastic
只需要一种选项,对以下内容进行汉语的本地化改写:
[1] 要能够通过kubectl命令访问Kubernetes集群。只需使用以下命令获取节点即可。
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
通过执行以下命令,可以下载用于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
根据环境调整编辑宣言。
使用文本编辑器来编辑 filebeat-kubernetes.yaml 文件。以下是使用 vim 进行编辑的示例。
vim filebeat-kubernetes.yaml
以下是需要更改的地方。将Elasticsearch运行的服务器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
应用配置到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
确定配置是否已应用于Kubernetes集群。
执行以下命令,确认Filebeat是否作为DaemonSet配置并已启动。
kubectl get ds -n kube-system
验证命令的结果是否符合以下要求。只要“READY”与节点数相等即可。以下是节点数为4时(通过kubectl get nodes命令显示)的执行结果。
确认命令结果是否为以下内容。只要”READY”与节点数相同即可。以下是节点数为4时执行的结果的描述。
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
filebeat 4 4 4 4 4 <none> 45m
(3) 在 Kibana 中查看日志.
[1] 进行数据视图的配置。
登录到Kibana,点击左上角的菜单按钮。
滚动页面,选择“管理→堆栈管理”。
在左侧菜单中滚动,选择“Kibana → 数据视图”。

点击右上角的”创建数据视图”,在出现的表格中的Name栏输入filebeat-*。

点击右下方的“创建数据视图”。
查看数据。
点击左上角的菜单按钮,选择”分析 → 发现”。

只要在仪表盘上显示日志即可。