k8s控制器(五)_____DaemonSet

DaemonSet控制器

DaemonSet控制器是Kubernetes中的一种控制器,用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务:

  • 在每一个node节点运行一个存储服务,例如gluster,ceph。
  • 在每一个node节点运行一个日志收集服务,例如fluentd,logstash。
  • 在每一个node节点运行一个监控服务,例如Prometheus Node Exporter,zabbix agent等。

DaemonSet控制器的工作方式是,它会监视集群中的节点,并确保在每个节点上都有一个Pod实例在运行。如果节点增加或减少,DaemonSet 控制器会相应地调整 Pod 的副本数量,以确保每个节点都有一个Pod在运行。

DaemonSet日志收集EFK

使用StatefulSet部署elasticsearch三节点集群,使用headless service集群通信,部署动态存储为elasticsearch提供存储服务。
在这里插入图片描述

部署StorageClass

请参考https://blog.csdn.net/qq42004/article/details/137113713?spm=1001.2014.3001.5502

部署elasticsearch

官方网站https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html

  • 部署Service

    部署一个NodePort的类型的Service方便后面查询集群信息。

apiVersion: v1
kind: Namespace
metadata:name: efklabels:app: efk
---
apiVersion: v1
kind: Service
metadata:name: efklabels:app: efknamespace: efk
spec:clusterIP: Noneselector:app: efkports:- name: efk-port-httpport: 9200- name: efk-port-insideport: 9300
---
apiVersion: v1
kind: Service
metadata:name: efk-httplabels:app: efk-httpnamespace: efk
spec:selector:app: efkports:- name: efk-port-httpport: 9200protocol: TCPtargetPort: 9200nodePort: 32005type: NodePort

elasticsearch的9200端口用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控、以及其他任何使用HTTP协议的请求,所有的客户端库都会使用该端口与elasticsearch进行交互。9300端口是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。

  • 部署elasticsearch
apiVersion: apps/v1
kind: StatefulSet
metadata:name: efklabels:app: efknamespace: efk
spec:replicas: 3serviceName: efk selector:matchLabels:app: efktemplate:metadata:name: efk-conlabels:app: efkspec:hostname: efk initContainers:- name: chmod-dataimage: docker.io/library/busybox:latestimagePullPolicy: IfNotPresentcommand:- sh- "-c"- |chown -R 1000:1000 /usr/share/elasticsearch/datasecurityContext:privileged: truevolumeMounts:- name: data mountPath: /usr/share/elasticsearch/data- name: vm-max-countimage: docker.io/library/busybox:latestimagePullPolicy: IfNotPresentcommand: ["sysctl","-w","vm.max_map_count=262144"]securityContext:privileged: true- name: ulimitimage: docker.io/library/busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","ulimit -Hl unlimited && ulimit -Sl unlimited && ulimit -n 65536 && id",]securityContext:privileged: truecontainers:- name: efkimage: docker.elastic.co/elasticsearch/elasticsearch:7.17.19imagePullPolicy: IfNotPresentresources:limits: cpu: "1"#memory: "512Mi"requests:cpu: "0.5"  #memory: "256Mi"   env: - name: cluster.namevalue: efk-log- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name   - name: discovery.seed_hostsvalue: "efk-0.efk,efk-1.efk,efk-2.elk"- name: cluster.initial_master_nodesvalue: "efk-0,efk-1,efk-2"- name: bootstrap.memory_lockvalue: "false"- name: ES_JAVA_OPTSvalue: "-Xms512m -Xmx512m"ports:- containerPort: 9200name: port-httpprotocol: TCP- containerPort: 9300name: port-insideprotocol: TCPvolumeMounts:- name: datamountPath: /usr/share/elasticsearch/data- name: timemountPath: /etc/localtimevolumes:- name: timehostPath: path: /etc/localtimetype: File volumeClaimTemplates:- metadata:name: dataspec:storageClassName: "nfs-stgc-delete"accessModes: ["ReadWriteOnce"]resources:requests:storage: 1Gi

