部署你的第一个应用
本教程共 65 篇 · 第 8 篇 · 更新于 2026-08-14 · 约 13 分钟阅读
本节目标:亲手用 kubectl 把一个 nginx 应用跑起来,学会创建 Deployment、查看 Pod、看日志,建立”k8s 跑应用”的真实手感。
前面把环境装好了,这章终于动手。我们跟着官方 Hello Minikube 的思路,部署一个最简单的 Web 应用。别担心看不懂命令,每条我都解释。
8-1 前提:集群已经起来
动手前确认两件事:
- 你已安装
kubectl。 - 本地集群已启动(
minikube start或kind create cluster已成功)。
验证一下集群在不在:
kubectl get nodes
能看到一个节点、状态是 Ready,就说明一切就绪。
Note本章示例以 minikube 为主,但命令在 kind 上同样适用。下面用 nginx 镜像当例子,因为它简单、自带 Web 服务,最适合入门。
8-2 一句话创建 Deployment
在 k8s 里部署应用,最标准的方式是创建一个 Deployment(部署)。它负责保证指定数量的 Pod 一直跑着。
用一条命令起一个 nginx:
kubectl create deployment hello-node --image=nginx
这条命令的意思是:创建一个名为 hello-node 的 Deployment,它拉取 nginx 镜像,跑一个 Pod。
Tip
kubectl create deployment是”命令式”的快捷写法,适合快速试手。后面章节会教你用 YAML 文件来”声明式”部署,那才是生产推荐方式。这章先求跑通。
8-3 查看部署和 Pod
创建之后,看看它长啥样:
kubectl get deployments
输出类似:
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m
再看 Pod 实际跑起来没:
kubectl get pods
输出类似:
NAME READY STATUS RESTARTS AGE
hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
STATUS 是 Running、READY 是 1/1,就说明 Pod 健康。如果看到 0/1,别急,等几秒再敲一次——镜像下载需要时间。
NotePod 名字里那一串随机字符是副本的标识。Deployment 管着这些 Pod,Pod 挂了它会自动重建一个,名字会变,但服务不断。
8-4 看看集群里发生了什么
想看更细的事件,可以:
kubectl get events
想看 kubectl 当前连的是哪个集群、什么上下文:
kubectl config view
这俩命令在排错时很有用。比如 Pod 一直 Pending,get events 往往能告诉你”节点资源不够”之类的原因。
8-5 看一眼日志
Pod 跑着,怎么确认它在干活?看日志:
kubectl logs hello-node-5f76cf6ccf-br9b5
把 Pod 名换成你自己 get pods 看到的那串。nginx 起来后日志会有类似 “start worker processes” 的字样。
Warning
kubectl logs后面跟的必须是你get pods里真实的 Pod 名,别照抄我示例里的那串。每台机器生成的名字都不一样。
8-6 让它能被访问(可选)
默认 Pod 只在集群内部有 IP,外面访问不到。想暴露成一个对外的 Service,可以:
kubectl expose deployment hello-node --port=80 --type=NodePort
--type=NodePort 表示给这个 Service 在节点上开一个端口,你可以用 节点IP:端口 直接访问。在 minikube 里更简单:
minikube service hello-node
它会自动打开浏览器访问这个服务。
TipService 是”稳定访问入口”的概念,细节后面服务与网络章节才展开。这章你只要体验”应用起来了、能被访问”,目的就达到了。
8-7 清理,养成好习惯
练完记得清理,别让资源堆着:
kubectl delete service hello-node
kubectl delete deployment hello-node
如果用的是 minikube 还想停掉整个集群:
minikube stop
Note学 k8s 很容易建一堆东西忘了删。养成”建了就删”的习惯,本地环境才清爽,也不容易把概念搞混。
8-8 你刚经历了什么
回顾一下,你其实已经走完了 k8s 最核心的一条链路:
- 用 kubectl 告诉集群”我要一个 nginx”。
- apiserver 记下需求,scheduler 选好节点。
- 节点上的 kubelet 拉起容器,Pod 进入 Running。
- 你用 get/logs 观察它,用 expose 访问它。
这跟前面架构章节讲的全对上了。
8-9 换个方式访问:port-forward
除了 expose 开 NodePort,还有一个更轻量的本地访问办法:port-forward(端口转发)。它把集群里某个 Pod 的端口,映射到你自己电脑的某个端口。
kubectl port-forward pod/hello-node-xxxx 8080:80
执行后,你在浏览器打开 http://localhost:8080 就能访问那个 Pod 的 80 端口。它只用于本地调试,不会真正对外暴露服务。
Tipport-forward 特别适合”我想在本地看看这个 Pod 到底通不通”的场景。关掉命令,转发就断了,不留下任何集群配置,干净。
8-10 顺手改一下:edit
想临时改 Pod 的某个配置看看效果?可以用 edit 直接在默认编辑器里改:
kubectl edit deployment hello-node
它会拉起编辑器,你改完保存,k8s 就按新配置调整。不过注意,对于由 Deployment 管理的 Pod,直接 edit Pod 可能被控制器覆盖——正确的做法通常是改 Deployment。这里只是让你体验”改了即时生效”的感觉。
Warning
edit和port-forward都是调试利器,但别把它们当日常管理手段。正经修改要用 YAML 文件apply,那样才有版本记录、可回滚。这条原则第 10 章会详细讲。
8-11 Pod 一直起不来?先看这几处
新手最常遇到的状况:Pod 卡在 Pending 或 CrashLoopBackOff。别慌,按这个顺序查:
kubectl describe pod <名>,重点看最下面的 Events。它会直接告诉你原因,比如”镜像拉取失败""节点资源不足""节点有污点不允许调度”。- 如果是
ImagePullBackOff,多半是镜像名拼错,或镜像仓库拉不到。换用nginx这种公开镜像先跑通。 - 如果是
CrashLoopBackOff,说明容器起来了又立刻退出。看kubectl logs <名> --previous找崩溃前的最后输出。 - 如果是
Pending一直不变,可能集群资源不够,或调度规则太严。本地单节点一般不会,但kubectl describe node能看资源余量。
Note这些状态名(Pending、Running、CrashLoopBackOff 等)是 k8s 的”Pod 生命周期”概念,后面会专门一章讲。这章你只要知道”出事先 describe 看 Events”就够了。
小结
这一章你走通了:建 Deployment → 看 deployment/pod → 看 events/logs → 暴露访问 → port-forward 调试 → 清理。你还学会了出问题时怎么排查。亲历了”提交意图、集群落地”的全过程。
8-13 本章命令速记
把这一章敲过的命令收个尾,方便你回看:
kubectl create deployment hello-node --image=nginx # 建 Deployment
kubectl get deployments / pods # 看资源
kubectl describe pod <名> # 看详情、排错
kubectl logs <名> # 看日志
kubectl expose deployment hello-node --type=NodePort # 暴露服务
kubectl port-forward pod/<名> 8080:80 # 本地转发调试
kubectl delete deployment/service hello-node # 清理
把这些敲顺了,你对”k8s 怎么跑应用”就算有了真实体感。下一章,我们系统学一遍 kubectl 最常用的命令,让你指挥集群更顺手。