Kubernetes 核心对象:让应用在集群中“活”起来
很多开发者第一次接触 Kubernetes 时,常把 Deployment 当作“部署命令”,把 Service 当作“负载均衡器”。但如果你只停留在这种工具层面的理解,就很容易在生产环境中踩坑:Pod 启动了却收不到流量、滚动更新导致服务中断、配置硬编码无法动态调整……
Kubernetes 的核心不是命令,而是“声明式 API”——你描述“期望状态”,系统自动达成并维持它。
本文将带你深入理解 K8s 最核心的五大对象:Pod、Deployment、Service、ConfigMap/Secret 和探针机制,并通过一张清晰的流量拓扑图,揭示它们如何协同工作,让应用真正“活”在集群中。
一、Pod:共享网络与存储的最小调度单元
Pod 是 Kubernetes 调度的最小单位,不是容器。
一个 Pod 可包含一个或多个容器,这些容器:
- 共享 同一个网络命名空间(即 localhost 可互通);
- 共享 存储卷(Volumes);
- 具有相同的生命周期。
例如,主应用容器 + 日志收集 sidecar 容器,可放在同一个 Pod 中:
spec:
containers:
- name: app
image: my-go-app
- name: log-collector
image: fluentd
volumeMounts:
- name: logs
mountPath: /var/log/app
volumes:
- name: logs
emptyDir: {}
⚠️ 注意:除非有强耦合需求(如日志收集、网络代理),否则一个 Pod 只应运行一个主业务容器。
二、Deployment:副本管理与滚动更新
Pod 本身是“一次性”的,一旦被删除就不会自动恢复。Deployment 才是管理无状态应用的核心控制器。
它通过 ReplicaSet 确保指定数量的 Pod 副本始终运行,并支持滚动更新(Rolling Update):
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 更新时最多不可用1个
maxSurge: 1 # 最多超配1个
template:
spec:
containers:
- name: app
image: my-app:v2
关键优势:
- 自动重建故障 Pod;
- 零停机更新(配合 readiness 探针);
- 支持一键回滚:
kubectl rollout undo deployment/my-app
三、Service:ClusterIP 实现服务发现
当 Pod 被重建,其 IP 会变化。如何让其他服务稳定访问它?答案是 Service。
K8s Service 通过 ClusterIP 提供稳定的虚拟 IP 和 DNS 名称:
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service # 匹配带此标签的 Pod
ports:
- port: 80
targetPort: 8080
其他服务可通过 http://user-service 访问,无需关心后端 Pod IP。
与 Consul 对比
|
能力 |
K8s Service |
Consul |
|
服务注册 |
自动(基于 Pod 标签) |
需 Agent 或 API 注册 |
|
服务发现 |
DNS + iptables/IPVS |
DNS + HTTP API |
|
健康检查 |
依赖 K8s 探针 |
内置 TCP/HTTP/TTL 检查 |
|
多集群/混合云 |
需额外方案(如 Istio) |
原生支持 |
K8s Service 提供了基础服务发现能力,但复杂治理(如熔断、限流、重试)仍需在应用层实现,(详见《微服务》【容错篇】)。
四、ConfigMap 与 Secret:配置外置的最佳实践
永远不要把配置写死在镜像里!
- ConfigMap:存储非敏感配置(如数据库地址、日志级别);
- Secret:存储敏感信息(如密码、API 密钥),Base64 编码(注意:不是加密)。
使用方式:
# 挂载为文件
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
# 或注入为环境变量
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db_host
优势:
- 配置变更无需重新构建镜像;
- 不同环境(dev/staging/prod)只需切换 ConfigMap;
- 符合 12-Factor App 的“配置外置”原则。
五、探针:liveness vs readiness,别再搞混!
这是生产环境中最容易被忽视、却最关键的机制。
readinessProbe(就绪探针)
- 作用:判断 Pod 是否准备好接收流量;
- 未就绪时:从 Service 的 Endpoints 中剔除,不转发请求;
- 典型场景:应用启动需加载缓存、连接数据库。
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe(存活探针)
- 作用:判断应用是否“卡死”;
- 失败时:K8s 会重启 Pod;
- 慎用:错误配置会导致频繁重启(如探针路径返回 5xx)。
✅ 最佳实践:
/healthz用于 readiness(检查依赖服务是否连通);/livez用于 liveness(仅检查进程是否响应)。
六、流量拓扑:从 Service 到 Pod 的完整链路
以下图展示了请求如何从 Service 流向具体 Pod:

流程说明:
- Client 通过
user-serviceDNS 解析到 ClusterIP; - K8s kube-proxy 将流量通过 iptables/IPVS 转发到后端 Pod;
- 只有通过 readinessProbe 的 Pod 才会被加入 Endpoints;
- 流量最终到达某个 Pod 的容器端口。
结语:理解对象关系,才能驾驭 K8s
Kubernetes 不是“部署工具”,而是一个声明式、自愈的分布式操作系统。
掌握 Pod、Deployment、Service、ConfigMap 和探针这五大核心对象,你就已经跨过了 80% 的入门门槛。
更多推荐




所有评论(0)