一、先理解这次实战要完成什么

这次示例的目标非常简单:

  • 在集群里部署一个应用
  • 确认 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 对象串起来理解

很多初学者会把 DeploymentPodService 混在一起。其实它们在职责上非常清晰:

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 学习效率会高很多。