一、先理解这次实战要完成什么¶
这次示例的目标非常简单:
- 在集群里部署一个应用
- 确认 Pod 已经正常运行
- 通过
Service对外暴露访问入口 - 用浏览器或
curl验证服务确实可以访问
虽然步骤不多,但它已经覆盖了 Kubernetes 最常见的一条基本链路:Deployment -> Pod -> Service -> NodePort -> 用户访问。
二、创建第一个 Deployment¶
原始示例使用 kubectl create deployment 快速创建了一个名为 counter 的工作负载:
kubectl create deployment counter --image=registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1
创建完成后,先检查 Deployment 状态:
kubectl get deploy
示例输出如下:
NAME READY UP-TO-DATE AVAILABLE AGE
counter 1/1 1 1 51s
然后继续检查 Pod:
kubectl get po
示例结果:
NAME READY STATUS RESTARTS AGE
counter-7dd9fb465f-m8mbq 1/1 Running 0 90s
从这里可以先建立两个基本认知:
Deployment负责声明式管理副本和滚动更新- 真正承载应用进程的是 Pod
只要 Pod 进入 Running,就说明应用已经在集群内部成功运行起来了。
三、通过 Service 暴露访问入口¶
Pod 能运行并不等于外部能访问。要把应用对外暴露出来,还需要创建 Service。
示例里使用 NodePort 方式暴露服务:
kubectl expose deploy counter --port 80 --type NodePort
创建完成后,用下面的命令查看服务:
kubectl get svc | grep counter
示例输出如下:
counter NodePort 10.105.9.51 <none> 80:31961/TCP 32s
这条结果里最值得关注的是两组端口:
80表示 Service 在集群内部暴露的服务端口31961表示映射到节点上的NodePort
也就是说,只要能访问集群任意节点的这个端口,就能访问到后端应用。
四、验证服务是否真的可用¶
服务创建完成后,可以直接用节点 IP 加 NodePort 测试:
curl http://10.0.0.20:31961
示例返回结果如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>宽哥的云原生课程</title>
<script type="module" crossorigin src="/assets/index-CIg9ySjF.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BMjQMJQ-.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
只要能拿到这类 HTML 响应,就说明以下几件事同时成立:
- 容器已经正常启动
- Pod 已经被 Service 正确关联
- 节点端口已经暴露成功
- 从外部到应用容器的访问链路已经打通
五、把这几个 Kubernetes 对象串起来理解¶
很多初学者会把 Deployment、Pod、Service 混在一起。其实它们在职责上非常清晰:
5.1 Deployment 负责声明和管理¶
它定义应用应该跑多少副本、镜像是什么、如何滚动更新。你通常不会直接手工维持 Pod,而是让 Deployment 来管理。
5.2 Pod 负责真正承载应用¶
容器运行在 Pod 里。应用崩掉或节点漂移时,Pod 可能被重建,因此 Pod 本身并不是稳定访问入口。
5.3 Service 负责提供稳定访问方式¶
Service 把一组符合标签选择条件的 Pod 聚合成一个稳定的服务入口。即使后端 Pod 被替换,只要标签匹配不变,Service 仍然可用。
5.4 NodePort 负责把服务暴露到节点¶
NodePort 是最适合入门理解的一种暴露方式。它会在每个节点上打开一个端口,把外部请求转发到对应 Service,再由 Service 转发到后端 Pod。
六、做完这次最小部署之后,你应该掌握什么¶
如果你已经走通本文里的命令,至少应该建立下面几层基础认知:
- 如何快速创建一个最小可运行工作负载
- 如何判断 Deployment 和 Pod 是否创建成功
- 为什么 Pod 运行了仍然需要 Service
- 什么是
NodePort,以及它是如何把服务暴露到节点上的
这一步虽然简单,但它是后续学习 YAML 编排、滚动更新、探针配置、Ingress、配置管理和 Helm 部署的基础起点。先把这个最小闭环彻底跑通,后面的 Kubernetes 学习效率会高很多。