日志收集插件使用阿里云开源log-pilot
一、原理:
使用 log-pilot 作为日志收集客户端(使用 ack 集群的话 log-pilot 可作为组件在控制台安装),制定收集规则,将容器日志(落盘文件/控制台)收集到 elastic,使用 kibana 进行查阅
二、部署:
处于兼容性考虑,阿里云 log-pilot 建议使用 elastic 版本低于 7.0,这里使用 6.8.0。
1、部署 eck 工具
在 k8s 里部署 elastic 和 kibana,官方提供了便捷的部署工具 ECK:部署 eck 工具说明
- 部署 eck:
kubectl apply -f https://download.elastic.co/downloads/eck/1.6.0/all-in-one.yaml
- 验证部署状态:
kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
2、部署 elastic
- 注意事项(本地化适配和易用性):
- 选择兼容 log-pilot 的 es 版本:6.8.0(log-pilot 建议 7.0 以下)
- 检查 ack 集群使用的 work 节点规格支持的磁盘类型,如 ecs.g6e.xlarge(通用平衡增强型实例规格族 g6e)实例仅支持 ESSD 云盘,在使用 storageClass 创建 pv 时,仅支持 alicloud-disk-essd 类型( alicloud-disk-available 类型也不行,会卡在第一步 - 选取 ssd 的时候直接报错,不会走到选取 essd 这一步)
- 指定 name(如:unpro-k8s)、namespace(如:demo-ops),便于维护和标准化;
- 禁用自签名 TLS 证书加密以提升传输效率(如需进行 https 加密单独加密 Kibana 的 ingress 入口即可)
- 使用特权容器修改内核参数 vm.max_map_count=262144、设置 node.store.allow_mmap 配置项留空(使用默认值)以允许 Elasticsearch 使用内存映射 ( mmap) 高效访问索引。
- 通过自定义 storageClass 为 es 集群提升存储空间(默认只有 5G)
- 可酌情按需调整 es 的堆内存配置
- 所有可选配置项
- 示例编排文件:
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: unpro-k8s
namespace: demo-ops
spec:
version: 6.8.0
volumeClaimDeletePolicy: DeleteOnScaledownOnly
http:
tls:
selfSignedCertificate:
disabled: true
nodeSets:
- name: lx-log
count: 1
podTemplate:
spec:
initContainers:
- name: sysctl
securityContext:
privileged: true
command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200Gi
storageClassName: alicloud-disk-essd
- 创建 elasticsearch 集群:
kubectl apply -n demo-ops -f log-es.yaml
- 获取刚刚创建的自定义资源对象 elasticsearch 集群的状态:
kubectl get elasticsearch -n demo-ops
- 通过 describe 检查 pod 状态,如有异常根据日志提示分析解决
- 本地验证 es 集群状态(以下命令均指定命名空间 demo-ops 执行):
- 获取 elasticsearch 的认证密码(secret 名根据前文设置修改,用户名默认为:elastic):
PASSWORD=$(kubectl get secret unpro-k8s-es-elastic-user -n demo-ops -o go-template='\{\{.data.elastic | base64decode\}\}')
- 另开一个会话窗口设置端口转发:
kubectl -n demo-ops port-forward service/unpro-k8s-es-http 9200
- 使用 curl 获取集群信息进行功能验证(注意如果没有开启 TLS 加密的话 url 协议为需使用 http):
curl -u "elastic:$PASSWORD" -k "http://localhost:9200"
- 获取 elasticsearch 的认证密码(secret 名根据前文设置修改,用户名默认为:elastic):
3、部署 Kibana
- 注意事项:
- 禁用自签名 TLS 证书加密(必选,组件内部通讯加密只会损耗性能,对外开放入口使用可信证书机构的 TLS 对 Kibana 单独加密即可);
- Kibana 要对外访问可通过 ingress 暴露,进阶可使用可信证书机构的 TLS 加密;
- 指定 name(如:unpro-k8s)、namespace(如:demo-ops),便于维护和标准化;
- elasticsearchRef 字段的值需要和上文中创建的 es 集群的名字保持一致,否则无法互相关联起来
- 按需开启中文支持(配置项:i18n.locale: “zh-CN”)
- 示例编排文件:
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: unpro-k8s
namespace: demo-ops
spec:
version: 6.8.0
count: 1
elasticsearchRef:
name: unpro-k8s
http:
tls:
selfSignedCertificate:
disabled: true
config:
i18n.locale: "zh-CN"
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: unpro-k8s-kibana
namespace: demo-ops
spec:
rules:
- host: unprolog.imwang.top
http:
paths:
- backend:
serviceName: unpro-k8s-kb-http
servicePort: 5601
path: /
- 创建 kibana:
kubectl apply -f log-kibana.yaml
- 添加域名解析后浏览器访问 url 验证:
- 用户名:elastic
- 密码获:参见上文获取方式
4、部署 log-pilot
【可选】如果是 java 应用,为了聚合错误日志(如堆栈),需进行行首正则匹配:修改 log-pilot 镜像文件中的 filebeat.tpl 文件重新 build 镜像,配置详情可参考
- 编写 log-pilot 使用的编排文件,注意事项说明如下:
- 指定 namespace(如:demo-ops,不必须在 kube-system),便于维护和标准化;
- 新增 PILOT_LOG_PREFIX 环境变量修改声明式日志配置前缀(默认为 aliyun)
- 修改上报的 elasticsearch 地址及认证配置
- 示例 编排文件:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-pilot
labels:
app: log-pilot
namespace: demo-ops
spec:
selector:
matchLabels:
app: log-pilot
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: log-pilot
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-pilot
# 版本请参考https://github.com/AliyunContainerService/log-pilot/releases。
image: registry-vpc.cn-hangzhou.aliyuncs.com/demo-public/log-pilot:v0.9.7-filebeat-multiline
resources:
limits:
memory: 500Mi
requests:
cpu: 200m
memory: 200Mi
env:
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "PILOT_LOG_PREFIX"
value: "demo"
- name: "LOGGING_OUTPUT"
value: "elasticsearch"
# 请确保集群到ES网络可达。
- name: "ELASTICSEARCH_HOSTS"
value: "unpro-k8s-es-http.demo-ops.svc.cluster.local:9200"
# 配置ES访问权限。
- name: "ELASTICSEARCH_USER"
value: "elastic"
- name: "ELASTICSEARCH_PASSWORD"
value: "xxxxx"
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: root
mountPath: /host
readOnly: true
- name: varlib
mountPath: /var/lib/filebeat
- name: varlog
mountPath: /var/log/filebeat
- name: localtime
mountPath: /etc/localtime
readOnly: true
livenessProbe:
failureThreshold: 3
exec:
command:
- /pilot/healthz
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: root
hostPath:
path: /
- name: varlib
hostPath:
path: /var/lib/filebeat
type: DirectoryOrCreate
- name: varlog
hostPath:
path: /var/log/filebeat
type: DirectoryOrCreate
- name: localtime
hostPath:
path: /etc/localtime
- 创建 log-pilot:
kubectl apply -f log-pilot.yaml
- 查看状态确保正常:
kubectl describe daemonsets -n demo-ops
二、采集日志:
- 注意事项:
- 日志路径(可以使用 configmap 全局变量注入,也可以在每个服务自己 deployment 中指定)
- 针对不同的环境已经不同服务打 tag 进行区分(各服务的 deployment 中单独配置)
- 日志是否按等级分类(按需创建配置 - 自动生成对应索引)
- 【注意】即时使用了行首正则匹配,日志解析格式也无须设置为 regxp(全局正则),使用”逐行简单文本 + 行首正则匹配“也是可以的
- 通过在 deployment 中定义环境变量的方式,动态地生成日志采集配置文件
- 示例demo
- log-polit 正常收集日志后,会在 elasticsearch 中生成索引,命名规则是:$name-日期(按天拆分)
- 可以登陆到 elasticsearch 的 pods 中获取索引列表:
curl --user elastic:Mn4z603F1SrD37S3g8J9MvZh 'localhost:9200/_cat/indices?v'
- 可以登陆到 elasticsearch 的 pods 中获取索引列表:
三、Kibana 配置:
不展开详述,仅说明一些注意事项/常用的配置项
- 注意事项:
- 添加索引用于加载查询
- 权限管理:配置用户角色权限(基于 X-Pack)
- 设置索引保存时间(索引生命周期管理)
- 索引必须满足“模板”和“别名”两个条件才可以设置生命周期策略
- 给索引添加周期策略有两种方式: 1. 将周期策略添加到索引模板(推荐:可以将策略应用到整个别名覆盖的索引);2. 给某个索引添加周期策略(只能覆盖当前索引,新滚动的索引不再受周期策略影响)
参考资料:
- https://www.elastic.co/guide/en/cloud-on-k8s/1.6/k8s-deploy-eck.html
- https://www.elastic.co/guide/en/cloud-on-k8s/1.6/k8s-operator-config.html
- https://www.elastic.co/guide/en/cloud-on-k8s/1.6/k8s-deploy-elasticsearch.html
- https://www.elastic.co/guide/en/cloud-on-k8s/1.6/k8s-deploy-kibana.html
- https://www.elastic.co/guide/en/cloud-on-k8s/1.6/k8s-operator-config.html
- https://help.aliyun.com/document_detail/86552.html