Kubernetes 开发了一个 Elasticsearch 附加组件来实现集群的日志管理。这是一个 Elasticsearch、Fluentd 和 Kibana 的组合。
通过在每个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
原理图:
从官方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
......
通过 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获取数据了:
参考:https://github.com/elastic/beats/blob/master/deploy/kubernetes/filebeat-kubernetes.yaml
内容来源于网络,如有侵权,请联系作者删除!