Skip to content
Kubernetes 核心概念

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) → Pod

6. 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 → Pod

Deployment 是对 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-job

13. 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