k8s学习-安装EFK进行集群日志管理

网友投稿 286 2022-09-08

k8s学习-安装EFK进行集群日志管理

kubernetes开发了一个Elasticsearch附加组件来实现集群的日志管理。这是Elasticsearch,Fuented和Kibana的组件,简称EFK。Elasticsearch是一个搜索引擎,负责存储日志并提供查询接口;Fluentd负责从Kunbernetes搜集日志并发送Elasticsearch;Kibana提供了一个WEB UI,用户可以浏览和搜索存储在Elasticsearch中的日志。

逻辑关系架构如下所示:

实验环境,默认将kubernetes系统组件的日志输出到/var/log目录下,容器输出到stdout和stderr的日志由docker server保存在/var/lib/docker/containers目录下。通过每个node都部署一个Fluentd容器来采集本节点在这两个目录下的日志文件,然后将其汇总到Elasticsearch库中来保存,而用户通过Kibana提供的Web页面查询日志。

部署Elasticsearch服务

Elasticsearch的Deplpoyment和Service的定义如下:

---apiVersion: apps/v1kind: Deploymentmetadata: name: elasticsearch namespace: kube-system labels: k8s-app: elasticsearch version: v7.5.1 addonmanager.kubernetes.io/mode: Reconcilespec: replicas: 1 selector: matchLabels: k8s-app: elasticsearch version: v7.5.1 template: metadata: labels: k8s-app: elasticsearch version: v7.5.1 spec: initContainers: - name: elasticsearch-init image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sysctl", "-w", "vm.max_map_count=262144"] securityContext: privileged: true containers: - name: elasticsearch image: elasticsearch:7.5.1 imagePullPolicy: IfNotPresent env: - name: namespace valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: node.name valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: cluster.name value: elasticsearch - name: discovery.type value: single-node #单节点模式 - name: NUMBER_OF_MASTERS value: "1" - name: xpack.security.enabled value: "false" - name: network.host value: 0.0.0.0 - name: network.publish_host valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP resources: limits: # 根据实际情况修改 cpu: 2 memory: 4Gi requests: cpu: 100m memory: 1Gi ports: - containerPort: 9200 name: db protocol: TCP - containerPort: 9300 name: transport protocol: TCP livenessProbe: tcpSocket: port: transport initialDelaySeconds: 5 timeoutSeconds: 10 readinessProbe: tcpSocket: port: transport initialDelaySeconds: 5 timeoutSeconds: 10 volumeMounts: - name: elasticsearch mountPath: /usr/share/elasticsearch/data volumes: - name: elasticsearch hostPath: #保存在node上,可以根据实际情况修改 path: /root/es/elasticsearch-data #挂载路径,注意权限---apiVersion: v1kind: Servicemetadata: name: elasticsearch namespace: kube-system labels: k8s-app: elasticsearch kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: "Elasticsearch"spec: selector: k8s-app: elasticsearch version: v7.5.1 ports: - port: 9200 protocol: TCP targetPort: db

配置说明:

初始化设置参数,需要在node节点的服务上配置vm.max_map_count=262144,这是安装需求,max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量,修改方式如下:

#查看当前参数配置sysctl -a| grep vm.max_map_count#临时修改sysctl -w vm.max_map_count=262144#永久修改echo "vm.max_map_count=262144" >> /etc/sysctl.confsysctl -p

数据存储目录,实验中使用hostpath将数据保存在node上,可以根据实际修改实验中,yaml文件配置hostpath是/root/es/elasticsearch-data,可以按照实际情况修改,但是千万要注意该路径权限,不然es在安装的时候容器会报错,AccessDeniedException,类似如下输出

显示没有权限进行挂载,按照如下进行修改

chmod 777 /root/es/elasticsearch-data #该命令在es的pod调度上的node执行

资源限制应该根据实际情况调整,如果设置的太小,则可能会导致OOM KILLdicovery.type设置为single-node,意思是单节点模式。ES可以部署为高可用集群模式,包括master,client,data等节点

部署完成后,确认pod运行。

kubectl apply -f elasitcsearch.yamlkubectl -n kube-system get pod -l k8s-app=elasticsearch

通过访问es的url确认是否运行

kubectl -n kube-system get svc -l k8s-app=elasticsearchcurl 10.233.188.86:9200

在每个Node上都部署Fluentd

Fluentd以Daemonset模式在每个Node上都启动一个pod来进行日志采集,对各种日志采集和连接Elasticsearch服务的具体配置使用ConfigMap进行设置。yaml文件如下配置

