Kubernetes 日志方案对比

简介

Kubernetes是一个开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。在Kubernetes中,日志是非常重要的一部分,它可以帮助开发人员和运维人员监控和调试应用程序。本文将介绍几种常见的Kubernetes日志方案,并对它们进行比较。

方案比较

方案1:容器日志

Kubernetes通过容器运行时收集容器日志。容器运行时通常会将日志输出到标准输出(stdout)和标准错误(stderr)。Kubernetes会收集这些日志,并将其存储在节点上的本地文件系统中。开发人员可以使用kubectl logs命令来查看容器日志。

kubectl logs <pod-name> -c <container-name>

容器日志的优点是简单易用,不需要额外的配置。然而,它的缺点是日志只存储在节点上的本地文件系统中,当节点故障或容器迁移时,日志可能丢失。

方案2:集中式日志系统

为了解决容器日志丢失的问题,可以使用集中式日志系统来收集和存储Kubernetes日志。常见的集中式日志系统有Elasticsearch、Fluentd和Kibana(EFK)等。

在这种方案中,Fluentd作为日志收集代理运行在每个节点上,它会收集容器日志并发送到Elasticsearch进行存储。然后,可以使用Kibana来可视化和查询这些日志。

首先,我们需要部署Elasticsearch和Kibana:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
        - name: elasticsearch
          image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
          ports:
            - containerPort: 9200

---

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
spec:
  selector:
    app: elasticsearch
  ports:
    - port: 9200

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
        - name: kibana
          image: docker.elastic.co/kibana/kibana:7.10.2
          ports:
            - containerPort: 5601

然后,我们需要在每个节点上部署Fluentd:

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: kube-system
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
      read_from_head true
      <parse>
        @type json
      </parse>
    </source>

    <match **>
      @type elasticsearch
      host elasticsearch.default.svc.cluster.local
      port 9200
      index_name fluentd
      type_name fluentd
      logstash_format true
    </match>

---

apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentd
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
rules:
  - apiGroups:
      - ""
    resources:
      - namespaces
      - pods
    verbs:
      - get
      - watch
      - list

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fluentd
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fluentd
subjects:
  - kind: ServiceAccount
    name: fluentd
    namespace: kube-system

---

apiVersion: apps/v1