Kubernetes 教学工作区 · 课程 0001 · 约 25 分钟 · 前置:无 · 2026-09-24

三个对象,一张图:K8s 到底在管什么

这节课的胜利:画出并讲清"从一份 YAML 到一个能被访问的服务"这条链路 (Deployment → ReplicaSet → Pod → Service → 外部入口),并写出你自己的第一份 Pod YAML 骨架。 这一节不需要集群 —— 你本机有 kubectl v1.34.1,但还没有集群(minikube 下一节装)。

为什么是这一步

使命的验收是"minikube 起本地集群,用 YAML 部署一个应用"。 但直接开集群容易变成"照抄 YAML 然后看它跑起来",什么也没学到。 先把三个核心对象各自的职责分清,后面每个 YAML 字段才有归属。

最小知识:三条

  1. Pod 是最小调度单位,不是一个容器。一个 Pod 里可以放多个容器(通常一个主容器 + 辅助容器), 它们共享网络与存储命名空间。K8s 从不直接调度"容器" —— 它调度的永远是 Pod。
  2. Deployment 是"声明期望状态"的控制器。你写"我要 3 个副本、用这个镜像", 它负责让现实向期望靠拢:不够就补、多了就删、更新时滚动替换。中间那层是 ReplicaSet(负责"副本数量"这一件事)。
  3. Service 给一组 Pod 一个稳定入口。Pod 会被重建、IP 会变,而 Service 的名字与虚拟 IP 不变 —— 它按标签选择器把流量分给后端的 Pod。对外暴露的三种典型方式:ClusterIP(集群内)、NodePort(节点端口)、Ingress(HTTP 路由)。

动手:画出链路,再写一份 YAML 骨架

先确认工具在(不需要集群):

kubectl version --client
# Client Version: v1.34.1
# Kustomize Version: v5.7.1

任务一:画链路图(写进 10-项目/2027-掌握Kubernetes/K8s核心对象.md)。 按下面这条链,每一环写一句"它负责什么、它管着谁":

kubectl apply -f app.yaml
        │
        ▼
   Deployment  ──创建并维持──▶  ReplicaSet  ──创建并维持──▶  Pod(1..N)
   (期望副本数/镜像)              (副本数量)                  (真正跑容器)
                                                                  ▲
                                            Service(标签选择器)───┘
                                            (稳定入口:名字 + 虚拟 IP)
                                                                  ▲
                                            Ingress / NodePort ───┘
                                            (把流量从集群外引进来)

任务二:写出 YAML 骨架(先不 apply,集群还没起)。关键是把"哪个字段属于哪个对象"写对:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3                 # ← 期望副本数:Deployment 管
  selector:
    matchLabels: { app: web } # ← 它按这个标签找自己管哪些 Pod
  template:                   # ← 下面这段就是"Pod 模板"
    metadata:
      labels: { app: web }    # ← 必须与上面的 selector 对上
    spec:
      containers:
      - name: web
        image: nginx:alpine
        ports: [{ containerPort: 80 }]
---
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector: { app: web }      # ← Service 按标签找到那 3 个 Pod
  ports: [{ port: 80, targetPort: 80 }]
  type: ClusterIP             # ← 先只做集群内可达;对外暴露下一节再改

自检问题(先自己答,下一节验证):① 如果我把 Deployment 的 replicas 从 3 改成 5,会发生什么? ② 如果我删掉一个 Pod,谁会把它补回来?③ 如果 Pod 的标签与 Service 的 selector 不一致,会发生什么?

自测(选项一样长,别从长度上猜)

1. K8s 调度的最小单位是什么?

对。调度单位是 Pod:一个 Pod 里可以有多个容器,它们共享网络与存储命名空间。K8s 不直接调度"裸容器"。

2. 你删掉一个 Pod,是谁把它补回来?

对。Deployment → ReplicaSet 的职责就是"维持期望副本数" —— 现实与期望不符时,它创建新的 Pod。这正是"声明式"的含义。

3. Service 的 selector 与 Pod 的 labels 不一致会怎样?

对。Service 靠标签选择器找后端,匹配不上就是"零个端点" —— 请求会失败,但 K8s 不会替你纠正。这类问题要用 kubectl get endpoints 才能看到。