K8S日志收集方案
因为同一个服务可能会运行多个Pod,甚至还会调度到不同的Node,想要收集日志的基本思路有三种
是每个服务在构建基础镜像时就将日志采集服务添加到基础镜像中
为每个pod添加一个日志采集服务的容器
将pod日志挂载到宿主机,在每个Node上运行一个日志采集服务
第一种方法耦合性最高,但如果是中途想要调整日志采集方案,基本上需要修改所有基础镜像 第二种则灵活性比较高,甚至可以基于不同的规模使用不同的日志采集服务。但和第一点一样会对服务器资源占用比较大,因为每个pod都要增加一个日志采集服务pod越多,日志采集服务占用资源越多 第三种对资源的占用是最少的,因为只需要在每个Node上运行一个日志采集服务即可。但对于日志采集服务路径的管理不方便。无法准确的区分出每一个服务的日志,同时每次新增服务也需要重启所有Node上的日志采集服务来更新日志路径配置。
鉴于目前的情况,更推荐用第二种方案来实现对容器日志的采集。以下将在每个服务pod中添加一个filebeat来采集日志,使用Elasticsearch 进行存储、索引,使用kibana进行可视化查询
前置环境:K8S集群环境,
filebeat配置为多索引,如果要配置单索引,请参考[[filebeat应用#单索引配置示例]] yaml文件示例:
# apiVersion版本根据实际的K8S版本选择, 这里是1.8.6版本的K8S
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: kube-system
labels:
k8s-app: filebeat
data:
filebeat.yml: |-
# 防止重启后从头读取日志文件,必须指定path.data路径,并将该路径挂载到一个不会被删除的位置
path.data: /usr/share/filebeat/data
filebeat.inputs:
- type: filestream
id:test-nginx-access
enabled: true
paths:
- /usr/local/tomcat/logs/access.log
tags: ["nginx_access"]
- type: filestream
id: test-nginx-error
enabled: true
paths:
- /usr/local/tomcat/logs/error.log
tags: ["nginx_error"]
setup.template.enabled: false
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.template.overwrite: false
#output.elasticsearch.index: "customname-%{+yyyy.MM.dd}"
# setup.ilm.enabled项配置为false,上面的‘output.elasticsearch.index’自定义内容才会生效
# 否则到es中查询索引只会有filebeat
setup.ilm.enabled: false
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 0
setup.kibana:
output.elasticsearch:
hosts: ["127.0.0.1:9200"]
protocol: "http"
username: "elastic"
password: "passwd"
indices:
- index: "nginx-access-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_access"
- index: "nginx-error-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx_error"
processors:
- add_id: ~
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-nginx
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
app: test-nginx
spec:
#nodeName: 127.0.0.1
containers:
- name: test-nginx
image: nginx
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30
failureThreshold: 3
periodSeconds: 10
timeoutSeconds: 5
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 15
failureThreshold: 2
periodSeconds: 3
timeoutSeconds: 3
volumeMounts:
- name: tomcatlog
mountPath: /var/log/nginx
ports:
- containerPort: 80
- name: test-nginx-filebeat
image: filebeat:7.17.7
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
env:
- name: ELASTICSEARCH_HOST
value: 127.0.0.1
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
value: passwd
volumeMounts:
- name: config
mountPath: /usr/share/filebeat/filebeat.yml
readOnly: true
subPath: filebeat.yml
- name: tomcatlog
mountPath: /usr/share/filebeat/data
- name: tomcatlog
mountPath: /usr/local/tomcat/logs
# readOnly: true
volumes:
- name: tomcatlog
nfs:
server: 127.0.0.1
path: "/data/kubernetes/logs/nginxlogs"
- name: config
configMap:
defaultMode: 0640
name: filebeat-config
---
apiVersion: v1
kind: Service
metadata:
name: test-nginx
namespace: kube-system
labels:
app: test-nginx
spec:
clusterIP: 172.24.11.199
ports:
- name: webapps
port: 80
targetPort: 80
selector:
app: test-nginx
最后更新于