在initContainers中修改部分系统参数(部署的时候可以用Docker跑一下部署版本elasticsearch看需要修改那些参数)

 securityContext:privileged: true

开启容器的特权模式。

 env: - name: cluster.namevalue: elk-log- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name   - name: discovery.seed_hostsvalue: "efk-0.efk,efk-1.efk,efk-2.elk"- name: cluster.initial_master_nodesvalue: "efk-0,efk-1,efk-2"- name: bootstrap.memory_lockvalue: "false"- name: ES_JAVA_OPTSvalue: "-Xms512m -Xmx512m"
  1. node.name:处理elasticsearch中一个未引入元数据的报错。
  2. discovery.seed_hosts:配置节点发现。
  3. cluster.initial_master_nodes:当第一次启动一个全新的elasticsearch集群时,会有一个集群引导步骤,该步骤确定在 第一次选举中计算其选票的主合格节点集。在开发模式下,在未配置发现设置的情况下,此步骤由节点自身自动执行。由于这种自动引导本质上是不安全的,当您在生产模式下启动一个全新的集群时,您必须明确列出在第一次选举中应该计算其投票的主合格节点。此列表是使用cluster.initial_master_nodes设置设置的。在重新启动群集或向现有群集添加新节点时,不应使用此设置。
  4. ES_JAVA_OPTS:允许传递一些JVM(java虚拟机)的参数给elasticsearch进程。-Xms512m -Xmx512m指定了进行初始堆内存和最大内存大小为512M。
  5. bootstrap.memory_lock:锁定内存,禁用内存交换。k8s本身禁用了交换分区,此处设置为false(默认也是false)。

