☰
devops-exercises 实战指南:用 `kubectl run` 创建你的第一个 Kubernetes Pod(Pods 01 练习详解)
2026/10/1 8:30:51 网站建设 项目流程
  • 文档
  • 教程
  • DevOps
  • 运维

【免费下载链接】devops-exercises

Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions

项目地址:https://gitcode.com/GitHub_Trending/de/devops-exercises
点击查看免费下载

导读

本文以开源仓库 devops-exercises 中 Kubernetes 系列的第一个练习 Pods 01 及其官方答案为骨架,系统讲解如何通过kubectl run在默认命名空间创建 Pod,并借助kubectl get pods完成运行状态验证。读完本文,你将掌握 Kubernetes 最小调度单元 Pod 的命令式创建方法、关键参数语义、创建流程的底层调用链,以及基于仓库问答章节(Kubernetes README)沉淀的排障与进阶技巧,可直接用于 CKA 备考和日常集群操作。

一、练习目标:从零创建第一个 Pod

先看仓库中 Pods 01 练习原文 给出的任务拆解:

  • 目标(Objective):学会如何创建 Pod(Learn how to create pods);
  • 操作步骤(Instructions):
    1. 选择一个容器镜像(例如 redis、nginx、mongo 等);
    2. 使用所选镜像在默认命名空间(default namespace)中创建一个 Pod;
    3. 验证该 Pod 处于运行状态。

在 Kubernetes README 的练习索引表 中,该练习被命名为 "My First Pod",归属Pods主题,是仓库 Kubernetes 系列的第一课,与后续的 "Killing" Containers(重启策略)、Service、ReplicaSet、Labels and Selectors 等练习形成循序渐进的学习链路。

二、完整解决方案:两行命令搞定

官方答案 极其精炼,核心只有两条命令:

kubectl run nginx --image=nginx --restart=Never kubectl get pods
  • 第一条命令:以nginx镜像为模板,创建一个名为nginx的 Pod;
  • 第二条命令:列出当前命名空间下的所有 Pod,用于验证nginxPod 是否成功进入运行状态。

这两条命令构成了 Kubernetes 命令式(imperative)创建 Pod 的最短路径,也是后续所有 Kubernetes 练习(ReplicaSet、Deployment、Service)的基础操作。

三、命令逐项解析:参数语义与默认值

3.1kubectl run:命令式创建

kubectl run是 kubectl 提供的命令式创建工具。在本练习语境下,它的作用是根据命令行参数直接生成 Pod 对象并提交给集群。仓库 Kubernetes README 的 Pods 问答章节 也使用了同类命令演示 Pod 创建,例如kubectl run my-pod --image=nginx:alpine。

值得注意的参数细节:

  • --image=nginx:指定容器镜像。本练习使用nginx,你也可以按练习要求替换为redis、mongo、httpd等任意镜像,例如仓库 Killing Containers 练习 就使用了registry.redhat.io/rhscl/httpd-24-rhel7;
  • --restart=Never:这是让kubectl run只创建独立 Pod(而非 Deployment 等控制器)的关键参数。省略该参数时,kubectl run会默认创建 Deployment 对象(此时 Pod 由控制器托管)。仓库 静态 Pod 练习答案 中也出现了k run some-pod --image=python --command sleep 2017 --restart=Never --dry-run=client -o yaml的用法,可见--restart=Never用于要求生成裸 Pod 清单;
  • 默认命名空间:未指定--namespace时,Pod 创建在当前 kubeconfig 上下文对应的命名空间中(通常为default)。如练习要求所强调,本任务不切换命名空间。

3.2kubectl get pods:验证运行状态

kubectl get pods(简写kubectl get po)列出当前命名空间内的 Pod,输出包含NAME、READY、STATUS、RESTARTS、AGE等列。创建完成后,nginxPod 的STATUS会依次经历以下阶段,最终停留在Running:

仓库 Kubernetes README 的 Pod phases 问答 给出了各阶段的准确定义:

阶段含义
PendingPod 已被集群接受,但容器尚未运行(例如镜像仍在下载,或尚未被调度)
ContainerCreating容器正在创建/启动过程中
RunningPod 已绑定到某个节点,且至少有一个容器处于运行状态
SucceededPod 内所有容器均成功终止
Failed至少一个容器以失败状态终止
Unknown无法获取 Pod 状态

若需更详细的信息,可在后续排障章节看到kubectl describe pod与kubectl logs的用法。

四、从命令到集群:kubectl run背后的完整调用链

仅执行一条kubectl run,集群内部会发生一系列联动。仓库 Kubernetes README 的问答 中专门描述了 "What happens when you run a Pod with kubectl?" 的七步流程,结合其控制面/工作节点组件说明,可以还原出以下完整链路:

  1. kubectl向kube-apiserver发送创建 Pod 的请求,用户在此过程中完成认证,请求被校验;
  2. 集群状态数据被写入etcd;
  3. Scheduler通过监视 API Server 发现存在未被分配的 Pod;
  4. Scheduler 选择一个合适的节点,将调度结果写回 etcd 并更新 API Server;
  5. 目标节点上的Kubelet监视到有 Pod 被分配给自己且尚未运行;
  6. Kubelet 请求容器运行时(如 containerd、Docker 等)拉取镜像并创建、启动容器;
  7. Kubelet 向 API Server 回报 Pod 运行状态,API Server 再次更新 etcd。

