- 文档
- 教程
- 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
导读
本文以开源仓库 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):
- 选择一个容器镜像(例如 redis、nginx、mongo 等);
- 使用所选镜像在默认命名空间(default namespace)中创建一个 Pod;
- 验证该 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 问答 给出了各阶段的准确定义:
| 阶段 | 含义 |
|---|---|
Pending | Pod 已被集群接受,但容器尚未运行(例如镜像仍在下载,或尚未被调度) |
ContainerCreating | 容器正在创建/启动过程中 |
Running | Pod 已绑定到某个节点,且至少有一个容器处于运行状态 |
Succeeded | Pod 内所有容器均成功终止 |
Failed | 至少一个容器以失败状态终止 |
Unknown | 无法获取 Pod 状态 |
若需更详细的信息,可在后续排障章节看到kubectl describe pod与kubectl logs的用法。
四、从命令到集群:kubectl run背后的完整调用链
仅执行一条kubectl run,集群内部会发生一系列联动。仓库 Kubernetes README 的问答 中专门描述了 "What happens when you run a Pod with kubectl?" 的七步流程,结合其控制面/工作节点组件说明,可以还原出以下完整链路:
kubectl向kube-apiserver发送创建 Pod 的请求,用户在此过程中完成认证,请求被校验;- 集群状态数据被写入etcd;
- Scheduler通过监视 API Server 发现存在未被分配的 Pod;
- Scheduler 选择一个合适的节点,将调度结果写回 etcd 并更新 API Server;
- 目标节点上的Kubelet监视到有 Pod 被分配给自己且尚未运行;
- Kubelet 请求容器运行时(如 containerd、Docker 等)拉取镜像并创建、启动容器;
- 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 练习索引 直达):
- Killing Containers:用
kubectl exec+ 杀进程的方式验证 Pod 重启自愈,其答案会解释 RESTARTS 上升的原因; - ReplicaSet 101:对比裸 Pod 与控制器托管 Pod 的差异,体验"删除一个 Pod 自动补位"的声明式调和逻辑,其答案包含完整的 ReplicaSet YAML;
- Services 01:为 Pod 创建 Service,打通集群内/外访问;
- Labels and Selectors:用
kubectl get po -l app=web等选择器命令按标签筛选对象; - 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
相关推荐
LeetCode 394 字符串解码(Decode String)详解:栈与递归两种解法
LeetCode 394 字符串解码(Decode String)详解:栈与递归两种解法 导读 本文围绕 LeetCode 394「字符串解码」(Decode
文档教程DevOps运维devops-exercises 实战指南:在 AWS 上创建你的第一个 VPC(exercise-vpc)
devops exercises 实战指南:在 AWS 上创建你的第一个 VPC(exercise vpc) 导读 本文基于 devops exercises
文档教程DevOps运维AWS VPC 实战:在 devops-exercises 中创建你的第一个 VPC(exercise-vpc)
AWS VPC 实战:在 devops exercises 中创建你的第一个 VPC(exercise vpc) 本文以 devops exercises 仓库
文档教程DevOps运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考