# fluentd.yaml---apiVersion: apps/v1kind: DaemonSetmetadata: name: fluentd namespace: kube-system labels: k8s-app: fluentdspec: selector: matchLabels: k8s-app: fluentd template: metadata: labels: k8s-app: fluentd spec: containers: - name: fluentd image: fluent/fluentd:v1.9.2-1.0 imagePullPolicy: IfNotPresent resources: limits: memory: 500Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true - name: config-volume mountPath: /etc/fluent/config.d volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: config-volume configMap: name: fluentd-config---kind: ConfigMapapiVersion: v1metadata: name: fluentd-config namespace: kube-system labels: addonmanager.kubernetes.io/mode: Reconciledata: fluentd.conf : |- # container stdout and stderr log @id fluentd-containers.log @type tail path /var/log/containers/*.log pos_file /var/log/es-containers.log.pos tag raw.container.* read_from_head true @type multi_format format json time_key time time_format %Y-%m-%dT%H:%M:%S.%NZ format /^(? # kube-apiserver log @id kube-apiserver.log @type tail format multiline multiline_flush_interval 5s format_firstline /^\w\d{4}/ format1 /^(?\w)(?

配置说明:

将宿主机Node的/var/log和/var/lib/docker/containers目录挂载到 fluentd容器中,用于读取容器输出到stdout和stderr的日志,以及kubernetes组件的日志。上述配置中,采集了kube-apiserver服务的WARNING日志,其他组件的配置省略资源限制根据实际情况进行调整,避免Fluentd占用了太多资源。hosts elasticsearch:9200 ,设置了elasticsarch服务的访问地址,此处使用了service名称,由于flunetd与Elasticsearch处于同一个命名空间中,所以此处省略了命名空间的名称。logstash_prefix es: Fluentd在Elasticsearch中创建索引(index)的前缀

创建并查看Fluentd容器

kubeclt create -f fluentd.yamlkubectl -n kube-system get daemonset -l k8s-app=fluentd

查看 Fluentd的容器日志,会看到连接到Elasticsearch服务的记录,以及后续采集各种日志文件内容的记录。

通过Elasticsearch服务的api,查看已经创建的索引信息:

此时,已经完成了Elasticsearch和Fluentd,数据的采集,汇总和保存工作已经完成。

部署Kibana服务

yaml文件定义如下:

# kibana.yaml---apiVersion: apps/v1kind: Deploymentmetadata: name: kibana namespace: kube-system labels: k8s-app: kibana addonmanager.kubernetes.io/mode: Reconcilespec: replicas: 1 selector: matchLabels: k8s-app: kibana template: metadata: labels: k8s-app: kibana spec: containers: - name: kibana image: kibana:7.5.1 imagePullPolicy: IfNotPresent resources: limits: cpu: 1 requests: cpu: 100m env: - name: ELASTICSEARCH_HOSTS value: - name: SERVER_NAME value: kibana #- name: SERVER_BASEPATH 以nodeport方式,此处要注释掉 # value: /api/v1/namespaces/kube-system/services/kibana/proxy - name: SERVER_REWRITEBASEPATH value: "false" ports: - containerPort: 5601 name: ui protocol: TCP---apiVersion: v1kind: Servicemetadata: name: kibana namespace: kube-system labels: k8s-app: kibana kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: "Kibana"spec: selector: k8s-app: kibana ports: - port: 5601 protocol: TCP targetPort: ui

关键配置如下:

ELASTICSEARCH_HOSTS:设置Elasticsearch服务的访问地址,此处使用服务名称SERVER_BASEPATH:设置Kibana服务通过API Server代理的访问路径,此处要注释掉,因为后面需要通过nodeport方式访问kibana

部署运行

kubectl apply -f kibana.yamlkubectl -n kube-system get pods -l k8s-app=kibana

由于默认yaml配置文件es,flunted,kibana都是采用ClusterIP的方式,需要访问的话,需要将对应的service改为nodeport的方式。​

kubectl edit svc elasticsearch -n kube-systemkubectl edit svc kibna -n kube-system

修改完成,查看svc,就知道访问地址

访问kibana

由于使用了nodeport的方式,可以从任意的node的 ip地址加端口访问

​​Index Patterns页面创建index

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:K8s使用手册(2)—— 软件配置
下一篇:起底“1亿锦鲤”信小呆:生活窘迫还是卖惨营销?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~