这条链路印证了控制面组件(API Server、Scheduler、etcd、Controller Manager)与数据面组件(Kubelet、kube-proxy、容器运行时)的分工:用户只输入一条命令,调度与执行的编排由集群自行完成。这也是 Kubernetes 被设计为"声明期望状态、由控制器持续调和"的原因。

五、为什么是 Pod:Kubernetes 最小调度单元

练习要求创建的是 Pod 而非 Deployment,这恰好是理解 Kubernetes 对象模型的第一步。仓库 Kubernetes README 的问答章节 给出了 Pod 的标准定义:

Pod 是一组一个或多个容器的集合,这些容器共享存储与网络资源,并附带一份如何运行容器的规格说明。Pod 是 Kubernetes 中可创建和管理的最小计算单元。

由此可以推导出几个关键结论:

  • 没有kubectl get containers命令:因为容器不是 Kubernetes 对象,Pod 才是最小对象单元,一个 Pod 内可以有一个或多个容器;
  • Pod 通常不直接创建:仓库问答明确说明,实践中 Pod 大多由 Deployment、ReplicaSet 等控制器创建并托管——如果裸 Pod 死亡,Kubernetes 不会自动恢复它,而 ReplicaSet 会保证指定数量的 Pod 始终运行。本练习用裸 Pod 是为了先把"最小单元"的概念练熟;
  • 一个 Pod 只能运行在单个节点上:Pod 不可跨节点拆分;默认情况下 Pod 是非隔离的,可接受来自任意来源的流量;
  • 一个 Pod 可包含多个容器:例如"边车(side-car)"模式中,日志采集、监控适配器等辅助容器与应用容器共享生命周期与网络命名空间。

六、进阶验证与排障:从Running到真正可用

创建命令验证通过后,还可以沿用仓库后续练习的思路做更深层的确认:

6.1 查看调度节点与更宽输出

kubectl get pods -o wide

-o wide会额外展示 Pod 被调度到的工作节点、Pod 内部 IP 等信息——仓库问答中明确指出这是"查看 Pod 运行在哪个节点"的答案。

6.2 进入容器执行命令

kubectl exec nginx -- ls

结合仓库 Killing Containers 练习 的做法,还可以用kubectl exec web -- ps查看容器内进程、用kubectl exec web -- kill 1杀掉主进程,然后观察kubectl get po web中RESTARTS计数上升——Kubernetes 会根据重启策略自动把异常容器重新拉起,这正是其"自愈"能力的直观演示。

6.3 查看详细事件与日志

当 Pod 未按预期运行(例如卡在Pending、CrashLoopBackOff、ErrImagePull)时,仓库 Kubernetes README 的排障问答 推荐两条命令:

kubectl describe pod <POD_NAME> # 查看事件、退出码、镜像拉取失败原因 kubectl logs <POD_NAME> # 查看容器标准输出/错误日志

例如CrashLoopBackOff表示容器反复"启动-崩溃-再启动",可通过kubectl describe的Last State/Exit Code定位根因;ErrImagePull则说明镜像拉取失败(可能是认证或网络问题)。

6.4 清理

kubectl delete pod nginx

删除 Pod 时,Kubernetes 会先向容器内主进程发送TERM信号,给予 30 秒优雅退出窗口,超时后再发送KILL强制终止(见仓库问答 "What happens when you delete a Pod?")。

七、与仓库其他练习的衔接:完整学习路线

本练习只是仓库 Kubernetes 体系的起点,推荐按以下顺序继续(均可从 Kubernetes README 练习索引 直达):

  1. Killing Containers:用kubectl exec+ 杀进程的方式验证 Pod 重启自愈,其答案会解释 RESTARTS 上升的原因;
  2. ReplicaSet 101:对比裸 Pod 与控制器托管 Pod 的差异,体验"删除一个 Pod 自动补位"的声明式调和逻辑,其答案包含完整的 ReplicaSet YAML;
  3. Services 01:为 Pod 创建 Service,打通集群内/外访问;
  4. Labels and Selectors:用kubectl get po -l app=web等选择器命令按标签筛选对象;
  5. CKA 备考页:若以认证为目标,可将本练习作为 CKA 实操刷题的第一步。

八、总结

通过 Pods 01 练习 及其标准答案,我们完成了一次完整的 Kubernetes 入门闭环:用kubectl run nginx --image=nginx --restart=Never创建独立 Pod,用kubectl get pods验证其进入Running状态,并顺带理解了--restart=Never的参数语义、Pod 作为最小调度单元的对象模型,以及一条命令背后 API Server → etcd → Scheduler → Kubelet → 容器运行时的完整调用链。以此为基础,再结合仓库 Kubernetes README 中大量的问答式知识库,你就能逐步构建起从"会跑命令"到"理解原理"的 Kubernetes 实战能力。

  • 文档
  • 教程
  • DevOps
  • 运维

【免费下载链接】devops-exercises

Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions

项目地址:https://gitcode.com/GitHub_Trending/de/devops-exercises
点击查看免费下载
上一篇:Tabby跨平台终端解决方案技术深度解析与架构评估
下一篇:使用 Instant Python Admin SDK:从安装到 Webhook 的完整实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询