Kubernetes K8S之资源控制器Daemonset详解
Kubernetes的资源控制器Daemonset详解与示例
主机配置规划
服务器名称(hostname) |
系统版本 |
配置 |
内网IP |
外网IP(模拟) |
---|---|---|---|---|
k8s-master |
CentOS7.7 |
2C/4G/20G |
172.16.1.110 |
10.0.0.110 |
k8s-node01 |
CentOS7.7 |
2C/4G/20G |
172.16.1.111 |
10.0.0.111 |
k8s-node02 |
CentOS7.7 |
2C/4G/20G |
172.16.1.112 |
10.0.0.112 |
什么是控制器
kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为。
部分控制器类型如下:
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job/CronJob
- HorizontalPodAutoscaler
DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时,会为他们新增一个 Pod。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的一些典型用法:
- 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
- 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
- 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、Flowmill、Sysdig 代理、collectd、Dynatrace OneAgent、AppDynamics 代理、Datadog 代理、New Relic 代理、Ganglia gmond 或者 Instana 代理。
一个简单的用法是在所有的节点上都启动一个 DaemonSet,并作为每种类型的 daemon 使用。
一个稍微复杂的用法是单独对每种 daemon 类型使用一种DaemonSet。这样有多个 DaemonSet,但具有不同的标识,并且对不同硬件类型具有不同的内存、CPU 要求。
备注:DaemonSet 中的 Pod 可以使用 hostPort,从而可以通过节点 IP 访问到 Pod;因为DaemonSet模式下Pod不会被调度到其他节点。使用示例如下:
1 ports:
2 - name: httpd
3 containerPort: 80
4 #除非绝对必要,否则不要为 Pod 指定 hostPort。 将 Pod 绑定到hostPort时,它会限制 Pod 可以调度的位置数;DaemonSet除外
5 #一般情况下 containerPort与hostPort值相同
6 hostPort: 8090 #可以通过宿主机+hostPort的方式访问该Pod。例如:pod在/调度到了k8s-node02【172.16.1.112】,那么该Pod可以通过172.16.1.112:8090方式进行访问。
7 protocol: TCP
可参见:「Kubernetes K8S之通过yaml创建pod与pod文件常用字段详解」
DaemonSet示例
yaml文件
1 [root@k8s-master controller]# pwd
2 /root/k8s_practice/controller
3 [root@k8s-master controller]# cat daemonset.yaml
4 apiVersion: apps/v1
5 kind: DaemonSet
6 metadata:
7 name: fluentd-elasticsearch
8 namespace: default
9 labels:
10 k8s-app: fluentd-logging
11 spec:
12 selector:
13 matchLabels:
14 name: fluentd-elasticsearch
15 template:
16 metadata:
17 labels:
18 name: fluentd-elasticsearch
19 spec:
20 tolerations:
21 # 允许在master节点运行
22 - key: node-role.kubernetes.io/master
23 effect: NoSchedule
24 containers:
25 - name: fluentd-elasticsearch
26 image: registry.cn-beijing.aliyuncs.com/google_registry/fluentd:v2.5.2
27 resources:
28 limits:
29 cpu: 1
30 memory: 200Mi
31 requests:
32 cpu: 100m
33 memory: 200Mi
34 volumeMounts:
35 - name: varlog
36 mountPath: /var/log
37 - name: varlibdockercontainers
38 mountPath: /var/lib/docker/containers
39 readOnly: true
40 # 优雅关闭应用,时间设置。超过该时间会强制关闭【可选项】,默认30秒
41 terminationGracePeriodSeconds: 30
42 volumes:
43 - name: varlog
44 hostPath:
45 path: /var/log
46 - name: varlibdockercontainers
47 hostPath:
48 path: /var/lib/docker/containers
运行daemonset,并查看状态
1 [root@k8s-master controller]# kubectl apply -f daemonset.yaml
2 daemonset.apps/fluentd-elasticsearch created
3 [root@k8s-master controller]#
4 [root@k8s-master controller]# kubectl get daemonset -o wide
5 NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
6 fluentd-elasticsearch 3 3 3 3 3 <none> 92s fluentd-elasticsearch registry.cn-beijing.aliyuncs.com/google_registry/fluentd:v2.5.2 name=fluentd-elasticsearch
7 [root@k8s-master controller]#
8 [root@k8s-master controller]# kubectl get pod -o wide
9 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
10 fluentd-elasticsearch-52b8z 1/1 Running 0 95s 10.244.2.92 k8s-node02 <none> <none>
11 fluentd-elasticsearch-fps95 1/1 Running 0 95s 10.244.0.46 k8s-master <none> <none>
12 fluentd-elasticsearch-pz8j7 1/1 Running 0 95s 10.244.4.83 k8s-node01 <none> <none>
由上可见,在k8s集群所有节点包括master节点都运行了daemonset的pod。
相关阅读
1、Kubernetes K8S之通过yaml创建pod与pod文件常用字段详解
2、Kubernetes K8S之资源控制器RC、RS、Deployment详解
3、Kubernetes K8S之资源控制器StatefulSets详解
完毕!
———END——— 如果觉得不错就关注下呗 (-^O^-) !
- Go语言中字符串的查找方法小结
- 优化算法——遗传算法
- 每秒执行6000的简单SQL优化(一)(r10笔记第62天)
- 【Go 语言社区】在golang里实现类似try catch 的异常处理机制
- 每秒执行6000的简单SQL优化(二) (r10笔记第65天)
- 【Go 语言社区】GO语言练习:网络编程 ICMP 示例
- Golang的json操作
- 【Go 语言社区】golang协程——通道channel阻塞
- Oracle 12c PDB中碰到的DG问题 (r10笔记第63天)
- 上线必备 | 高性能ES5.X部署配置清单
- 【Go 语言社区】go 学习中遇到一些语法问题
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- 当12C PDB遇上JDBC (r10笔记第59天)
- 微信公众平台开发获取用户基本信息--转
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 简单实现贪吃蛇小游戏
- Python数据可视化 词云图 绘制词云的方法总结
- Python 利用OpenCV给照片换底色
- Python爬虫实战 批量下载高清美女图片
- Python matplotlib数据可视化 绘制柱形图、堆叠图、折线图、饼图和环图
- Python Matplotlib数据可视化 绘制箱形图、散点图和直方图
- 【Lighthouse教程】scrapy爬虫初探
- Python爬虫 爬取B站视频弹幕 + 绘制词云
- Python爬虫学习笔记 asyncio+aiohttp 异步爬虫原理和解析
- Python数据分析 利用NetworkX绘制网络图
- Python爬虫练习 爬取网络小说保存到txt
- Python爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- Python matplotlib数据可视化 subplot绘制多个子图
- python pathlib模块的基本使用和总结
- Python 爬取前程无忧最新招聘数据 matplotlib数据分析与可视化