在今天的文章中,我们将会在 Kubernetes 上部署 Filebeat,并使用 Filebeat 来监视 Kubernetes 中的 Elastic Stack 的运行情况。如果你还没有部署自己的 Kubernetes 的话,请参阅我之前的文章 “在Kubernetes多节点集群部署Elastic Stack”。
我们之前的部署情况是这样的:

准备工作
在我们的 Kubernete 启动起来过后,我们其实并不需要每次都登录到 kmaster 进行操作。我们可以在 Host 机器上安装 kubectl,并同时把kmaster机器里的文件目录 .kube 的内容复制到 host MacOS 机器的 home 目录。针对我的情况:
$ pwd
/Users/liuxg
liuxg:~ liuxg$ ls .kube/
cache config http-cache shell
也就是在我们的 host 机器的 home 目录下,复制了一份和 kmaster home 目录下一摸一样的 .kube 目录。这样我们直接可以在 host 集群上对 kubernetes 进行操作:
$ pwd
/Users/liuxg
liuxg:~ liuxg$ kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 1 2d2h
quickstart-kb-6f487c444d-7kzwb 1/1 Running 1 2d1h
在 Kubernetes 上部署 Filebeat
为了能让 Filebeat 访问 Elasticsearch,我们必须为我们的 Filebeat 配置证书:
kubectl get secrets
$ kubectl get secrets
NAME TYPE DATA AGE
default-quickstart-kibana-user Opaque 3 2d4h
default-token-z5j79 kubernetes.io/service-account-token 3 2d23h
quickstart-es-default-es-config Opaque 1 2d22h
quickstart-es-elastic-user Opaque 1 2d22h
quickstart-es-http-ca-internal Opaque 2 2d22h
quickstart-es-http-certs-internal Opaque 3 2d22h
quickstart-es-http-certs-public Opaque 2 2d22h
quickstart-es-internal-users Opaque 3 2d22h
quickstart-es-transport-ca-internal Opaque 2 2d22h
quickstart-es-transport-certificates Opaque 3 2d22h
quickstart-es-transport-certs-public Opaque 1 2d22h
quickstart-es-xpack-file-realm Opaque 3 2d22h
quickstart-kb-config Opaque 2 2d4h
quickstart-kb-es-ca Opaque 2 2d4h
quickstart-kb-http-ca-internal Opaque 2 2d4h
quickstart-kb-http-certs-internal Opaque 3 2d4h
quickstart-kb-http-certs-public Opaque 2 2d4h
quickstart-kibana-user Opaque 1 2d4h
上面显示了 Kubernetes 的所有的 secret。还记得我们之前密码的来处吗?它就是来自上面的 quickstart-es-elastic-user。对于 Filebeat 所需要用到的证书,它将来自 quickstart-es-http-certs-public。我们将把这个拷入到 Filebeat 的容器中,以使得 Filebeat 能够正常访问我们的 Elasticsearch。
我们参照链接 “Run Filebeat on Kubernetes”, 我们首先来下载在如下地址的 yaml 文件:
curl -L -O https://raw.githubusercontent.com/elastic/beats/master/deploy/kubernetes/filebeat-kubernetes.yaml
经过实测,发现在中国地区有困难下载这个文件。我们需要找到一些办法下载这个问件。我们接下来需要对这个文件来进行修改。完整的 filebeat-kubernetes.yaml 文件,我放在github上:https://github.com/liu-xiao-guo/filebeat-kubernetes
1)这个文件里的所有的 namespace 都是针对 kube-system 的,我们需要把它修改为我们 Elastic Stack 所部署的 namespace:
$ kubectl get ns
NAME STATUS AGE
default Active 2d23h
elastic-system Active 2d23h
kube-node-lease Active 2d23h
kube-public Active 2d23h
kube-system Active 2d23h
kubernetes-dashboard Active 2d23h
我们知道,Elastics Stack 部署在 default namespace 里,所有我们需要把文件里所有的 kube-system 替换为 default。
2) 依据文档中的介绍,它使用的是 filebeat:8.0.0 的版本,显然这个不是我们所需要的版本,而且目前 Elastic Stack 的最新的版本是7.6.2。我们部署的 Elastic Stack 的版本也是7.6.2。所以这个部分我们需要做修改。把版本改为7.6.2 (在写这篇文章的时候,由于一些原因,7.6.2的 image 下载有困难。尝试7.5.2是成功的)。

