K8S之DaemonSet控制器

DaemonSet控制器

概念、原理解读、应用场景

概述

DaemonSet控制器能够确保K8S集群所有的节点都分别运行一个相同的pod副本;

当集群中增加node节点时,新的node节点也会自动创建一个pod副本;

当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它创建的pod

工作原理

DaemonSet的控制器会监听K8S的daemonset对象、pod对象、node对象,这些被监听的对象之变动,就会触发 syncLoop循环 让 K8S集群朝着daemonset对象描述的状态进行演进。

典型的应用场景介绍

在集群的每个节点上运行存储,比如:glusterd 或 ceph。

在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat等。

在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd等。

DaemonSet 与 Deployment 的区别

Deployment :部署的 Pod副本 会分布在各个 Node 上,一个 Node 可能运行好几个副本

DaemonSet :每个 Node 上最多只能运行一个副本

解读资源清单文件

查看定义Daemonset资源需要的字段有哪些

bash 复制代码
kubectl explain ds

查看DaemonSet的spec字段如何定义

bash 复制代码
kubectl explain ds.spec


字段解释说明

  • minReadySeconds:当新的pod启动几秒种后,再kill掉旧的pod
  • revisionHistoryLimit:保存多少个历史版本
  • selector(必填):用于匹配pod的标签选择器
  • template(必填):定义Pod的模板,基于这个模板创建的所有pod是一样的
  • updateStrategy:daemonset的升级策略

实践案例

实验:部署日志收集组件fluentd

环境说明:使用K8S的 V1.25.0版本,集群是1个master,2个work节点

编写DaemonSet资源清单

bash 复制代码
vim daemonset.yaml
yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: fluentd-elasticsearch # #资源的名字
  namespace: monitor # 资源使用的名称空间
  labels:  # DaemonSet资源具有的标签
    k8s-app: fluentd-logging
spec:
  selector:   # 标签选择器,匹配pod的标签
    matchLabels:
     name: fluentd-elasticsearch
  template:
    metadata:
     labels:         # 基于模板定义的pod所具有的标签
       name: fluentd-elasticsearch
    spec:
     tolerations:   # 定义容忍度,master上自带了污点 为了让pod能调度到master节点上定义的容忍度
     - key: node-role.kubernetes.io/control-plane
       effect: NoSchedule
     containers:  # 定义容器
     - name:  fluentd-elasticsearch
       image: fluentd:v2.5.1
       resources:  # 资源配额
         limits: 
           memory: 500Mi
         requests: 
           cpu: 100m
           memory: 200Mi
       volumeMounts:
       - name: varlog
         mountPath: /var/log # 挂载容器目录
       - name: varlibdockercontainers
         mountPath: /var/lib/docker/containers # 把/var/lib/docker/containers/挂载到容器里
         readOnly: true # 挂载目录是只读权限
     terminationGracePeriodSeconds: 30 # 优雅的关闭服务
     volumes:
     - name: varlog
       hostPath:
          path: /var/log # 基于本地目录创建一个卷
     - name: varlibdockercontainers
       hostPath:
          path: /var/lib/docker/containers

启动资源

bash 复制代码
kubectl apply -f daemonset.yaml

查看DaemonSet创建情况

bash 复制代码
kubectl get ds -n monitor 

查看DaemonSet控制器创建的pod情况

bash 复制代码
kubectl get pods -n monitor -o wide

通过上面可以看到在k8s的三个节点均创建了fluentd这个pod

pod的名字是由 {控制器的名字} - {随机数} 组成的

相关推荐
亦暖筑序34 分钟前
Spring AI Alibaba 报错合集:我踩过的那些坑
java·后端
indexsunny1 小时前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices
摇滚侠1 小时前
Java 多线程基础 Java Multithreading Basics
java
今天你TLE了吗1 小时前
LLM到Agent&RAG——AI概念概述 第一章:大模型
java·人工智能·语言模型·大模型
你的牧游哥1 小时前
Java 核心概念详解
java·开发语言
深邃-1 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
JAVA学习通1 小时前
励志从零打造LeetCode平台之C端竞赛列表
java·vscode·leetcode·docker·状态模式
海兰1 小时前
【第3篇-续】多模型多模态项目实现示例(增加OpenAI通用适配)附源代码
java·人工智能·spring boot·alibaba·spring ai
澄澈青空~1 小时前
有一个叫R2C,也有一个叫G2C
java·数据库·人工智能·c#
SarL EMEN2 小时前
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
java·前端·spring boot