在 Kubernetes (K8s) 集群的运维中,日志采集是至关重要的一环。我们通常需要确保集群中的每一个工作节点都运行一个日志采集代理(例如 Fluentd, Filebeat 或 Logstash shipper),以实时收集并转发宿主机或容器的日志。
DaemonSet 是实现这一目标的完美 K8s 资源对象。它保证集群中的每个节点(或者满足特定条件的节点)都运行且仅运行一个 Pod 副本。
核心概念:为什么选择 DaemonSet?
传统的 Deployment 或 StatefulSet 无法保证 Pod 在所有节点上均匀分布或存在。DaemonSet 的核心优势在于:
- 节点覆盖率: 当有新节点加入集群时,DaemonSet 会自动在该节点上创建一个日志采集 Pod。
- 故障自愈: 如果节点上的日志 Pod 崩溃或被删除,DaemonSet 会立即重新创建它。
- 节点级资源访问: 允许通过 hostPath 卷来访问宿主机的文件系统(例如 /var/log),这是日志采集的必要条件。
实操:配置 DaemonSet 采集宿主机日志
下面的 YAML 配置演示了如何创建一个名为 log-collector-agent 的 DaemonSet。我们使用一个示例的 Fluentd 镜像,并通过 hostPath 卷将宿主机的 /var/log 目录挂载到 Pod 内部,从而实现日志的读取。
步骤一:创建 DaemonSet YAML 文件 (log-collector-ds.yaml)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector-agent
labels:
app: log-agent
component: logging
spec:
# 确保 DaemonSet 管理的 Pod 使用这些标签
selector:
matchLabels:
app: log-agent
template:
metadata:
labels:
app: log-agent
spec:
# 生产环境中,通常需要配置特定的 ServiceAccount 和 RBAC 权限
# serviceAccountName: log-collector-sa
# 如果需要部署在 Master/Control Plane 节点上,可能需要配置 Tolerations
# tolerations:
# - key: node-role.kubernetes.io/master
# operator: Exists
# effect: NoSchedule
containers:
- name: log-shipper
image: fluent/fluentd:v1.14.6-debian-1.0 # 替换为您实际的日志采集镜像
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: host-logs
mountPath: /mnt/log/host # Agent 从此路径读取宿主机日志
readOnly: true
# 示例:挂载容器运行时的日志目录 (如 Docker/CRI-O 的 JSON 文件)
- name: container-logs
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
# 定义 hostPath 卷,指向宿主机的 /var/log
- name: host-logs
hostPath:
path: /var/log
type: DirectoryOrCreate
# 定义 hostPath 卷,指向容器运行时的日志目录
- name: container-logs
hostPath:
path: /var/lib/docker/containers
type: DirectoryOrCreate
步骤二:部署 DaemonSet
使用 kubectl 应用配置:
kubectl apply -f log-collector-ds.yaml
步骤三:验证部署状态
检查 DaemonSet 是否成功创建,以及其目标节点数是否与当前集群节点数一致:
# 查看 DaemonSet 状态
kubectl get ds log-collector-agent
# 示例输出:
# NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
# log-collector-agent 3 3 3 3 3 <none> 1m
# 查看 Pods 及其部署在哪个节点上
kubectl get pods -l app=log-agent -o wide
# 确保每个 Pod 都分布在不同的节点上
如果 DESIRED 数量与集群节点数匹配,且 READY 数量也相同,则说明日志采集 Pod 已成功部署到所有目标节点上。
注意事项
- 权限 (RBAC): 由于 DaemonSet 需要访问宿主机文件系统,并且可能需要读取 K8s API Server 的信息(如 Pod 元数据),因此通常需要为其配置一个 ServiceAccount,并授予相应的 ClusterRole 权限。
- 资源限制: DaemonSet Pod 长期运行且涉及 I/O 操作,务必设置合理的 requests 和 limits,防止日志采集过程占用过多资源影响业务 Pod 运行。
- 节点选择器: 如果你只想在特定的工作节点(例如具有高性能存储的节点)上运行日志代理,可以使用 nodeSelector 或 affinity 来限制 DaemonSet 的调度范围。
汤不热吧