k8s环境中部署EFK

x33g5p2x  于2021-03-14 发布在 ElasticSearch  
字(5.9k)|赞(0)|评价(0)|浏览(184)

Kubernetes 开发了一个 Elasticsearch 附加组件来实现集群的日志管理。这是一个 Elasticsearch、Fluentd 和 Kibana 的组合。

  • Elasticsearch 是一个搜索引擎,负责存储日志并提供查询接口;
  • Fluentd 负责从 Kubernetes 搜集日志,每个node节点上面的fluentd监控并收集该节点上面的系统日志,并将处理过后的日志信息发送给Elasticsearch;
  • Kibana 提供了一个 Web GUI,用户可以浏览和搜索存储在 Elasticsearch 中的日志。

通过在每个node节点部署一个以DaemonSet方式运行的fluentd来收集每个节点上的日志。Fluentd将docker日志目录/var/lib/docker/containers和/var/log目录挂载到Pod中,然后Pod会在node节点的/var/log/pods目录中创建新的目录,可以区别不同的容器日志输出,该目录下有一个日志文件链接到/var/lib/docker/contianers目录下的容器日志输出。

项目地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch

Elasticsearch

Elasticsearch部署为StatefulSet,类似于deployment,但允许维护存储卷上的状态。

初始化

Elasticsearch StatefulSet清单指定在Elasticsearch容器本身之前应该执行一个 init容器,以确保内核状态变量 vm.max_map_count至少为262144,因为这是Elasticsearch的要求。如果您知道主机操作系统满足此要求,则可以删除init容器。

存储

Elasticsearch StatefulSet将使用EmptyDir卷来存储数据。当pod终止时,EmptyDir被删除,这里它仅用于测试目的。重要提示:在您的设置中实际使用此StatefulSet之前,请将存储更改为持久量声明!

存储配置参考:https://github.com/dotbalo/k8s/tree/master/k8s-efk

原理图:

部署EFK

从官方github仓库下载yaml文件

git clone https://github.com.cnpmjs.org/kubernetes/kubernetes.git --depth=1
cd kubernetes/cluster/addons/fluentd-elasticsearch/

修改yaml文件使用dockerhub镜像仓库:

cat *.yaml | grep image:
sed -i 's#quay.io/fluentd_elasticsearch/elasticsearch:v7.4.2#willdockerhub/elasticsearch:v7.4.2#g' *.yaml
sed -i 's#quay.io/fluentd_elasticsearch/fluentd:v3.0.1#willdockerhub/fluentd:v3.0.1#g' *.yaml
sed -i 's#docker.elastic.co/kibana/kibana-oss:7.2.0#willdockerhub/kibana-oss:7.2.0#g' *.yaml

创建并修改命名空间

kubectl create ns logging
sed -i 's/namespace: kube-system/namespace: logging/g' *.yaml

Node节点打标签

Fluentd 是以 DaemonSet 的形式运行在 Kubernetes 集群中,这样就可以保证集群中每个 Node 上都会启动一个 Fluentd,我们在 Master 节点创建 Fluented 服务,最终会在各个 Node 上运行,查看fluentd-es-ds.yaml 信息:

[centos@k8s-master efk]$ kubectl get -f fluentd-es-ds.yaml
NAME                        SECRETS   AGE
serviceaccount/fluentd-es   1         70m

NAME                                               AGE
clusterrole.rbac.authorization.k8s.io/fluentd-es   70m

NAME                                                      AGE
clusterrolebinding.rbac.authorization.k8s.io/fluentd-es   70m

NAME                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                              AGE
daemonset.apps/fluentd-es-v2.2.1   0         0         0       0            0           beta.kubernetes.io/fluentd-ds-ready=true   70m

通过输出内容我们发现 NODE-SELECTOR 选项为 beta.kubernetes.io/fluentd-ds-ready=true,这个选项说明 fluentd 只会调度到设置了标签 beta.kubernetes.io/fluentd-ds-ready=true 的 Node 节点,否则fluentd的pod无法正常启动。

查看集群中 Node 节点是否有这个标签:

[centos@k8s-master efk]$ kubectl describe nodes k8s-node1
Name:               k8s-node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/hostname=k8s-node1
......

发现没有这个标签,为需要收集日志的Node 打上这个标签:

kubectl label node beta.kubernetes.io/fluentd-ds-ready=true --all
[centos@k8s-master elk]$ kubectl label node k8s-node1 beta.kubernetes.io/fluentd-ds-ready=true 
node/k8s-node1 labeled
[centos@k8s-master elk]$ kubectl label node k8s-node2 beta.kubernetes.io/fluentd-ds-ready=true  
node/k8s-node2 labeled

执行所有yaml文件

kubectl apply -f ./

