Kubernetes 核心概念
Kubernetes 核心资源对象概览:Node、Pod、Service、Ingress、ConfigMap、Secret、Deployment、StatefulSet。
1. 核心资源全景图
┌────────────────────────────────────────────────────────────┐
│ Kubernetes 集群 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node │ │ Node │ │ Node │ ... │
│ │ ┌─────┐ │ │ ┌─────┐ │ │ ┌─────┐ │ │
│ │ │Pod │ │ │ │Pod │ │ │ │Pod │ │ │
│ │ │┌───┐│ │ │ │┌───┐│ │ │ │┌───┐│ │ │
│ │ ││容器││ │ │ ││容器││ │ │ ││容器││ │ │
│ │ │└───┘│ │ │ │└───┘│ │ │ │└───┘│ │ │
│ │ └─────┘ │ │ └─────┘ │ │ └─────┘ │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ▲ ▲ │
│ └────── Service ───────────┘ │
│ │ │
│ Ingress │
│ │ │
│ 外部流量 │
└────────────────────────────────────────────────────────────┘2. 资源关系速览
| 资源 | 作用 | 类比 |
|---|---|---|
| Node | 工作节点(物理机或虚拟机) | 服务器 |
| Pod | 最小调度单元,一组容器的运行环境 | 进程组 |
| Service | 为 Pod 提供稳定网络入口 + 负载均衡 | 反向代理 |
| Ingress | 外部流量路由规则(域名/路径) | Nginx 配置 |
| ConfigMap | 存储非敏感配置信息 | 配置文件 |
| Secret | 存储敏感信息(密码/令牌等) | 加密配置 |
| Deployment | 管理无状态应用的副本与更新 | 应用管理器 |
| StatefulSet | 管理有状态应用的副本与更新 | 有状态应用管理器 |
| DaemonSet | 确保每个节点运行一个 Pod 副本 | 节点级 Agent |
| Job | 一次性任务,完成后停止 | 批处理脚本 |
| CronJob | 定时任务,按 Cron 表达式执行 | 定时批处理 |
3. Node(节点)
一个 Node 就是一个物理机或虚拟机,是 Pod 运行的实际载体。
| 角色 | 职责 |
|---|---|
| Master Node(控制平面) | 管理集群、调度 Pod、存储集群状态 |
| Worker Node(工作节点) | 运行应用程序和服务的 Pod |
在简单语境中,“Node” 通常指代 Worker 节点。
4. Pod
Pod 是 K8s 的最小调度单元。
4.1 核心特征
| 特征 | 说明 |
|---|---|
| 一组容器 | 一个 Pod 包含一个或多个应用容器 |
| 共享资源 | 容器间共享网络命名空间、存储卷、运行时配置 |
| 临时性 | Pod 可被自动销毁和重建,IP 地址会变化 |
| 自动恢复 | 出现故障时 K8s 自动销毁并重建 Pod |
💡 最佳实践:建议每个 Pod 只运行一个容器,以便更好地解耦和独立扩缩容。
4.2 Pod 生命周期
Pending → Running → Succeeded/Failed
↓
Container 崩溃
↓
重启(restartPolicy 控制)4.3 Sidecar(边车模式)
当为实现某种功能而需要将辅助容器与主容器放在同一个 Pod 中时,这种辅助容器称为 Sidecar。
常见用途:
| 用途 | 示例 |
|---|---|
| 日志收集 | Filebeat 边车收集日志转发到 Elasticsearch |
| 监控代理 | Prometheus exporter 边车暴露指标 |
| 配置管理 | 配置热加载边车监听 ConfigMap 变更 |
| 数据同步 | 数据库备份工具边车(如 xtrabackup) |
5. Service
将一组 Pod 封装成一个统一入口的网络服务抽象。
5.1 为什么需要 Service
- Pod IP 是临时的,Pod 重建后 IP 会变
- 多个 Pod 副本需要一个统一的访问入口
- 需要负载均衡能力
5.2 Service 类型
| 类型 | 说明 | 典型场景 |
|---|---|---|
| ClusterIP | 默认类型,仅集群内部访问 | 微服务间通信 |
| NodePort | 在每个节点上开放端口映射 | 本地开发、简单外部访问 |
| LoadBalancer | 使用云提供商的负载均衡器 | 生产环境外部流量 |
| ExternalName | 将外部服务引入集群内部 | 访问集群外数据库 |
5.3 工作原理
Service 通过 Label Selector(标签选择器)选择一组 Pod 作为后端,流量通过 kube-proxy 转发。
Client → Service(ClusterIP) → kube-proxy(iptables/IPVS) → Pod6. Ingress
管理从集群外部访问集群内部服务的入口和路由规则。
6.1 能力
| 功能 | 说明 |
|---|---|
| URL 路由 | 根据域名/路径转发到不同 Service |
| 负载均衡 | 分发流量到多个后端 Pod |
| TLS/SSL 终止 | 配置 HTTPS 证书 |
| 流量分割 | 按权重分发到不同版本(金丝雀发布) |
| 虚拟托管 | 基于域名的多站点托管 |
6.2 Ingress 与 Service 的关系
外部请求 → Ingress(匹配规则)→ Service → Pod🚨 注意:Ingress 只适用于 HTTP/HTTPS 流量。其他协议需用 NodePort 或 LoadBalancer 类型的 Service。
7. ConfigMap
将配置信息封装为 K8s 对象,实现配置与镜像解耦。
| 特性 | 说明 |
|---|---|
| 存储形式 | 键值对,支持单值或文件内容 |
| 使用方式 | 环境变量、命令行参数、存储卷挂载 |
| 修改生效 | 修改后需重启 Pod 或应用需支持热加载 |
🚨 安全警告:ConfigMap 以明文存储,绝不放置敏感数据。
🚨 容量限制:单个 ConfigMap 不可超过 1 MiB。超出建议使用独立存储卷或文件服务。
8. Secret
与 ConfigMap 类似,但专门存储敏感数据。
| 特性 | 说明 |
|---|---|
| 编码 | 数据以 Base64 编码存储(⚠️ 不是加密) |
| 类型 | Opaque(通用)、dockerconfigjson(镜像仓库凭证)、tls(TLS 证书)等 |
| 使用方式 | 环境变量、存储卷挂载 |
🚨 重要:Base64 是编码而非加密,任何人都可以解码。生产环境需结合 K8s RBAC、静态加密(Encryption at Rest)和外部密钥管理(如 Vault)确保安全。
🚨 注意:以环境变量方式引用的 Secret,修改后不会自动刷新,需要重启 Pod。
9. Deployment
管理无状态应用的控制器,提供副本控制、滚动更新、回滚等能力。
9.1 核心能力
| 能力 | 说明 |
|---|---|
| 副本控制 | 维护指定数量的 Pod 副本,宕机自动补位 |
| 滚动更新 | 逐步替换旧版本 Pod,保证服务不中断 |
| 版本回滚 | 记录历史版本,快速回退到任意版本 |
| 扩缩容 | 手动或自动(HPA)调整副本数 |
9.2 层级关系
Deployment → ReplicaSet → PodDeployment 是对 ReplicaSet 的更高级抽象,通常不直接操作 ReplicaSet。
10. StatefulSet
管理有状态应用的控制器(如数据库、消息队列等需要持久化标识的服务)。
10.1 与 Deployment 的区别
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀(如 nginx-5d4f8b6c7-x9k2m) |
有序编号(如 mysql-0, mysql-1) |
| 启动/停止顺序 | 并行 | 顺序进行(0→1→2 / 2→1→0) |
| 网络标识 | 无稳定标识 | 稳定的 DNS 名称 |
| 存储 | 共享 PVC 或无存储 | 每个 Pod 独立 PVC |
| 典型应用 | Web 应用、API 服务 | 数据库、缓存、消息队列 |
💡 最佳实践:不是所有有状态应用都适合 StatefulSet。对于某些复杂的有状态服务(如大型数据库集群),更推荐将其从 K8s 中抽离出来单独管理。
11. DaemonSet
确保每个节点上运行一个 Pod 副本。节点加入集群时自动创建,节点移除时自动回收。
| 典型用途 | 示例 |
|---|---|
| 日志收集 | Fluentd、Filebeat(每个节点收集容器日志) |
| 监控代理 | Node Exporter、Datadog Agent |
| 存储守护 | Ceph、GlusterFS 的存储代理 |
| 网络插件 | Calico、Flannel、Weave Net(每个节点运行网络代理) |
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluentd:latest与 Deployment 的区别:Deployment 按副本数调度到任意节点,DaemonSet 保证每个节点都有一个。
12. Job
创建一个或多个 Pod 执行一次性任务,任务成功完成后停止。失败可配置重试。
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
spec:
backoffLimit: 4 # 失败重试次数
completions: 1 # 成功完成的 Pod 数
parallelism: 1 # 并行运行的 Pod 数
template:
spec:
restartPolicy: Never # Job 必须用 Never 或 OnFailure
containers:
- name: migrate
image: myapp:migrate
command: ["./migrate.sh"]| 参数 | 说明 | 默认值 |
|---|---|---|
backoffLimit |
失败重试次数上限 | 6 |
completions |
需要成功完成的 Pod 数 | 1 |
parallelism |
并行运行的最大 Pod 数 | 1 |
activeDeadlineSeconds |
Job 运行超时时间 | 无限制 |
ttlSecondsAfterFinished |
完成后多久自动删除 | 不自动删除 |
常用命令:
kubectl create job my-job --image=busybox -- /bin/sh -c "echo done"
kubectl get job
kubectl logs job/my-job # 查看 Job 日志
kubectl delete job my-job13. CronJob
按 Cron 表达式定时创建 Job。
apiVersion: batch/v1
kind: CronJob
metadata:
name: db-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点
concurrencyPolicy: Forbid # 禁止并发执行
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: mysql:8.0
command:
- /bin/sh
- -c
- mysqldump -h db -u root -p$PASS mydb > /backup/db.sql| 参数 | 说明 | 默认值 |
|---|---|---|
schedule |
Cron 表达式(分 时 日 月 周) | 必填 |
concurrencyPolicy |
Allow(允许并发)/ Forbid / Replace |
Allow |
startingDeadlineSeconds |
启动延迟超过此值则跳过 | 无限制 |
suspend |
暂停定时任务 | false |
🚨 注意:CronJob 会创建 Job,Job 会创建 Pod。大量 CronJob 可能产生大量完成的 Job 和 Pod 残留,务必设置历史限制或 TTL 自动清理。
14. 探针(Probes)
Kubelet 使用探针检测容器的健康状态,是生产环境必不可少的配置。
14.1 三种探针
| 探针 | 作用 | 失败后果 |
|---|---|---|
| Liveness Probe | 检测容器是否存活 | 重启容器 |
| Readiness Probe | 检测容器是否就绪接收流量 | 从 Service Endpoints 移除 |
| Startup Probe | 检测容器是否启动完成 | 启动期间禁用 Liveness 和 Readiness |
14.2 检测方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| exec | 在容器内执行命令,返回 0 为成功 | 最灵活 |
| httpGet | HTTP GET 请求,2xx/3xx 为成功 | Web 服务 |
| tcpSocket | TCP 端口是否可连接 | 数据库、缓存 |
| grpc | gRPC 健康检查(1.24+) | gRPC 服务 |
14.3 配置示例
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
# 启动探针:给应用充足的启动时间
startupProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 30 # 最多 30 次失败 ≈ 5 分钟启动窗口
# 存活探针:检测应用是否卡死
livenessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 15
timeoutSeconds: 3
failureThreshold: 3 # 连续 3 次失败 → 重启
# 就绪探针:检测是否可以接流量
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3| 通用参数 | 说明 | 默认值 |
|---|---|---|
initialDelaySeconds |
首次探测延迟 | 0 |
periodSeconds |
探测间隔 | 10 |
timeoutSeconds |
探测超时 | 1 |
successThreshold |
成功次数阈值 | 1 |
failureThreshold |
失败次数阈值 | 3 |
💡 最佳实践:
- 慢启动应用务必配置 Startup Probe,避免 Liveness Probe 过早杀死容器
- Liveness Probe 应检查应用是否死锁/卡死,不要检查外部依赖(DB/Redis)——否则外部故障会导致容器循环重启
- Readiness Probe 可检查外部依赖,因为影响的是是否接流量而非是否重启
- 生产环境每个容器都必须配置 Liveness + Readiness
15. 资源命名约定
| 资源 | 缩写 | Kind(YAML) |
|---|---|---|
| namespaces | ns | Namespace |
| nodes | no | Node |
| pods | po | Pod |
| services | svc | Service |
| deployments | deploy | Deployment |
| replicasets | rs | ReplicaSet |
| statefulsets | sts | StatefulSet |
| configmaps | cm | ConfigMap |
| persistentvolumes | pv | PersistentVolume |
| persistentvolumeclaims | pvc | PersistentVolumeClaim |
| ingresses | ing | Ingress |