3)配置 Filebeat 访问 Elasticsearch 所需要的证书(ConfigMap 部分):
cloud.id: ${ELASTIC_CLOUD_ID}
cloud.auth: ${ELASTIC_CLOUD_AUTH}
output.elasticsearch:
hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
username: ${ELASTICSEARCH_USERNAME}
password: ${ELASTICSEARCH_PASSWORD}
ssl.certificate_authorities:
- /etc/certificate/ca.crt
在上面的部分,我添加了:
ssl.certificate_authorities:
- /etc/certificate/ca.crt
目前这个证书还在当前的容器中还不存在。我们需要配置这个证书。
4) 挂载证书
我们找到 DaemonSet 如下的配置部分下的 volumeMoints 及 volumes:
apiVersion: apps/v1
kind: DaemonSet
并做相应的修改:

请注意上面红色框的部分。这些部分是我们需要添加的部分。它把我们上面所说的证书挂载到每个容器的 /etc/certificate/ca.crt 位置。
5)配置 Elasticsearch 服务
我们还是针对上面的 DaemonSet 的配置,找到 ELASTICSEARCH_HOST 部分。它需要配置为 Elasticsearch 的服务。我们可以通过如下的命令来找到 Elasticsearch 的服务:
kubectl get svc
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
quickstart-es-default ClusterIP None <none> <none> 2d23h
quickstart-es-http NodePort 10.111.1.15 <none> 9200:31308/TCP 2d23h
quickstart-kb-http NodePort 10.109.179.162 <none> 5601:31249/TCP 2d5h
上面显示 quickstart-es-http 是我们的 Elasticsearc h的服务。我们需要做如下的修改:

我们需要把 Elasticsearch 的服务填上,并把我们之前得到的密码填入。
好了我们的修改的工作已经完成了。我们接下来打入如下的命令:
kubectl create -f filebeat-kubernetes.yaml
$ kubectl create -f filebeat-kubernetes.yaml
configmap/filebeat-config created
daemonset.apps/filebeat created
clusterrolebinding.rbac.authorization.k8s.io/filebeat created
clusterrole.rbac.authorization.k8s.io/filebeat created
serviceaccount/filebeat created
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/filebeat-cv7tb 0/1 ContainerCreating 0 44s
pod/quickstart-es-default-0 1/1 Running 3 2d6h
pod/quickstart-kb-6f487c444d-7kzwb 1/1 Running 3 2d5h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
service/quickstart-es-default ClusterIP None <none> <none> 2d23h
service/quickstart-es-http NodePort 10.111.1.15 <none> 9200:31308/TCP 2d23h
service/quickstart-kb-http NodePort 10.109.179.162 <none> 5601:31249/TCP 2d5h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/filebeat 1 1 0 1 0 <none> 45s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/quickstart-kb 1/1 1 1 2d5h
NAME DESIRED CURRENT READY AGE
replicaset.apps/quickstart-kb-6f487c444d 1 1 1 2d5h
NAME READY AGE
statefulset.apps/quickstart-es-default 1/1 2d23h
从上面,我们可以看出来 filebeat 已经被创建起来了。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
filebeat-xclxx 1/1 Running 0 3m59s
quickstart-es-default-0 1/1 Running 3 2d7h
quickstart-kb-6f487c444d-7kzwb 1/1 Running 3 2d6h
我们可以通过如下的名来查看 Filebeat 的启动 log:
kubectl logs -f filebeat-xclxx
在 log 里,我们可以看到诸如:

从上面,我们可以看出来,我们的 Filebeat 已经成功地连接到 Elasticsearch。
在 Kibana 中查看数据
我们现在打开 Kibana 界面:

我们打开 Index Management 的界面,我可以看到有一个 filebeat-7.5.2-2020.04.28-000001 的索引。这个就是我们的 Filebeat 收集所有的 pod 的索引。我们创建一个 filebeat-* 的index pattern:

点击 Next step:

点击 Create index pattern:

我们可以选择感谢的 pod 来进行监测:


本文详细介绍如何在Kubernetes环境中部署Filebeat,实现对ElasticStack的监控。通过配置证书和修改部署参数,确保Filebeat能顺利访问Elasticsearch。
1944

被折叠的 条评论
为什么被折叠?



