Kubernetes 基础
云时代的操作系统。理解 Master-Worker 架构与核心组件、声明式 API、Pod 生命周期与探针、Service 三种类型、Deployment 滚动更新与 HPA。
🎯学习目标
- 掌握 Kubernetes 的 Master-Worker 架构与各核心组件职责;
- 理解声明式 API(期望状态)与 YAML 四大必填字段;
- 掌握 Pod 概念、共享机制、生命周期与三类探针;
- 掌握 Service 三种类型(ClusterIP / NodePort / LoadBalancer)与 DNS 服务发现;
- 理解 Deployment 维持副本数、滚动更新、版本回滚与 HPA 自动扩缩;
- 熟悉常用 kubectl 命令。
1K8s 定义与整体架构 ⭐
Kubernetes(K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理,被誉为"云时代的操作系统"。采用经典的主从架构(Master-Slave / Master-Worker)。
2控制平面核心组件(Master)
| 组件 | 角色 | 职责 |
|---|---|---|
| kube-apiserver | 入口 / 大脑 | 唯一入口(所有组件只和它通信);无状态可水平扩展;负责认证、授权、准入控制、API 注册 |
| etcd | 记忆 / 存储 | 分布式键值数据库,保存集群所有状态;基于 Raft 协议,通常奇数部署(3 或 5 个);只有 API Server 能直接访问 |
| kube-controller-manager | 决策者 | 控制循环(Control Loop):不断比较"期望状态 vs 实际状态",if current != desired then fix_it();含节点、副本、Service 等控制器 |
| kube-scheduler | 调度器 | 给新 Pod 找最合适节点。两步走:预选(Filtering,排除资源不足节点)→ 优选(Scoring,按亲和性/负载打分) |
3工作节点核心组件(Worker)
| 组件 | 角色 | 职责 |
|---|---|---|
| kubelet | 节点管家 | 每个节点的代理,接收 API Server 指令,管理 Pod 生命周期,调用 CRI(容器运行时接口)启动容器 |
| kube-proxy | 网络代理 | 维护节点网络规则(iptables / IPVS),实现 Service 的负载均衡和流量转发 |
| Container Runtime | 运行时 | 真正运行容器的软件:containerd、CRI-O(Docker 已被垫片化) |
4声明式 API 与 Namespace
K8s 核心思想:一切皆对象(Everything is an Object),通过 YAML 文件描述期望状态(Desired State),系统自动维护实际状态向期望状态收敛。
YAML 四大金刚(必填字段)
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata: # 元数据(名称、标签)
name: my-pod
labels:
app: web
spec: # 规格(最关键!)
containers: ... # 用户期望的具体配置
逻辑隔离:Namespace
Namespace 是在同一物理集群中逻辑上划分出的独立空间(虚拟集群),作用:资源隔离、权限控制、避免命名冲突。
| 名称 | 用途 |
|---|---|
| default | 默认工作区 |
| kube-system | K8s 系统组件(切勿随意修改) |
| dev / prod | 用户自定义:开发 / 生产环境 |
5Pod:最小调度单元 ⭐
为什么不直接管理容器?容器之间往往需要紧密协作(如日志收集、代理)。Pod 提供共享环境,简化协作,是 K8s 最小调度单元。
Pod 的两大共享机制
- 共享网络(Network Namespace):Pod 内所有容器共用一个 IP,容器间通过
localhost通信。 - 共享存储(Shared Volume):容器间通过挂载同一个 Volume 交换文件。
Pod YAML 关键配置(资源配额)
spec:
containers:
- name: web
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests: # 调度依据(节点最少要有这么多资源)
cpu: "250m"
memory: "64Mi"
limits: # 运行上限
cpu: "500m"
memory: "128Mi"
Requests:节点最少要有这么多资源 Pod 才能调度上去;Limits:容器用超了会被限流(CPU)或杀掉(Memory OOM)。
Pod 生命周期
- Pending:等待调度或拉取镜像;Running:容器已启动;Succeeded/Failed:任务结束或异常退出;Unknown:与节点失联。
- Init Containers:主容器启动前执行,用于初始化配置、等待数据库就绪;必须按序成功执行完,主容器才会启动。
6探针(Probes)与 QoS 等级
三类探针:K8s 如何知道应用"活着"?
不能只看进程 PID,要看服务是否正常响应。
| 探针类型 | 作用 | 失败后果 |
|---|---|---|
| Liveness(存活) | 存活检测(如死锁) | 重启容器 |
| Readiness(就绪) | 就绪检测(如启动中) | 切断流量(从 Service 移除) |
| Startup(启动) | 启动检测(针对慢启动应用) | 抑制其他探针 |
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15 # 启动后等 15 秒再查
Pod QoS(服务质量)三等
| 等级 | 资源配置 | 待遇 |
|---|---|---|
| Guaranteed(头等舱) | request == limit | 最后被驱逐,最稳定 |
| Burstable(商务舱) | request < limit | 资源紧张时可能被驱逐 |
| BestEffort(经济舱) | 未设置资源限制 | 节点缺资源时第一个被杀 |
7Service:服务发现与负载均衡 ⭐
Pod 是短暂的,重启后 IP 会变。Service 提供一个 VIP(虚拟 IP),屏蔽后端动态变化,通过标签选择器(Labels & Selectors)找到后端 Pod。
apiVersion: v1
kind: Service
spec:
selector:
app: backend # 寻找标签为 app=backend 的 Pod
ports:
- port: 80 # Service 暴露端口
targetPort: 8080 # 容器实际端口
三种常用类型
| 类型 | 访问范围 | 说明 |
|---|---|---|
| ClusterIP(默认) | 仅集群内 | 适用于数据库、内部微服务 |
| NodePort | 外部 | 每个 Node 开一个端口(30000~32767),外部访问 NodeIP:NodePort |
| LoadBalancer | 外部 | 申请云厂商(AWS/阿里云)的硬件负载均衡器,外部访问 LB 公网 IP |
DNS 服务发现
K8s 集群内置 CoreDNS,Pod 可通过域名直接访问 Service,无需记 IP。域名格式:<service>.<namespace>.svc.cluster.local。例:服务名 redis、命名空间 default,访问地址为 redis.default 或简写 redis。
Ingress:七层路由入口
Service(L4)只能基于 IP/Port 转发;Ingress(L7)可基于域名(Host)和路径(Path)转发。优势:节省公网 IP(一个 IP 代理多个服务)、支持 SSL/TLS 终止。
8Deployment 与滚动更新
Deployment 是无状态应用管家,核心功能:① 维持副本数(声明 3 个就永远保持 3 个);② 滚动更新(平滑升级不中断服务);③ 版本回滚(一键回到过去)。用户通常只操作 Deployment,不直接操作 ReplicaSet。
滚动更新(Rolling Update)
"先起新、后停旧",逐步替换,确保服务始终可用。关键参数:
- maxSurge:允许比期望多几个(如多跑 1 个新版本);
- maxUnavailable:允许比期望少几个(如不允许任何 Pod 挂掉)。
# 回滚到上一个版本
kubectl rollout undo deployment/web
# 手动扩容到 10 个副本
kubectl scale deployment/web --replicas=10
9HPA 与 kubectl 常用命令
HPA:水平自动扩缩容
根据 CPU / 内存利用率,自动调整 Pod 数量。例:指标 CPU > 70% 则扩容,范围 Min 2 ~ Max 10。
kubectl 常用命令速查
| 类别 | 命令 | 作用 |
|---|---|---|
| 调试 | kubectl describe pod <name> | 查看详情/报错原因(最常用) |
kubectl logs <name> | 查看容器日志 | |
kubectl exec -it <name> -- sh | 进入容器内部 | |
| 增删改查 | kubectl apply -f xx.yaml | 声明式创建/更新(推荐) |
kubectl get pods,svc,deploy | 查看资源 | |
kubectl delete -f xx.yaml | 删除资源 |
# Python 操作 K8s(运维平台开发)
from kubernetes import client, config
config.load_kube_config() # 加载本地 ~/.kube/config
apps = client.AppsV1Api() # 管理 Deployment
core = client.CoreV1Api() # 管理 Pod/Service
apps.create_namespaced_deployment(namespace="default", body=deployment)
⭐重点例题
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-nginx
spec:
replicas: 3 # 维持 3 个副本
selector:
matchLabels:
app: demo-nginx
template:
metadata:
labels:
app: demo-nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
关键:selector.matchLabels 必须与 template.metadata.labels 一致,Deployment 才能管到这些 Pod。
kubectl describe pod <name> 看事件。常见原因:① 资源不足(节点 CPU/内存不够满足 requests);② 调度约束(nodeSelector/亲和性无匹配节点);③ 污点(Taint)未被容忍。若需 10G 内存但最大节点只有 8G,则永远 Pending。
🎯自测(点击展开)
K8s 集群中唯一的入口组件是什么?
etcd 为什么通常奇数部署?
Pod 内多个容器如何通信和共享数据?
Liveness 和 Readiness 探针失败的后果有何不同?
Service 三种类型分别用于什么场景?
Deployment 滚动更新的核心思想是什么?
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。