日志方案调研

背景与目标

1.背景

应用日志可以让你了解应用内部的运行情况。日志对调试问题和监控集群活动非常有用。大部分现代化应用都有某种日志记录机制。同样的,容器引擎也被设计成支持日志记录。针对容器化应用,最简单最广泛采用的日志记录方式就是写入标准输出和标准错误流。

但是,由容器引擎或运行时提供的原生功能通常不足以构成完整的日志记录方案。

例如。如果发生容器崩溃、pod被逐出或节点宕机等情况,就不能访问访问应用日志。因此,需要一个独立的后端用来存储、分析和查询日志。

2.目标

针对以上问题,需要根据不同应用场景指定相应的方案设计

  • 使用在每个节点上运行的节点级日志记录代理。
  • 在应用程序的 Pod 中,包含专门记录日志的边车(Sidecar)容器。
  • 将日志直接从应用程序中推送到日志记录后端。

3.参考文档

fluentd官网:kafka - Fluentd

fluent-bit官网:Fluent Bit v2.2 Documentation - Fluent Bit: Official Manual

logstash官网:Logstash:收集、解析和转换日志 | Elastic

前期分析与设定

1.场景任务设计

1.1 使用节点级日志代理

你可以通过在每个节点上使用节点级的日志记录代理来实现集群级日志记录。 日志记录代理是一种用于暴露日志或将日志推送到后端的专用工具。 通常,日志记录代理程序是一个容器,它可以访问包含该节点上所有应用程序容器的日志文件的目录。

由于日志记录代理必须在每个节点上运行,推荐以 DaemonSet 的形式运行该代理。

节点级日志在每个节点上仅创建一个代理,不需要对节点上的应用做修改。

容器向标准输出和标准错误输出写出数据,但在格式上并不统一。 节点级代理收集这些日志并将其进行转发以完成汇总。

1.2 具有日志代理能力的边车容器

创建一个带有单独日志记录代理的边车容器,将代理程序专门配置为与你的应用程序一起运行。

说明:

在边车容器中使用日志代理会带来严重的资源损耗。 此外,你不能使用 kubectl logs 访问日志,因为日志并没有被 kubelet 管理。

1.3 从应用中直接暴露日志目录

从各个应用中直接暴露和推送日志数据的集群日志机制已超出 Kubernetes 的范围。

1.4 不同方案对比

原生方式

DaemonSet方式

Sidecar方式

采集日志类型

标准输出

标准输出+部分文件

文件

部署运维

低,原生支持

一般,需维护DaemonSet

较高,每个需要采集日志的POD都需要部署sidecar容器

日志分类存储

无法实现

一般,可通过容器/路径等映射

每个POD可单独配置,灵活性高

多租户隔离

一般,只能通过配置间隔离

强,通过容器进行隔离,可单独分配资源

支持集群规模

本地存储无限制,若使用syslog、fluentd会有单点限制

中小型规模,业务数最多支持百级别

无限制

资源占用

低,docker engine提供

较低,每个节点运行一个容器

较高,每个POD运行一个容器

查询便捷性

较高,可进行自定义的查询、统计

高,可根据业务特点进行定制

可定制性

高,每个POD单独配置

适用场景

测试、POC等非生产场景

功能单一型的集群

大型、混合型、PAAS型集群

过程和方法

本次实验使用了3台云服务器,每台配置为centos7.x,4核8G

  • 4c8g (master)
  • 4c8g * 2(worker)
  • centos7.9
  • 内网互通
  • 每个机器有自己域名
  • 防火墙开放30000~32767端口

前置准备

安装nfs
#所有机器安装
yum install -y nfs-utils

# 主节点
echo "/mnt/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

mkdir -p /mnt/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r


# 从节点
showmount -e 172.31.0.229

#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /mnt/data/

mount -t nfs 172.31.0.229:/mnt/data /mnt/data
# 写入一个测试文件
echo "hello nfs server" > /mnt/data/test.txt

创建kk安装时,nfs的配置

vi nfs-client.yaml

# 将一下配置复制进去
nfs:
  server: "172.31.0.229"    # This is the server IP address. Replace it with your own.
  path: "/mnt/data"    # Replace the exported directory with your own.
storageClass:
  defaultClass: true

配置yum源并安装docker

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

systemctl enable docker --now

# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
安装kubesphere
# 设置hostname
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2


# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system


export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -
chmod +x kk
# 每台机器执行
yum install -y conntrack

# 创建集群配置文件
./kk create config --with-kubernetes v1.20.4 --with-kubesphere v3.1.1

# 创建集群,需要修改配置
./kk create cluster -f config-sample.yaml

# 查看进度
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

配置文件修改

spec:
  hosts:
  - {name: master, address: 10.140.126.6, internalAddress: 10.140.126.6, user: root, password: Hello777}
  - {name: node1, address: 10.140.122.56, internalAddress: 10.140.122.56, user: root, password: Hello777}
  - {name: node2, address: 10.140.122.39, internalAddress: 10.140.122.39, user: root, password: Hello777}
  roleGroups:
    etcd:
    - master
    master: 
    - master
    worker:
    - node1
    - node2

# 在registry配置后面追加
  addons:
  - name: nfs-client
    namespace: kube-system
    sources:
      chart:
        name: nfs-client-provisioner
        repo: https://charts.kubesphere.io/main
        valuesFile: /root/nfs-client.yaml # 配置文件位置一定要写对

DaemonSet方式

目前主流方式为ELK,但是由于logstash占用资源较多,所以使用es官方推出的轻量级日志采集框架,fluent来实现,也就是EFK。

fluent使用架构,其中收集数据可以由fluentBit来收集,fluent来转发

k8s配置

📎efk.zip

开始部署

创建EFK所用的命名空间:kubectl create -f create-logging-namespace.yaml

创建es-service:kubectl create -f es-service.yaml

创建es集群:kubectl create -f es-statefulset.yaml

查看pod:kubectl get po -n logging

创建kibana:kubectl create -f kibana-deployment.yaml -f kibana-service.yaml

查看kibana服务:kubectl get svc -n logging

暴露的端口为32538

创建fluentd:kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml

查看pod状态:kubectl get po -n logging

确认均为1/1

使用kibana查看日志

访问kibana:http://60.204.139.123:32538

添加数据

创建索引

Discover

高流量下的日志收集方案

档日志流量较大,就会产生较多的连接和日志流量,所以采用kafka的方式进行转发,并使用logstash进行日志整理转发,具体架构如下:

其中需要的kafka集群就不再这里进行搭建,下面主要是fluentbit和logstash部署

部署fluent-bit

helm repo add fluent https://fluent.github.io/helm-charts

helm upgrade --install fluent-bit fluent/fluent-bit

其中需要修改一下配置,修改为自己的kafka地址

部署logstash

📎logstash.yaml

kubectl apply -f logstash.yaml

主要修改以下部分

查看结果

根据名称空间过滤

根据容器名称过滤

其他过滤字段就不一一展示,可以在下方配置

主要结论

针对日志量较小的,可以使用fluent-bit + es + kibana 就可以了,如果日志量较多,可以增加kafka和flunet/logstash,增加多级日志转发。

架构图如下:其中日志收集可以使用filebeat或fluent-bit ,日志收集可以使用flunet/logstash

大流量架构

超大流量架构

后续计划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值