🎓 总站 🏠 本课目录 01 概论 02 虚拟化 03 云原生 04 K8s基础 05 K8s进阶 06 消息队列 07 分布式存储 08 分布式文件系统 09 并行编程 10 Spark
云计算技术 · 第4章

Kubernetes 基础

云时代的操作系统。理解 Master-Worker 架构与核心组件、声明式 API、Pod 生命周期与探针、Service 三种类型、Deployment 滚动更新与 HPA。

📚 学习进度
0%

🎯学习目标

  • 掌握 Kubernetes 的 Master-Worker 架构与各核心组件职责;
  • 理解声明式 API(期望状态)与 YAML 四大必填字段;
  • 掌握 Pod 概念、共享机制、生命周期与三类探针;
  • 掌握 Service 三种类型(ClusterIP / NodePort / LoadBalancer)与 DNS 服务发现;
  • 理解 Deployment 维持副本数、滚动更新、版本回滚与 HPA 自动扩缩;
  • 熟悉常用 kubectl 命令。

1K8s 定义与整体架构 ⭐

Kubernetes(K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理,被誉为"云时代的操作系统"。采用经典的主从架构(Master-Slave / Master-Worker)

所有组件只和 API Server 通信 控制平面 Master(大脑) kube-apiserver唯一入口 etcd状态存储 scheduler调度器 controller-manager Worker 节点(手脚) Node 1 kubelet kube-proxy 容器运行时 Pod Pod Node 2 kubelet kube-proxy 容器运行时 Pod Pod
图1 · K8s 集群架构:控制平面负责决策(调度/管理/API),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,按亲和性/负载打分)
💡 为什么 etcd 奇数部署?etcd 基于 Raft 协议选主,需要多数派(quorum)。奇数节点(3/5)在保证容错的同时避免脑裂,3 节点可容忍 1 个故障,5 节点可容忍 2 个。

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-systemK8s 系统组件(切勿随意修改)
dev / prod用户自定义:开发 / 生产环境

5Pod:最小调度单元 ⭐

为什么不直接管理容器?容器之间往往需要紧密协作(如日志收集、代理)。Pod 提供共享环境,简化协作,是 K8s 最小调度单元。

Pod(共享网络+存储) 容器 A 容器 B 共享一个 IP · 共享 Volume 容器间通过 localhost 通信 Service(VIP)标签选择器找 Pod selector
图2 · Pod 共享机制:内部容器共享 IP 与 Volume,通过 localhost 通信;Service 用标签选择器关联后端 Pod

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    # 容器实际端口
Service 三种类型的访问范围(由内到外) ClusterIP仅集群内 NodePortNodeIP:端口 LoadBalancer公网 LB Ingress(L7):一个公网 IP 按域名/路径代理多个 Service
图3 · Service 暴露范围递进:ClusterIP(内)→ NodePort → LoadBalancer(外),Ingress 做七层入口

三种常用类型

类型访问范围说明
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)

重点例题

例题1:写一个最简单的 Deployment YAML 问:部署 3 副本的 nginx,镜像 nginx:1.25。
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。
例题2:Service 四种场景该选哪种类型? 答:① 内部数据库/微服务互调 → ClusterIP(仅集群内);② 开发环境临时对外暴露 → NodePort(NodeIP:端口);③ 生产环境对外服务 → LoadBalancer(云厂商 LB 公网 IP);④ 多服务共享一个公网入口、按域名/路径路由 → Ingress(L7)。
例题3:Pod 一直 Pending 怎么排查? 答:kubectl describe pod <name> 看事件。常见原因:① 资源不足(节点 CPU/内存不够满足 requests);② 调度约束(nodeSelector/亲和性无匹配节点);③ 污点(Taint)未被容忍。若需 10G 内存但最大节点只有 8G,则永远 Pending。

🎯自测(点击展开)

K8s 集群中唯一的入口组件是什么?
kube-apiserver,所有组件(kubectl、node、dashboard)都只和它通信,无状态可水平扩展。
etcd 为什么通常奇数部署?
基于 Raft 协议选主需要多数派(quorum),奇数节点在保证容错的同时避免脑裂,常用 3 或 5 个。
Pod 内多个容器如何通信和共享数据?
共享网络(共用一个 IP,通过 localhost 通信)和共享存储(挂载同一 Volume 交换文件)。
Liveness 和 Readiness 探针失败的后果有何不同?
Liveness 失败重启容器;Readiness 失败切断流量(从 Service 摘除),但不重启。
Service 三种类型分别用于什么场景?
ClusterIP(集群内部)、NodePort(节点端口对外)、LoadBalancer(云厂商 LB 公网对外)。
Deployment 滚动更新的核心思想是什么?
"先起新、后停旧"逐步替换,配合 maxSurge / maxUnavailable 参数,确保服务零停机。

📝强化题库

选择题点选即时判分;填空题输入后"检查"或"显示答案"。

已答 0/0答对 0正确率
已答 0/0答对 0