我们Kubernetes平台中日志收集,主要收集那些日志:
K8S系统的组件日志
K8S Cluster里面部署的应用程序日志
日志方案:
容器中的日志怎么收集:
方案一:
Node上部署一个日志收集程序
DaemonSet方式部署日志收集程序
对本节点/var/log和 /var/lib/docker/containers/
两个目录下的日志进行采集
优点:
每个Node仅需部署一个日志收集程序,
资源消耗少,对应用无侵入
缺点:
应用程序日志需要写到标准输出和标准错误输出,
不支持多行日志
方案二:
Pod中附加专用日志收集的容器
每个运行应用程序的Pod中增加一个日志
收集容器,使用emtyDir共享日志目录让
日志收集程序读取到。
优点:
低耦合
缺点:
每个Pod启动一个日志收集代理,增加资源消耗, 并增加运维维护成本
方案三:
应用程序直接推送日志
开发直接定制了
优点:
无需额外收集工具
缺点:
浸入应用,增加应用复杂度
ELK安装
ELK官网:https://www.elastic.co/cn/
配置yum源参考:https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
安装jdk:
yum install -y java-1.8.0-openjdk
配置yum源:
[root@localhost ~]# cat /etc/yum.repos.d/elk.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装:
yum install -y logstatsh elasticsearch kibana -y
elasticsearch 关键配置:
network.host: 服务器IP地址
http.port: 9200
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
,注意,es需要优化一些内核参数。优化参数:
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 65535
* hard nproc 65535
运行:sysctl -p 生效配置。
kibana相关配置:
server.port: 5601
server.host: "服务器IP"
server.name: "kibana"
elasticsearch.url: "http://ES服务IP:9200" #上面你的elasticsearch服务地址
elasticsearch.preserveHost: true
kibana.index: ".kibana"
kibana汉化参考:https://github.com/anbai-inc/Kibana_Hanization
git clone https://github.com/anbai-inc/Kibana_Hanization.git
cd Kibana_Hanization/
python main.py /usr/share/kibana
ok,汉化就完成了。
此时可以启动kibana,es
采集端filebeat,采集k8s集群日志
我们采用configmap的形式来保存filebeat配置,采用DaemonSet形式部署filebeat,
然后将配置文件和日志文件挂载到fiebeat,
,利用filebeat采集k8s集群日志:
[root@master elk]# cat k8s-logs.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: k8s-logs-filebeat-config
namespace: kube-system
data:
filebeat.yml: |-
filebeat.prospectors:
- type: log
paths:
- /messages
#标签
fields:
app: k8s
type: module
#代表第一层级,用于Kibana展示
fields_under_root: true
output.logstash:
hosts: ['192.168.1.26:5044']
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: k8s-logs
namespace: kube-system
spec:
selector:
matchLabels:
project: k8s
app: filebeat
template:
metadata:
labels:
project: k8s
app: filebeat
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:6.5.4
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 500Mi
securityContext:
runAsUser: 0
volumeMounts:
- name: filebeat-config
mountPath: /etc/filebeat.yml
subPath: filebeat.yml
- name: k8s-logs
mountPath: /messages
volumes:
- name: k8s-logs
hostPath:
path: /var/log/messages
type: File
- name: filebeat-config
configMap:
name: k8s-logs-filebeat-config
运行, 创建filebeat采集端,根据/var/log/message.将目录挂载到容器,让filebeat读取:
创建:
kubectl apply -f k8s-logs.yaml
检测filebeat配置是否挂载进去:
kubectl exec -it k8s-logs-j96hw bash -n kube-system
[root@k8s-logs-j96hw filebeat]# more /messages
....
[root@k8s-logs-j96hw filebeat]# cat /etc/filebeat.yml
filebeat.prospectors:
- type: log
paths:
- /messages
#标签
fields:
app: k8s
type: module
#代表第一层级,用于Kibana展示
fields_under_root: true
output.logstash:
hosts: ['192.168.1.26:5044']
配置logstash接收日志并且在kibana展示:
配置logstash接收日志配置。 stdout { codec => rubydebug }用于打印日志到控制台方便调试。
[root@localhost conf.d]# cat k8s.conf
input {
beats {
port => 5044
}
}
filter {
}
output {
elasticsearch {
hosts => ["http://192.168.1.25:9200"]
index => "k8s-log-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
运行logstash:
/usr/share/logstash/bin/logstash -f k8s.conf
控制台输出
kibana建立索引展示:
建立索引在系统管理–>create index pattern中