一 统一日志管理
1.1 日志管理
在 Kubernetes 集群环境中, 一个完整的应用或服务都会涉及为数众多的组件运行, 各组件所在的 Node 及实例数量都是可变的. 日志子系统如果不做集中化管理, 则会给系统的运维支撑造成很大的困难, 因此建议在集群层面对日志进行统一收集和检索等工作.
在容器中输出到控制台的日志, 都会以 *-JSON.log 的命名方式保存在 / var/lib/docker/containers / 目录下.
Kubernetes 推荐采用 Fluentd+Elasticsearch+Kibana 完成对系统和容器日志的采集, 查询和展现工作.
部署统一的日志管理系统, 需要以下两个前提条件.
API Server 正确配置了 CA 证书.
DNS 服务启动, 运行.
1.2 EFK 简介
Kubernetes 开发了一个 Elasticsearch 附加组件来实现集群的日志管理. 这是一个 Elasticsearch,Fluentd 和 Kibana 的组合.
Elasticsearch 是一个搜索引擎, 负责存储日志并提供查询接口;
Fluentd 负责从 Kubernetes 搜集日志, 每个 node 节点上面的 Fluentd 监控并收集该节点上面的系统日志, 并将处理过后的日志信息发送给 Elasticsearch;
Kibana 提供了一个 web GUI, 用户可以浏览和搜索存储在 Elasticsearch 中的日志.
通过在每台 node 上部署一个以 DaemonSet 方式运行的 Fluentd 来收集每台 node 上的日志. Fluentd 将 docker 日志目录 / var/lib/docker/containers 和 / var/log 目录挂载到 Pod 中, 然后 Pod 会在 node 节点的 / var/log/pods 目录中创建新的目录, 可以区别不同的容器日志输出, 该目录下有一个日志文件链接到 / var/lib/docker/contianers 目录下的容器日志输出.
在各 Node 上都运行了一个 Fluentd 容器, 采集本节点 / var/log 和 / var/lib/docker/containers 两个目录下的日志进程, 将其汇总到 Elasticsearch 集群, 最终通过 Kibana 完成和用户的交互工作. 因此 Fluentd 必须在每个 Node 上运行. 为了满足这一需求, 可通过以下几种方式部署 Fluentd.
直接在 Node 主机上部署 Fluentd.
利用 kubelet 的 --config 参数, 为每个 Node 都加载 Fluentd Pod.
利用 DaemonSet 让 Fluentd Pod 在每个 Node 上运行.
二 EFK 部署
2.1 获取 EFK YAML
lasticsearch 附加组件本身会作为 Kubernetes 的应用在集群里运行, 其 YAML 配置文件可从 kubernetes 官方 GitHub 仓库获取:
- https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
- [root@k8smaster01 ~]# mkdir efk
- [root@k8smaster01 ~]# cd efk
- [root@k8smaster01 efk]# ll *.YAML
2.2 修改镜像
对于部分镜像, 建议通过修改镜像从国内源进行下载, 国内相关源参考:
[root@k8smaster01 efk]# sed -i "s/quay.io/quay.azk8s.cn/g" `grep quay.io -rl ./*`
提示: 国内相关源参考: https://blog.csdn.net/networken/article/details/84571373.
2.3 部署 Elasticsearch
- [root@k8smaster01 efk]# vi es-statefulset.YAML
- ......
- resources:
- # need more CPU upon initialization, therefore burstable class
- limits:
- CPU: 1000m
- memory: 600Mi # 建议将内存调小, 避免 Node 节点资源不够
- requests:
- CPU: 100m
- memory: 600Mi # 建议将内存调小, 避免 Node 节点资源不够
- ......
- [root@k8smaster01 efk]# kubectl create -f es-statefulset.YAML
2.4 部署 Elasticsearch SVC
[root@k8smaster01 efk]# kubectl create -f es-service.YAML
2.5 部署 Fluentd
- [root@k8smaster01 efk]# kubectl create -f Fluentd-es-configmap.YAML # 创建 Fluentd ConfigMap
- [root@k8smaster01 efk]# kubectl create -f Fluentd-es-ds.YAML # 部署 Fluentd
2.6 部署 Kibana
- [root@k8smaster01 efk]# vi kibana-deployment.YAML
- ......
- env:
- - name: ELASTICSEARCH_HOSTS
- value: http://Elasticsearch-logging:9200
- # - name: SERVER_NAME
- # value: kibana-logging
- # - name: SERVER_BASEPATH
- # value: /API/v1/namespaces/kube-system/services/kibana-logging/proxy
- # - name: SERVER_REWRITEBASEPATH
- # value: "false"
- ......
提示: kibana 使用 Nodeport 之后, 若直接使用 Nodeport 连接, 会报 404 status 错误, 因为启动参数中添加了 server.basePath, 那么一般是需要在前端做一个反向代理来重定向. 因此在 kibana 的 YAML 文件中删除 SERVER_BASEPATH 该环境变量后, 才可以正常访问.
[root@k8smaster01 efk]# kubectl create -f kibana-deployment.YAML
2.7 部署 Kibana SVC
- [root@k8smaster01 efk]# vi kibana-service.YAML
- apiVersion: v1
- kind: Service
- metadata:
- name: kibana-logging
- namespace: kube-system
- labels:
- k8s-App: kibana-logging
- kubernetes.io/cluster-service: "true"
- addonmanager.kubernetes.io/mode: Reconcile
- kubernetes.io/name: "Kibana"
- spec:
- type: NodePort #模式为 NodePort
- ports:
- - port: 5601
- protocol: TCP
- targetPort: ui
- selector:
- k8s-App: kibana-logging
- [root@k8smaster01 efk]# kubectl create -f kibana-service.YAML
2.8 查看资源
[root@k8smaster01 efk]# kubectl get pods -n kube-system -o wide | grep -E 'NAME|elasticsearch|fluentd|kibana'
- [root@k8smaster01 efk]# kubectl get svc -n kube-system -o wide | grep -E 'NAME|kibana' # 查看保留的 SVC
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- kibana-logging NodePort 10.105.239.129 <none> 5601:30008/TCP 2m59s k8s-App=kibana-logging
2.9 测试访问
浏览器直接访问: http://172.24.8.71:30008/
尝试查找 error 关键字日志.
来源: https://www.cnblogs.com/itzgr/p/12678198.html