任务:在没有调度程序的情况下手动调度 Pod
在此任务中,我们将探索如何通过直接将 pod 分配到集群中的特定节点来绕过 Kubernetes 调度程序。对于需要 pod 在特定节点上运行而无需执行通常的调度过程的特定场景,这可能是一种有用的方法。
先决条件
我们假设您有一个正在运行的 Kubernetes 集群,该集群是使用类似于之前文章中描述的 KIND(Docker 中的 Kubernetes)配置创建的。在这里,我们创建了一个名为 kind-cka-cluster 的集群:
kind create cluster --name kind-cka-cluster --config config.yml
由于我们已经在之前的文章中介绍了使用 KIND 进行集群创建,因此我们不会再次讨论这些细节。
步骤 1:验证集群节点
要查看此新集群中可用的节点,请运行:
kubectl get nodes
您应该看到与此类似的输出:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
对于此任务,我们将在 kind-cka-cluster-control-plane 上调度我们的 pod。
步骤 2:定义 Pod 清单 (node.yml)
现在,让我们创建一个 YAML 格式的 pod 清单。使用 pod 配置中的 nodeName 字段,我们可以为 pod 指定确切的节点,完全绕过 Kubernetes 调度程序。
node.yml:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
在此清单中:
- 我们将 nodeName 设置为 kind-cka-cluster-control-plane,这意味着调度程序将跳过分配节点,而该特定节点上的 Kubelet 将处理放置。
这种方法是一种直接选择节点的方法,重写了其他方法,例如nodeSelector或亲和性规则。
根据 Kubernetes 文档:
“nodeName是比affinity或nodeSelector更直接的节点选择形式。nodeName是Pod规范中的一个字段。如果nodeName字段不为空,则调度程序会忽略该Pod,并且命名节点上的kubelet会尝试放置该节点上的 Pod 会否决使用 nodeSelector 或亲和性和反亲和性规则。”
更多详细信息,请参阅 Kubernetes 节点分配文档。
第 3 步:应用 Pod 清单
准备好清单后,将其应用到集群:
kubectl apply -f node.yml
此命令创建 nginx pod 并将其直接分配给 kind-cka-cluster-control-plane 节点。
第 4 步:验证 Pod 放置位置
最后,检查 pod 是否在指定节点上运行:
kubectl get pods -o wide
输出应确认 nginx pod 确实在 kind-cka-cluster-control-plane 上运行:
kind create cluster --name kind-cka-cluster --config config.yml
这验证了通过设置nodeName字段,我们成功绕过了Kubernetes调度程序并直接将我们的pod调度到控制平面节点上。
任务:登录控制平面节点,进入默认静态 Pod 清单目录,尝试重启控制平面组件。
要访问我们新创建的集群的控制平面节点,请使用以下命令:
kubectl get nodes
导航到包含静态 pod 清单的目录:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
验证当前清单:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
要重新启动 kube-controller-manager,请暂时移动其清单文件:
kubectl apply -f node.yml
确认重启后,将manifest文件恢复到原来的位置:
kubectl get pods -o wide
通过这些步骤,我们成功演示了如何访问控制平面并操作静态 pod 清单来管理控制平面组件的生命周期。
确认 kube-controller-manager 重启
将 kube-controller-manager.yaml 清单文件暂时移动到 /tmp 后,我们可以验证 kube-controller-manager 是否已重新启动。正如之前的文章中提到的,我使用的是 k9s,它确实清楚地显示了重启,但是对于没有 k9s 的读者,请尝试以下命令
检查事件:
要收集更多信息,请使用:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none> </none></none>
在输出末尾查找事件。成功重启将显示类似以下内容的事件:
docker exec -it kind-cka-cluster-control-plane bash
出现“Killing”、“Created”和“Started”事件表明 kube-controller-manager 已停止并重新启动成功。
清理
完成任务并确认 pod 的行为后,清理不再需要的所有资源非常重要。这有助于维护整洁的环境并释放集群中的资源。
列出 Pod:
首先,您可以检查集群中当前运行的 Pod:
cd /etc/kubernetes/manifests
您可能会看到如下输出:
ls
描述 Pod:
要获取有关特定 pod 的更多信息,请使用描述命令:
mv kube-controller-manager.yaml /tmp
这将为您提供有关 pod 的详细信息,例如其名称、命名空间、节点和其他配置:
mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
删除 Pod:
如果您发现不再需要该 pod,可以使用以下命令安全地将其删除:
kubectl describe pod kube-controller-manager-kind-cka-cluster-control-plane -n kube-system
验证删除:
执行删除命令后,您可以通过再次列出 pod 来验证 pod 是否已被删除:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Killing 4m12s (x2 over 8m32s) kubelet Stopping container kube-controller-manager Normal Pulled 3m6s (x2 over 7m36s) kubelet Container image "registry.k8s.io/kube-controller-manager:v1.31.0" already present on machine Normal Created 3m6s (x2 over 7m36s) kubelet Created container kube-controller-manager Normal Started 3m6s (x2 over 7m36s) kubelet Started container kube-controller-manager
确保 nginx pod 不再出现在列表中。
通过执行这些清理步骤,您可以帮助确保 Kubernetes 集群保持组织有序且高效。
创建具有特定标签的多个 Pod
在本节中,我们将基于 nginx 镜像创建三个 pod,每个 pod 都有唯一的名称和指示不同环境的特定标签:env:test、env:dev 和 env:prod。
第 1 步:创建脚本
首先,我们将创建一个脚本,其中包含生成 pod 的命令。使用以下命令创建脚本文件:
kind create cluster --name kind-cka-cluster --config config.yml
接下来,将以下代码粘贴到文件中:
kubectl get nodes
第 2 步:使脚本可执行
保存文件后,使用以下命令使脚本可执行:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
第 3 步:执行脚本
运行脚本来创建 Pod:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
您应该看到指示 Pod 创建的输出:
kubectl apply -f node.yml
第 4 步:验证创建的 Pod
然后脚本将显示创建的 Pod 的状态:
kubectl get pods -o wide
此时,您可以根据 pod 的标签来过滤它们。例如,要查找带有 env=dev 标签的 pod,请使用以下命令:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none> </none></none>
您应该看到确认 pod 正在运行的输出:
docker exec -it kind-cka-cluster-control-plane bash
标签和提及
- @piyushsachdeva
- 第 13 天:视频教程
以上是CKA 全日课程 Kubernetes 中的静态 Pod、手动调度、标签和选择器的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

禅工作室 13.0.1
功能强大的PHP集成开发环境

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载
最流行的的开源编辑器