K8s 核心概念
核心定义 Kubernetes 是面向容器化应用的集群编排系统,通过声明式 API、控制器调谐、调度器、Service 网络和存储抽象,实现应用部署、扩缩容、服务发现、滚动更新和故障自愈。
1. Kubernetes 的整体工作方式
Kubernetes 的核心思想是“声明期望状态,由控制器持续调谐实际状态”。用户通过 YAML 或 API 提交资源对象,控制面组件负责保存状态、调度 Pod、创建副本、维护网络入口,并在资源异常时自动修复。
用户提交 YAML / kubectl / API
↓
kube-apiserver 接收并校验
↓
etcd 保存期望状态
↓
controller-manager 调谐资源
↓
scheduler 为 Pod 选择节点
↓
kubelet 在节点上启动容器
Kubernetes 中的多数对象都围绕两个问题展开:
- 应用如何运行:Pod、Deployment、StatefulSet、DaemonSet、Job。
- 应用如何被访问和支撑:Service、Ingress、ConfigMap、Secret、PV、PVC、StorageClass。
2. 控制面组件
控制面负责维护集群状态和编排决策。
| 组件 | 作用 | 重要程度 |
|---|---|---|
kube-apiserver | 集群 API 入口,负责认证、鉴权、准入、资源读写 | ⭐⭐⭐⭐⭐ |
etcd | 分布式键值存储,保存集群全部状态 | ⭐⭐⭐⭐⭐ |
kube-controller-manager | 运行 Deployment、Node、Job 等控制器 | ⭐⭐⭐⭐ |
kube-scheduler | 为未调度 Pod 选择合适节点 | ⭐⭐⭐⭐ |
cloud-controller-manager | 对接云厂商负载均衡、节点和路由能力 | ⭐⭐⭐ |
API Server 是有状态还是无状态?
kube-apiserver自身通常按无状态组件设计,集群状态持久化在etcd中。因此 API Server 可以部署多个副本,通过负载均衡实现高可用。
3. 工作节点组件
工作节点负责真正运行 Pod 和容器。
| 组件 | 作用 |
|---|---|
kubelet | 节点代理,监听 Pod 分配结果并管理容器生命周期 |
kube-proxy | 维护 Service 转发规则,实现服务访问转发 |
| 容器运行时 | 通过 CRI 启动容器,例如 containerd、CRI-O |
| CNI 插件 | 提供 Pod 网络,例如 Calico、Cilium、Flannel |
| CSI 插件 | 提供存储挂载与动态卷管理 |
深化阅读 如需理解每个组件的原理、工作流程和面试考点,详见 K8s 组件详解。
4. Pod
Pod 是 Kubernetes 中最小的部署和调度单元。一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间、存储卷和生命周期。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Pod 核心要点:
- Pod 是逻辑主机,容器是其中运行的进程。
- 同一 Pod 内容器共享同一个 IP 和端口空间。
- Pod 通常是临时对象,重建后 IP 可能变化。
- 生产环境一般不直接创建裸 Pod,而是通过 Deployment、StatefulSet、DaemonSet 等控制器管理。
5. Deployment
Deployment 用于声明式管理无状态应用,负责副本数、滚动更新和回滚。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
Deployment、ReplicaSet、Pod 的关系:
Deployment → ReplicaSet → Pod
常见能力:
- 维持期望副本数。
- 滚动更新应用版本。
- 支持快速回滚。
- 通过 selector 管理匹配标签的 Pod。
Deployment 滚动更新的关键参数是什么?
maxSurge表示更新期间允许额外创建的最大 Pod 数;maxUnavailable表示更新期间允许不可用的最大 Pod 数。默认通常是 25%。
6. StatefulSet
StatefulSet 用于管理有状态应用,例如数据库、消息队列和需要稳定网络标识的中间件。
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀,例如 nginx-7d8b9 | 有序编号,例如 mysql-0 |
| 网络标识 | Pod IP 可能变化 | 稳定 DNS 名称 |
| 存储 | 通常共享或无状态 | 每个 Pod 可绑定独立 PVC |
| 启停顺序 | 通常并行 | 按序创建和删除 |
| 适用场景 | Web 服务、无状态应用 | MySQL、ZooKeeper、Kafka 等 |
StatefulSet 常与 Headless Service、PVC 配合使用。
7. DaemonSet
DaemonSet 确保每个符合条件的节点上运行一个 Pod 副本,常用于节点级组件。
典型场景:
- 日志采集 Agent,例如 Fluent Bit。
- 监控 Agent,例如 Node Exporter。
- 网络插件,例如 Calico Node。
- 存储插件的节点组件。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
8. Service
Service 为一组 Pod 提供稳定访问入口,解决 Pod IP 不稳定和负载均衡问题。
| 类型 | 作用 | 访问范围 |
|---|---|---|
ClusterIP | 集群内部虚拟 IP | 仅集群内访问 |
NodePort | 在每个节点暴露端口 | 集群外通过节点 IP 和端口访问 |
LoadBalancer | 对接云厂商负载均衡 | 对公网或内网暴露服务 |
ExternalName | DNS CNAME 映射 | 映射外部域名 |
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
深化阅读
- K8s Service 核心原理:Service、EndpointSlice 与 kube-proxy 转发原理。
- K8s Service DNS 实现原理:CoreDNS 解析流程与 Service DNS 规则。
- kube-proxy 流量转发与代理模式详解:iptables、IPVS 与 eBPF 转发模式。
9. Ingress
Ingress 提供 HTTP/HTTPS 七层入口,根据域名和路径将外部请求转发到不同 Service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
Ingress 本身只是规则对象,实际流量转发需要 Ingress Controller,例如 Nginx Ingress Controller、Traefik 或云厂商 Ingress Controller。
10. ConfigMap 与 Secret
ConfigMap 和 Secret 用于将配置与镜像解耦。
| 对象 | 用途 | 注意事项 |
|---|---|---|
| ConfigMap | 保存普通配置,例如配置文件、环境变量 | 不适合保存敏感信息 |
| Secret | 保存密码、Token、证书等敏感数据 | 默认只是 base64 编码,不等于强加密 |
ConfigMap 示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: info
APP_MODE: prod
Pod 中引用:
envFrom:
- configMapRef:
name: app-config
11. 存储:PV、PVC、StorageClass
Kubernetes 使用 PV、PVC、StorageClass 抽象存储资源。
| 对象 | 作用 |
|---|---|
| PV | 集群中的实际存储资源 |
| PVC | 用户对存储资源的申请 |
| StorageClass | 动态创建 PV 的模板 |
| CSI | 标准化存储插件接口 |
动态供给流程:
用户创建 PVC
↓
PVC 指定 StorageClass
↓
CSI provisioner 创建 PV
↓
PVC 与 PV 绑定
↓
Pod 挂载 PVC
详见 PV & PVC 完整深度详解 和 StorageClass + CSI 动态存储体系。
12. 调度相关概念
调度器负责为未绑定节点的 Pod 选择合适 Node。
常见调度约束:
| 机制 | 作用 |
|---|---|
nodeSelector | 按节点标签选择节点 |
| Node Affinity | 更灵活的节点亲和性规则 |
| Pod Affinity | 让 Pod 尽量靠近某些 Pod |
| Pod Anti-Affinity | 让 Pod 尽量分散到不同节点 |
| Taint / Toleration | 节点排斥与 Pod 容忍机制 |
| TopologySpreadConstraints | 控制 Pod 在拓扑域中的分布 |
调度大致流程:
过滤不满足条件的节点
↓
为可用节点打分
↓
选择得分最高节点
↓
绑定 Pod 到节点
13. 探针与生命周期
Kubernetes 通过探针判断容器状态。
| 探针 | 作用 |
|---|---|
startupProbe | 判断应用是否启动完成 |
readinessProbe | 判断 Pod 是否可以接收流量 |
livenessProbe | 判断容器是否需要重启 |
生命周期钩子:
| 钩子 | 作用 |
|---|---|
postStart | 容器启动后执行 |
preStop | 容器终止前执行 |
探针配置不当会导致服务频繁重启、发布卡住或流量过早进入。详见 K8s 探针机制 和 K8s 生命周期钩子。
14. RBAC 与 ServiceAccount
RBAC 用于控制谁可以对哪些资源执行哪些操作。
| 对象 | 作用 |
|---|---|
| ServiceAccount | Pod 在集群内访问 API Server 的身份 |
| Role | 命名空间级权限规则 |
| ClusterRole | 集群级权限规则 |
| RoleBinding | 在命名空间内绑定权限 |
| ClusterRoleBinding | 在集群范围绑定权限 |
权限检查命令:
kubectl auth can-i get pods --as system:serviceaccount:default:app
15. 常用排查入口
| 场景 | 常用命令 |
|---|---|
| 查看资源 | kubectl get pod,svc,deploy -A |
| 查看详情和事件 | kubectl describe pod <pod> -n <ns> |
| 查看日志 | kubectl logs <pod> -n <ns> |
| 进入容器 | kubectl exec -it <pod> -n <ns> -- sh |
| 查看发布状态 | kubectl rollout status deploy/<name> -n <ns> |
| 查看节点 | kubectl get node -o wide |
常见故障可从 Pod 状态、事件、日志、Service Endpoint、节点资源和控制器状态逐层排查。详见 K8s 全场景常见问题完整排查手册。
关联文档
- K8s 组件详解:理解控制面和节点组件职责。
- K8s Pod 详解:深入理解 Pod 生命周期和状态。
- Deployment 完整深度详解:理解无状态应用发布与回滚。
- K8s Service 核心原理:理解服务发现和流量转发。
- K8s 进阶学习路线:继续扩展 Kubernetes 学习路径。