查看集群信息:

  • 查看节点状态:http://192.168.0.100:32005/_cat/nodes?v&pretty
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
10.244.1.245           28          79   4    3.63    2.97     1.78 cdfhilmrstw -      efk-2
10.244.1.244           30          79   3    3.63    2.97     1.78 cdfhilmrstw -      efk-0
10.244.2.235           51          67   5    0.70    0.73     0.67 cdfhilmrstw *      efk-1
  • 查看集群健康信息:http://192.168.0.100:32005/_cluster/health?pretty 状态信息为:green
{"cluster_name" : "efk-log","status" : "green","timed_out" : false,"number_of_nodes" : 3,"number_of_data_nodes" : 3,"active_primary_shards" : 3,"active_shards" : 6,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0
}
  • 查看集群的状态信息:http://192.168.0.100:32005/_cluster/state?pretty
{"cluster_name" : "efk-log","cluster_uuid" : "STY6wpxzS0qHBy5XrjQRuw","version" : 93,"state_uuid" : "bV0lB3d6TzOYIZc9WE92dg","master_node" : "-KIR5smtTvCZE3RJSEPh1w","blocks" : { },"nodes" : {"HEpcL5aSTdaEXdE_75319g" : {"name" : "efk-2","ephemeral_id" : "ToczCgVFSCuloVO2gitEaA","transport_address" : "10.244.1.245:9300","attributes" : {"ml.machine_memory" : "3956289536","ml.max_open_jobs" : "512","xpack.installed" : "true","ml.max_jvm_size" : "536870912","transform.node" : "true"},"roles" : ["data","data_cold","data_content","data_frozen","data_hot","data_warm","ingest","master","ml","remote_cluster_client","transform"]},"Qs7bNaTvS8CSdMmQuu9Jog" : {"name" : "efk-0","ephemeral_id" : "Gdyw-MhAQhmeLl7k2Sm5HQ","transport_address" : "10.244.1.244:9300","attributes" : {"ml.machine_memory" : "3956289536","ml.max_open_jobs" : "512","xpack.installed" : "true","ml.max_jvm_size" : "536870912","transform.node" : "true"},"roles" : ["data","data_cold","data_content","data_frozen","data_hot","data_warm","ingest","master","ml","remote_cluster_client","transform"]},"-KIR5smtTvCZE3RJSEPh1w" : {"name" : "efk-1","ephemeral_id" : "J7o-nw8LQxaxw7O9kjvEIg","transport_address" : "10.244.2.235:9300","attributes" : {"ml.machine_memory" : "3956289536","xpack.installed" : "true","transform.node" : "true","ml.max_open_jobs" : "512","ml.max_jvm_size" : "536870912"},"roles" : ["data","data_cold","data_content","data_frozen","data_hot","data_warm","ingest","master","ml","remote_cluster_client","transform"]}},.......

部署kibana

apiVersion: v1
kind: Service
metadata:name: kibananamespace: efklabels:app: kibana
spec:selector:app: kibanaports:- name: port-kibanaport: 5601appProtocol: TCPnodePort: 30006targetPort: 5601type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata: name: kibananamespace: efklabels:app: kibana
spec: replicas: 1selector:matchLabels:app: kibanatemplate:metadata:name: kibanalabels:app: kibanaspec:nodeSelector:app: ngcontainers:- name: kibanaimage: docker.elastic.co/kibana/kibana:7.17.19imagePullPolicy: IfNotPresentresources:limits:cpu: "1"requests:cpu: "0.5"env:- name: ELASTICSEARCH_HOSTSvalue: http://efk:9200volumeMounts:- name: timemountPath: /etc/localtime- name: data-kibanamountPath: /etc/elk/kibana/datasubPath: dataports:- name: kibana-portcontainerPort: 5601volumes:- name: timehostPath: path: /etc/localtimetype: File - name: data-kibanahostPath:path: /mnt/kibana
env:- name: ELASTICSEARCH_HOSTSvalue: http://efk:9200

配置访问elasticsearch地址

DaemonSet部署fluentd

  • 创建配置文件
    k8s是基于Containerd部署的要读取的日志在/var/log/containers下,产生的cri日志需要进行解析不然会遇到格式错误的 JSON问题。简写一个配置文件:
apiVersion: v1
kind: ConfigMap
metadata:name: fluentlabels:app: fluentnamespace: efk
data:system.conf: |<source>@type tailformat jsonpath /var/log/containers/*.logparser critag kube.*read_from_head true<parse>@type cri format regex#expression /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$</parse></source><match kube.**>@type elasticsearchhost efk.efk.svc.cluster.localport 9200logstash_format truelogstash_prefix kubelogstash_dateformat %Y.%m.%dinclude_tag_key truetag_key @log_name</match>
  • 部署fluentd

    fluentd官方文档:https://github.com/fluent/fluentd-kubernetes-daemonset/tree/master
    DaemonSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/

apiVersion: v1
kind: ServiceAccount
metadata:name: fluentdnamespace: efklabels:app: fluentd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: fluentdlabels:app: fluentd
rules:
- apiGroups:- ""resources:- pods- namespacesverbs:- get- list- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: fluentd
roleRef:kind: ClusterRolename: fluentdapiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccountname: fluentdnamespace: efk
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentdnamespace: efklabels:app: fluentd
spec:selector:matchLabels:app: fluentdtemplate:metadata:labels:app: fluentdspec:serviceAccount: fluentdserviceAccountName: fluentdtolerations:- key: "node-role.kubernetes.io/control-plane"effect: "NoSchedule"initContainers:- name: init-fluentdimage: docker.io/fluent/fluentd-kubernetes-daemonset:v1.16.5-debian-elasticsearch7-amd64-1.0imagePullPolicy: IfNotPresentcommand:- bash- "-c"- |cp /mnt/config-map/system.conf /mnt/conf.dvolumeMounts:- name: confmountPath: /mnt/conf.d- name: confg-mapmountPath: /mnt/config-mapcontainers:- name: fluentdimage: docker.io/fluent/fluentd-kubernetes-daemonset:v1.16.5-debian-elasticsearch7-amd64-1.0imagePullPolicy: IfNotPresentenv:- name: K8S_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: FLUENT_ELASTICSEARCH_HOSTvalue: "efk.efk.svc.cluster.local"- name: FLUENT_ELASTICSEARCH_PORTvalue: "9200"- name: FLUENT_ELASTICSEARCH_SCHEMEvalue: "http"- name: FLUENTD_SYSTEMD_CONFvalue: disable- name: FLUENT_CONTAINER_TAIL_EXCLUDE_PATHvalue: /var/log/containers/fluent*- name: FLUENT_CONTAINER_TAIL_PARSER_TYPEvalue: /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/resources:limits:memory: 512Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/log- name: containerslogsmountPath: /var/log/containersreadOnly: true- name: conf mountPath: /fluentd/etc/conf.dterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: containerslogshostPath:path: /var/log/containers- name: confemptyDir: {}- name: confg-mapconfigMap:name: fluent
  • Deployments和Daemonset区别联系

DaemonSet与Deployments非常类似,它们都能创建Pod,这些Pod对应的进程都不希望被终止掉(例如,Web 服务器、存储服务器)。无状态的Service使用Deployments,比如前端Frontend服务,实现对副本的数量进行扩缩容、平滑升级,比基于精确控制Pod运行在某个主机上要重要得多。 需要Pod副本总是运行在全部或特定主机上,并需要先于其他Pod启动,当这被认为非常重要时,应该使用daemonset。

  • 更新DaemonSet

    如果修改了节点标签,DaemonSet 将立刻向新匹配上的节点添加Pod,同时删除不能够匹配的节点上的Pod。可以修改 DaemonSet创建的Pod。然而不允许对Pod的所有字段进行更新。当下次某节点(即使具有相同的名称的Pod)被创建时,DaemonSet Controller还会使用最初的模板。你可以删除一个DaemonSet。如果使用kubectl并指定 --cascade=false选项,则Pod将被保留在节点上。然后可以创建具有不同模板的新DaemonSet。具有不同模板的新 DaemonSet 将能够通过标签匹配并识别所有已经存在的 Pod。 如果有任何Pod需要替换,则DaemonSet根据它的updateStrategy来替换

  • 与 DaemonSet 中的 Pod 进行通信

  1. Push:将DaemonSet中的Pod配置为将更新发送到其他服务,例如统计数据库。
  2. NodeIP 和已知端口:DaemonSet中的Pod可以使用hostPort,从而可以通过节点IP访问到 Pod。客户端能通过某种方法获取节点 IP 列表,并且基于此也可以获取到相应的端口。
  3. DNS:创建具有相同Pod Selector 的Headless Service,然后通过使用endpoints资源或从DNS中检索到多个A记录来发现DaemonSet。
  4. Service:创建具有相同Pod Selector的Service,并使用该Service随机访问到某个节点上的daemonset pod(没有办法访问到特定节点)。
  • 污点和容忍度

DaemonSet控制器会自动将一组容忍度添加到DaemonSet Pod:

在这里插入图片描述

你也可以在DaemonSet的Pod模板中定义自己的容忍度并将其添加到DaemonSet Pod。

查看kibana

点击Discover添加index pattern根据步骤配置完成,再次点击Discover查看日志信息。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

[大模型]浦语灵笔图文理解创作

浦语灵笔图文理解&创作 环境准备 首先在 AutoDL 上租一台显卡驱动支持 11.7 以上的双卡 3090 机器. 在选择镜像是选择 Miniconda --> conda3 --> 3.8(ubuntu20.04)–> 11.6 打开 jupyter lab 中的终端&#xff0c;首先运行以下命令安装 PyTorch 2.0.1 # 升级pi…

1043: 利用栈完成后缀表达式的计算

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {char a;stack<int> sk;while (cin >> a && a ! #) {if (a > 0 && a < 9) {sk.push(a - 0);}else {int num2 sk.top();sk.pop();int n…

数字乡村创新实践探索农业现代化与乡村振兴新路径:科技赋能农村全面振兴与农民福祉新纪元

目录 引言 一、数字乡村与农业现代化新路径 1、智慧农业引领农业现代化 2、农业产业链的数字化转型 二、数字乡村与乡村振兴新路径 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民福祉新纪元 1、提升农业生产效益与农民收入 2、促进…

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

.NET Framework安装失败的原因及解决方法

.NET Framework安装失败的原因及解决方法 大家好我是艾西&#xff0c;一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NET Framework缺失的提示&#xff0c;那么也会有很多的小伙伴搞不懂什么原因导致的&#xff0c;这个问…

hadoop编程之词频统计

数据集实例 java代码&#xff0c;编程 实例 我们要先创建三个类分别为WordCoutMain、WordCoutMapper、WordCoutReducer这三个类 对应的代码如下 WordCoutMain import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Pat…

wps导出pdf文献引用不能跳转解决办法

问题描述 本科论文参考文献使用wps设置交叉引用&#xff0c;但导出pdf后无法跳转引用 尝试 用office word打开文件word版跳转没有问题&#xff0c; 另存为pdf或导出pdf。 但是pdf版跳转完全错误。 16跳到14.但是总体而言都是跳到包含该序号的页 要求不高的话也可以&#x…

文件上传App,H5,小程序多端兼容

插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id5459 下载lsj-upload插件 代码如下 结构 <lsj-upload :option"option" :size"size" :formats"formats" :debug"debug":instantly"instantly" change"…

Redis中的订阅发布(三)

订阅发布 发送消息 当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候&#xff0c;服务器需要执行以下 两个动作: 1.将消息message发送给channel频道的所有订阅者2.如果一个或多个模式pattern与频道channel相匹配&#xff0c;那么将消息message发送给…

PyPDF2,一个超实用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超实用的 Python 库 - pypdf。 Github地址&#xff1a;https://github.com/py-pdf/pypdf PDF&#xff08;Portable Document Format&#xff09;是一种广泛用于文档传输和打印的文件格式&…

Hive概述与基本操作

一、Hive基本概念 1.什么是hive? &#xff08;1&#xff09;hive是数据仓库建模的工具之一 &#xff08;2&#xff09;可以向hive传入一条交互式的sql,在海量数据中查询分析得到结果的平台 2.Hive简介 Hive本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

var cannot be resolved to a type

var cannot be resolved to a type var 是JDK10的产物吧。真的是够懒的人&#xff0c;一个var自动转换类型。 高版本的功能又要放到低版本的平台系统中&#xff0c;【集成】&#xff0c;向下兼容天天改这些。

2024年山东三支一扶考试报名照片要求

2024年山东三支一扶考试报名照片要求

[大模型]internLM-Chat-7B FastApi 部署调用

internLM-Chat-7B FastApi 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>1.11.0–>3.8(ubuntu20.04)–>11.3 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下…

Github 2024-04-16Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1Vue项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

[spring] Spring Boot REST API - 项目实现

Spring Boot REST API - 项目实现 书接上文 Spring Boot REST API - CRUD 操作&#xff0c;一些和数据库相关联的注解在 [spring] spring jpa - hibernate CRUD 主要的 layer 如下&#xff1a; #mermaid-svg-QE1PR1gyrkz4XIT0 {font-family:"trebuchet ms",verdana…

[Linux][基础IO][二][缓冲区][理解文件系统]详细解读

目录 1.缓冲区0.缓冲区的刷新策略1.何为缓冲区&#xff1f;2.总结 2.理解文件系统0.文件元数据1.了解文件系统 --> 理解inode2.软硬链接 1.缓冲区 0.缓冲区的刷新策略 一般情况 立即刷新行刷新(行缓冲)满刷新(全缓冲) 特殊情况 用户强制刷新(fflush)进程退出 所有的设备&a…