所有资源都部署在 kube-system Namespace里,镜像拉取可能需要一段时间,拉取失败也可以登录对应节点手动拉取。

查看pod状态:

[centos@k8s-master efk]$ kubectl get pod -n kube-system -o wide
NAME                                    READY   STATUS    RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
coredns-78d4cf999f-7hv9m                1/1     Running   6          15d     10.244.0.15     k8s-master   <none>           <none>
coredns-78d4cf999f-lj5rg                1/1     Running   6          15d     10.244.0.14     k8s-master   <none>           <none>
elasticsearch-logging-0                 1/1     Running   0          97m     10.244.1.105    k8s-node1    <none>           <none>
elasticsearch-logging-1                 1/1     Running   0          96m     10.244.2.95     k8s-node2    <none>           <none>
etcd-k8s-master                         1/1     Running   6          15d     192.168.92.56   k8s-master   <none>           <none>
fluentd-es-v2.3.2-jkkgp                 1/1     Running   0          97m     10.244.1.104    k8s-node1    <none>           <none>
fluentd-es-v2.3.2-kj4f7                 1/1     Running   0          97m     10.244.2.93     k8s-node2    <none>           <none>
kibana-logging-7b59799486-wg97l         1/1     Running   0          97m     10.244.2.94     k8s-node2    <none>           <none>
kube-apiserver-k8s-master               1/1     Running   6          15d     192.168.92.56   k8s-master   <none>           <none>
kube-controller-manager-k8s-master      1/1     Running   7          15d     192.168.92.56   k8s-master   <none>           <none>
kube-flannel-ds-amd64-ccjrp             1/1     Running   6          15d     192.168.92.56   k8s-master   <none>           <none>
kube-flannel-ds-amd64-lzx5v             1/1     Running   9          15d     192.168.92.58   k8s-node2    <none>           <none>
kube-flannel-ds-amd64-qtnx6             1/1     Running   7          15d     192.168.92.57   k8s-node1    <none>           <none>
kube-proxy-89d96                        1/1     Running   0          7h32m   192.168.92.57   k8s-node1    <none>           <none>
kube-proxy-t2vfx                        1/1     Running   0          7h32m   192.168.92.56   k8s-master   <none>           <none>
kube-proxy-w6pl4                        1/1     Running   0          7h32m   192.168.92.58   k8s-node2    <none>           <none>
kube-scheduler-k8s-master               1/1     Running   7          15d     192.168.92.56   k8s-master   <none>           <none>
kubernetes-dashboard-847f8cb7b8-wrm4l   1/1     Running   8          15d     10.244.2.80     k8s-node2    <none>           <none>
tiller-deploy-7bf99c9559-8p7w4          1/1     Running   5          6d21h   10.244.1.90     k8s-node1    <none>           <none>

查看其它信息:

[centos@k8s-master efk]$ kubectl get daemonset -n kube-system 
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                              AGE
fluentd-es-v2.2.1         2         2         2       2            2           beta.kubernetes.io/fluentd-ds-ready=true   164m
......
[centos@k8s-master efk]$ kubectl get statefulset -n kube-system 
NAME                    READY   AGE
elasticsearch-logging   2/2     6m32s
[centos@k8s-master efk]$ kubectl get service -n kube-system 
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
elasticsearch-logging   ClusterIP   10.107.236.158   <none>        9200/TCP        6m51s
kibana-logging          ClusterIP   10.97.214.200    <none>        5601/TCP        6m51s
......

访问 kibana

通过 kubectl proxy 访问:

通过proxy代理将kibana服务暴露出来:

kubectl proxy --address='192.168.92.56' --port=8086 --accept-hosts='^*$'
[centos@k8s-master efk]$ kubectl proxy --address='192.168.92.56' --port=8086 --accept-hosts='^*$'
Starting to serve on 192.168.92.56:8086

或者创建ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kibana
  namespace: logging
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: kibana.net
    http:
      paths:
      - backend:
          serviceName: kibana-logging
          servicePort: 5601

浏览器重新访问,端口改为8086:

http://192.168.92.56:8086/api/v1/namespaces/kube-system/services/kibana-logging/proxy

我们需要创建一个index-pattern索引,点击导航栏 “Management” -> “index pattern”, “Index name or pattern” Index pattern默认为 logstash-* 即可:

“Time-field name” 默认 @timestamp,最后点击 “Create” 即可完成索引创建。

等待一会,查看边栏中的”Discover”,如果你看到类似下面截图中的日志内容输出,说明kibana可以正常从elasticsearch获取数据了:

使用filebeat

参考:https://github.com/elastic/beats/blob/master/deploy/kubernetes/filebeat-kubernetes.yaml

相关文章

热门文章

更多