DaemonSet确保集群中每个(部分)node运行一份pod副本,当node加入集群时创建pod,当node离开集群时回收pod。如果删除DaemonSet,其创建的所有pod也被删除,DaemonSet中的pod覆盖整个集群。
当需要在集群内每个node运行同一个pod,使用DaemonSet是有价值的,以下是典型使用场景:
- 运行集群存储守护进程,如glusterd、ceph。
- 运行集群日志收集守护进程,如fluentd、logstash。
- 运行节点监控守护进程,如Prometheus Node Exporter, collectd, Datadog agent, New Relic agent, or Ganglia gmond。
创建DaemonSet
以下是DaemonSet的示例spec文件,运行fluentd-elasticsearch image:
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: fluentd-elasticsearch
- namespace: kube-system
- labels:
- k8s-app: fluentd-logging
- spec:
- selector:
- matchLabels:
- name: fluentd-elasticsearch
- template:
- metadata:
- labels:
- name: fluentd-elasticsearch
- spec:
- tolerations:
- - key: node-role.kubernetes.io/master
- effect: NoSchedule
- containers:
- - name: fluentd-elasticsearch
- image: k8s.gcr.io/fluentd-elasticsearch:1.20
- resources:
- limits:
- memory: 200Mi
- requests:
- cpu: 100m
- memory: 200Mi
- volumeMounts:
- - name: varlog
- mountPath: /var/log
- - name: varlibdockercontainers
- mountPath: /var/lib/docker/containers
- readOnly: true
- terminationGracePeriodSeconds: 30
- volumes:
- - name: varlog
- hostPath:
- path: /var/log
- - name: varlibdockercontainers
- hostPath:
- path: /var/lib/docker/containers
以上DaemonSet中没有restart policy字段,默认为Always。如果有的话,必需将值设置成Always,否则在创建时出出现不可用错误。
DaemonSet同样会受到Taint的抵制,如果不在配置中加入匹配的Toleration,那么DaemonSet不会在拥有Taint属性的node上部署pod。上例中有如下内容:
- tolerations:
- - key: node-role.kubernetes.io/master
- effect: NoSchedule
原因就是系统默认为master节点增加了 “node-role.kubernetes.io/master”的Taint,以抵制普通pod部署,使master成为专用节点。因为我们预期上例DaemonSet在集群内全局部署,因此需要加入相匹配的Toleration。
如果预期DaemonSet只在特定节点上运行,可以在上述配置文件中加入.spec.template.spec.nodeSelector字段。.
spec.template.spec.nodeSelector字段内加入节点选择器(node selector)或者亲和选择器(node affinity),则DaemonSet只会在满足条件的node上部署pod。总之,可以通过Taint、Toleration、Affinity、node label控制DaemonSet部署pod的节点范围。
将以上内容保存在daemonset.yaml文件中,执行如下命令创建DaemonSet:
kubectl create -f https://k8s.io/examples/controllers/daemonset.yaml
系统如何调度DaemonSet pod?
默认情况下DaemonSet在创建pod时,为其增加spec.nodeName字段,也就是说所创建的pod运行在那个节上在创建阶段就已经确定,所以DaemonSet中的pod实际上没有接受kubernetes scheduler的调度,它不需要调度,因此产生以下两个特性:
- DaemonSet中的pod不遵从节点的unreachable条件,也就是即使节点被系统判定为不可达,DaemonSet仍然试图在其上部署pod。
- 在集群引导阶段,即使kubernetes scheduler还没有部署生效,DaemonSet仍然可以将pod部署到集群中的任何节点,此特性主要是在集群引导阶段使用。
因为DaemonSet不同于常规pod的调度特性,它带来两个问题:
- pod行为不一致。普通pod被创建以后等待调度的阶段称为pending,因为DaemonSet中的pod无需调度,因而无此状态,用户会因此产生迷惑。
- pod优先级特性由kubernetes scheduler实现,DaemonSet无此特性。当系统打开pod优先级功能时,pod优先级特性会被DaemonSet中的pod忽略。
为了解决以上两个问题,kubernetes增加了通过设置允许DaemonSet使用kurbernetes scheduler的功能,并在1.11的 alpha版本中成为稳定特性。其实现机制是DaemonSet在创建pod时,不再自动添加.spec.nodeName,而是以nodeAffinity取而代之,示例如下:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchFields:
- - key: metadata.name
- operator: In
- values:
- - target-host-name
其中"target-host-name"就是原来.spec.nodeName的值,这样pod就会被kubernetes scheduler调度。通过以上操作解决了上述两个问题。但DaemonSet的调度有自己因有的特性,在上文中提到的“不受节点unreachable条件限制”,为了使DaemonSet在使用kubernetes scheduler时仍然保持此特性需要打开集群的"TaintNodesByCondition"特性,如果DaemonSet使用主机网络那么必需在DaemonSet中添加如下的Toleration:
node.kubernetes.io/network-unavailable:NoSchedule
DaemonSet自动添加的Toleration
系统在某此条件下会自动为节点添加Taint,比如硬盘不足、网络不可达等,以阻止新pod往不满足条件的节点上调度。但DaemonSet的目的是在全部有资格的node上部署,不希望被这种Taint打断,因经系统也默认为DaemonSet上的pod添加Toleration。如下表:
Toleration Key | Effect | Alpha Features | Version | Description |
---|---|---|---|---|
node.kubernetes.io/not-ready | NoExecute | TaintBasedEvictions | 1.8+ | when TaintBasedEvictions is enabled,they will not be evicted when there are node problems such as a network partition. |
node.kubernetes.io/unreachable | NoExecute | TaintBasedEvictions | 1.8+ | when TaintBasedEvictions is enabled,they will not be evicted when there are node problems such as a network partition. |
node.kubernetes.io/disk-pressure | NoSchedule | TaintNodesByCondition | 1.8+ | |
node.kubernetes.io/memory-pressure | NoSchedule | TaintNodesByCondition | 1.8+ | |
node.kubernetes.io/unschedulable | NoSchedule | ScheduleDaemonSetPods , TaintNodesByCondition | 1.11+ | When ScheduleDaemonSetPods is enabled, TaintNodesByCondition is necessary to make sure DaemonSet pods tolerate unschedulable attributes by default scheduler. |
node.kubernetes.io/network-unavailable | NoSchedule | ScheduleDaemonSetPods , TaintNodesByCondition , hostnework | 1.11+ | When ScheduleDaemonSetPods is enabled, TaintNodesByCondition is necessary to make sure DaemonSet pods, who uses host network, tolerate network-unavailable attributes by default scheduler. |
node.kubernetes.io/out-of-disk | NoSchedule | ExperimentalCriticalPodAnnotation (critical pod only), TaintNodesByCondition | 1.8+ |
与DaemonSet中pod通信的几种模式
- Push:收集数据并向其它服务发送,如将收集到的统计信息发送给统计类型数据库。
- NodeIP and Known Port:DaemonSet中的pod可以被设置使用主机网络的一个port,而客户端可以很方便的知道节点IP列表,因此可以通过节点IP地址与port访问DaemonSet pod。
- DNS:创建无头服务并且让它的选择器匹配所有DaemonSet的pod,这样DaemonSet中的pod就会成为无头服务的endpoints。类似于StatefulSet。
- Service:让Service选中DaemonSet,为访问DaemonSet中的pod提供统一入口与负载均衡。
更新DaemonSet
本文参考自:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
引言
在数据科学和人工智能的开发中,Jupyter Notebooks 已成为不可或缺的工具。无论是进行数据分析、构建机器学习模型,还是进行AI实验,Jupyter Notebooks 提供了一个极为便捷和强大的开发环境。作为现代数据科学和AI开发的核心工具,它以交互式编程、即时执行和丰富的文档支持,使开发者能够更高效地完成任务。本篇文章将深入解析 Jupyter Notebooks 的历史演变、技术特点、云平台集成和实际应用场景,为你提供从入门到精通的全面指南。
1. Jupyter Notebooks的演变历程
1.1 从IPython到Jupyter Notebooks
Jupyter Notebooks 的诞生源于 IPython,一个交互式Python解释器。最初,IPython 主要为 Python 提供了增强的交互式功能,使得开发者可以在终端中执行代码并查看即时结果。然而,随着数据科学和机器学习需求的增加,IPython 逐渐进化成了一个更为强大的工具平台:Jupyter Notebooks。
1.1.1 IPython作为前身
IPython 本身作为一个交互式 shell,让开发者能够更方便地进行数据操作和调试。但随着数据处理需求的日益复杂,开发者们需要一个不仅仅局限于命令行的工作环境。IPython 提供的 %matplotlib inline
命令支持直接在终端中生成图形,增强了数据分析的可视性。
1.1.2 功能独立演变
随着项目需求的变化,IPython 不仅支持 Python,还开始引入支持其他编程语言的功能。通过扩展内核(Kernel)支持,Jupyter 将原有的 IPython 功能扩展为多语言环境。用户不仅能使用 Python,还能使用 R、Julia 甚至其他编程语言进行开发。
1.1.3 核心功能提取
在 Jupyter 诞生后,IPython 的内核被提取出来,成为一个独立的项目,这使得 Jupyter 不仅支持 Python,还支持 R、Julia 等语言。同时,Jupyter 笔记本的 Web 界面提供了更加灵活和直观的操作方式,极大地提升了数据科学和AI开发的效率。
1.2 现代化的转型
Jupyter Notebooks 的不断发展使其逐渐成为数据科学家和机器学习工程师的首选工具平台。现代化的 Jupyter 版本支持不仅仅是传统的 Python 开发,它还提供了许多创新的特性。
1.2.1 网页应用程序特性
Jupyter Notebooks 的用户界面是基于网页的,使得开发者能够跨平台使用,无论是在本地电脑上,还是在云端服务器上,都能访问并使用笔记本。与传统桌面应用程序相比,Web 界面的灵活性和便捷性使得 Jupyter 成为理想的开发工具。
1.2.2 实时代码执行能力
Jupyter Notebooks 允许开发者直接在笔记本中执行代码,结果即时显示。这种交互式编程环境不仅提高了开发效率,还使得调试变得更加直观。你可以在一个单元格中编写代码并立即查看结果,快速验证和修改你的数据分析过程。
1.2.3 多元化文档支持
Jupyter 不仅支持代码,还能够插入Markdown文本,支持富文本文档功能。用户可以在代码和文本之间进行无缝切换,这对于编写数据科学报告、文档和教程尤为重要。
2. Jupyter Labs:新一代用户界面
随着 Jupyter Notebooks 的发展,新的用户界面——Jupyter Labs——应运而生。Jupyter Labs 提供了比传统的 Jupyter Notebooks 更强大的功能和更灵活的开发环境。它的界面设计更加现代化,适合处理复杂的开发任务。
2.1 核心功能升级
Jupyter Labs 的最大亮点之一是其现代化和灵活的界面设计。它将 Jupyter Notebooks 的单一窗口扩展成一个完整的集成开发环境(IDE),让开发者可以同时处理多个任务,使用不同的窗口和面板。
2.1.1 更灵活的界面设计
Jupyter Labs 提供了一个可以自由拖拽和组合的界面。用户可以在同一个工作空间中打开多个文档、代码单元格、控制台、终端等面板,从而在一个视图中处理多个任务,极大地提高了工作效率。
2.1.2 增强的用户体验
与传统的 Jupyter 笔记本相比,Jupyter Labs 提供了更多的交互性。你可以直接通过命令面板或快捷键快速切换不同的功能模块。同时,Jupyter Labs 提供了更多的集成和扩展功能,如文件浏览器、集成终端等,进一步增强了用户体验。
2.1.3 完整的开发环境整合
Jupyter Labs 整合了更多的开发功能,例如内置的终端、文本编辑器、文件浏览器等。这使得开发者不需要频繁切换工具,而是可以在一个统一的环境中完成所有开发任务。
2.2 集成开发环境特性
-
文件浏览器:Jupyter Labs 提供了一个集成的文件浏览器,用户可以轻松浏览、打开、编辑不同格式的文件(如
.txt
、.csv
、.json
、.md
文件等)。 -
终端接口:Jupyter Labs 支持直接打开终端窗口,方便开发者执行系统命令、安装库和管理虚拟环境。
-
文本编辑器:除了支持编写代码,Jupyter Labs 还集成了一个功能强大的文本编辑器,支持多种文件格式,方便开发者进行文档编辑和管理。
-
富文本输出:Jupyter Labs 支持显示富文本内容,包括数学公式、图表、图片等,特别适合进行数据分析和科研报告的编写。
3. Jupyter Notebooks的技术特点与应用
3.1 交互式编程环境
Jupyter Notebooks 的一大特色是其交互式编程环境,允许开发者在编写代码的同时,实时查看执行结果。
3.1.1 实时代码执行
Jupyter Notebooks 支持代码在单元格中的分块执行,开发者可以逐步执行代码,查看每步的中间结果。这种交互式的编程方式非常适合数据科学中的实验性任务。
3.1.2 即时结果显示
每当代码执行时,Jupyter 会立刻显示结果,无论是计算结果、图表还是文本输出。这样的实时反馈机制使得开发者可以更快地发现问题并进行调试。
3.1.3 动态调试能力
Jupyter 提供了灵活的调试功能,开发者可以直接在笔记本中进行代码调试,通过设置断点、打印变量等方式,快速定位和解决问题。
3.2 文档创作功能
Jupyter 不仅是一个代码编辑器,还是一个强大的文档创作工具。它支持 Markdown 格式,允许开发者撰写清晰的文档,解释数据分析的过程和结果。
3.2.1 支持实时代码
Jupyter 支持在文档中嵌入代码,并允许在文档中直接运行这些代码。这样,开发者不仅能展示代码本身,还能演示代码的实际执行结果。
3.2.2 叙述性文本整合
Markdown 支持让开发者在代码块之间插入解释性的文本、公式和图片。开发者可以为每个代码单元格添加注释,使得整个笔记本不仅是代码,还是一个完整的讲解性文档。
3.2.3 数学公式展示
Jupyter 支持使用 LaTeX 语法编写数学公式,方便开发者在数据分析和科学计算中展示复杂的数学推导和公式。
3.2.4 数据可视化
Jupyter 的数据可视化功能非常强大,开发者可以直接在笔记本中生成图表并实时展示。支持的图表库包括 Matplotlib、Seaborn、Plotly 等,极大地丰富了数据可视化的方式。
4. 云服务集成
4.1 云平台兼容性
随着云计算的普及,Jupyter Notebooks 也逐渐集成到各种云平台中。尤其是在 Azure 上,Jupyter Notebooks 提供了与 Azure AI 服务的紧密集成。
4.1.1 Azure AI服务集成
在 Azure 上,你可以直接使用 Jupyter Notebooks 来调用 Azure 的机器学习和人工智能服务,快速实现数据分析和模型训练。Azure 提供了丰富的工具和库,使得开发者能够在 Jupyter 环境中无缝地进行云计算任务。
4.1.2 其他云服务提供商支持
除了 Azure,Jupyter Notebooks 还支持 AWS、Google Cloud 等多个云服务平台,开发者可以根据需求选择最合适的云服务来加速数据分析和机器学习任务。
4.1.3 分布式计算能力
通过集成云计算平台,Jupyter Notebooks 可以支持大规模的分布式计算任务。例如,使用 Jupyter 可以分布式地处理大数据集,进行复杂的机器学习训练和模型优化。
4.2 开发效率提升
4.2.1 协作开发支持
Jupyter Notebooks 提供了多种协作开发功能。例如,你可以通过 GitHub 或其他版本控制工具共享和管理你的笔记本。多人可以同时访问和编辑同一个笔记本,方便团队协作。
4.2.2 版本控制整合
Jupyter 支持与 Git 进行集成,方便开发者对笔记本进行版本控制,追踪更改,回滚历史版本。
4.2.3 项目管理功能
通过 Jupyter Notebooks,开发者可以方便地组织和管理多个项目的代码和文档,确保项目进度和代码质量。
5. 实际应用场景
5.1 数据科学研究
Jupyter Notebooks 在数据科学中的应用非常广泛。它支持快速的数据清洗、分析和可视化,使得数据科学家能够高效地完成各类研究任务。
5.1.1 数据分析流程
通过 Jupyter Notebooks,数据科学家可以通过交互式操作直接探索数据集、生成统计图表和进行初步分析。
5.1.2 模型开发测试
Jupyter 提供了灵活的代码执行功能,开发者可以轻松进行模型开发、训练和测试。
5.1.3 结果可视化
Jupyter 允许将分析结果直接以图表的形式展现,便于团队成员和利益相关者进行理解和决策。
5.2 机器学习开发
Jupyter Notebooks 也是机器学习工程师的理想选择。其交互式的开发环境使得机器学习开发过程更加直观和高效。
5.2.1 模型训练过程
机器学习工程师可以在 Jupyter 中加载数据、训练模型并进行超参数调优。通过交互式执行,模型的训练过程可以随时调整和优化。
5.2.2 参数调优
Jupyter 支持快速实验,可以尝试不同的参数设置并即时查看效果。
5.2.3 性能评估
通过集成的可视化工具,开发者可以轻松查看模型的性能评估指标,如准确率、召回率、F1 分数等。
6. 总结
Jupyter Notebooks 在数据科学和AI开发中的地位不可撼动。从最初的 IPython 到现代的 Jupyter Labs,Jupyter 已经发展成一个完整、强大的开发环境,支持跨平台、多语言、云服务集成等多种功能。无论你是从事数据科学、机器学习、深度学习,还是 AI 开发,Jupyter Notebooks 都是一个必备的工具。
7. 常见问题解答
Q1: Jupyter Notebooks 和传统 IDE 有什么区别?
A1: Jupyter Notebooks 提供了交互式编程环境,支持实时代码执行和结果展示,非常适合进行数据分析和机器学习开发。而传统 IDE 更多的是用于传统软件开发,缺乏实时反馈功能。
Q2: 为什么要从 Classic Notebook 迁移到 Jupyter Labs?
A2: Jupyter Labs 提供了更现代化的界面、更多的功能特性和更好的扩展性,能够帮助开发者更高效地进行复杂的任务。
Q3: Jupyter Notebooks 如何支持团队协作?
A3: 通过版本控制和共享功能,团队成员可以同时在同一 Jupyter 笔记本中工作,进行协作开发和共享成果。
Q4: 能否在 Jupyter Notebooks 中使用多种编程语言?
A4: 是的,Jupyter Notebooks 支持通过不同的内核(Kernel)使用 Python、R、Julia 等多种编程语言。
Q5: Jupyter Labs 的性能如何?
A5: Jupyter Labs 提供了优化的性能,尤其在处理大规模数据分析任务时表现优异,能够有效提升开发效率。
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(一)认证概述
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(二)考试的核心内容
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(三)AI层级
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(四)AI基础概念
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(五) 数据集
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(六)数据标注
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(七)监督学习与无监督强化学习
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(八)神经网络与深度学习
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(九)GPU
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十)CUDA
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十一)ML Pipeline
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十二)预测(Prediction)和预报(Forecasting)
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十三)评估指标
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十四 )Jupyter Notebooks
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十五)回归分析
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十六)分类
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十七)聚类
点击进入:Azure基础认证(AI-900)完全指南:从入门到考试通过(十八)混淆矩阵
本文为原创内容,未经许可不得转载。
评论记录:
回复评论: