1095 字
5 分钟
Kubernetes 核心对象:Pod、Deployment 与 Service 的关系

Kubernetes 的学习曲线陡峭,很大程度是因为一上来就被几十个对象类型淹没。其实日常 80% 的工作只围绕三个对象:Pod 跑应用,Deployment 管 Pod,Service 暴露 Pod。理清这三者的关系,K8s 的大门就打开了。

先换脑子:声明式,不是命令式#

传统运维是命令式的:「启动 3 个容器」「这台挂了,重启它」。K8s 是声明式的:你只提交期望状态(“这个应用要有 3 个副本”),K8s 的控制循环持续观察实际状态,发现偏差就自动纠正——副本少了就补,节点挂了就迁。

你提交的每一份 YAML 都是一张「愿望清单」,而不是操作手册。这个模型是理解一切 K8s 行为的前提。

Pod:最小调度单位#

Pod 是一个或多个共享网络与存储的容器组,是 K8s 调度的最小单位。同一 Pod 内的容器共享 IP 和端口空间,通过 localhost 互访。

为什么不是直接调度容器?因为存在「主容器 + 紧密耦合的辅助容器」场景:比如应用容器写日志到共享目录,边车(sidecar)容器负责把日志转发出去——它们必须同生共死、共享存储,打包成一个 Pod 正合适。

实践中很少手写 Pod 定义,但要知道它的两个特性:IP 是临时的(Pod 重建就换)、Pod 是不可变的(想改配置?删掉重建)。

Deployment:让 Pod 保持「想要的样子」#

直接创建 Pod 是自虐:它挂了就挂了,没人管。Deployment 在 Pod 之上加了副本管理和更新策略:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3 # 期望 3 个副本
selector:
matchLabels:
app: web
template: # Pod 模板
metadata:
labels:
app: web
spec:
containers:
- name: web
image: registry.example.com/myapp:1.4.2
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
Terminal window
kubectl apply -f deployment.yaml
kubectl get pods # 看到 3 个 web-xxx 的 Pod

滚动更新:改 image 版本后再 apply,Deployment 默认用 RollingUpdate 策略——先起一个新版本 Pod,健康了再灭一个旧的,如此滚动,全程服务不中断。

回滚:历史版本被自动记录,新版出问题时一键回到上一个:

Terminal window
kubectl rollout status deployment/web # 观察更新进度
kubectl rollout undo deployment/web # 回滚

自愈:手动 kubectl delete pod web-xxx 试试——Deployment 立刻补一个新 Pod 维持 replicas: 3。这就是声明式控制循环的直观体现。

Service:给会漂移的 Pod 一个稳定地址#

Pod IP 会变、副本会扩缩,客户端该连哪个地址?Service 用标签选择器圈定一组 Pod,提供一个稳定的虚拟 IP 和 DNS 名,并把流量转发过去。

apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web # 选中所有带 app=web 标签的 Pod
ports:
- port: 80 # Service 自己的端口
targetPort: 8080 # 转发到 Pod 的端口

集群内其他应用现在可以通过 http://web(同命名空间下)访问你的服务——不用关心后面是 3 个还是 30 个 Pod、IP 换了几次。

Service 的三种常用类型:

类型作用
ClusterIP(默认)仅集群内访问,内部服务间调用的标准方式
NodePort在每个节点开一个端口(30000-32767),外部可经节点 IP 访问
LoadBalancer向云厂商申请一个外部负载均衡器,生产暴露服务的常用方式

对外提供 HTTP 服务时,更常见的组合是 Service + Ingress(统一域名、路径路由和 TLS 终结),Ingress 可以认为是「HTTP 层的 Service」。

三者关系一图流#

管理副本与更新
Deployment ──────────────────► Pod × 3(标签 app=web)
▲
│ 标签选择器
Service ───────────────────────────┘
(稳定 IP/DNS,负载均衡转发)

客户端访问 Service 的固定地址;Service 按标签把请求分发给当前存活的 Pod;Deployment 保证 Pod 的数量和版本符合期望。三层各司其职,任何一层都不需要知道其他层的实现细节。

动手前的建议#

本地学习用 minikube 或 kind(Kubernetes in Docker)起单节点集群;云厂商的托管 K8s(ACK、TKE、EKS)省掉控制面运维,适合生产起步。学会 kubectl get/describe/logs/apply 四件套,就足以完成日常 80% 的操作——describe 尤其重要,任何对象「不正常」,先看它末尾的 Events。

延伸阅读#

Kubernetes 核心对象:Pod、Deployment 与 Service 的关系
https://meow.us.kg/posts/kubernetes-pod-deployment-service/
作者
もゆちゃん
发布于
2026-10-17
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取