第四阶段:Kubernetes(容器编排)·存储抽象

PV(PersistentVolume)

  • 概念:集群级别的存储资源抽象,由管理员预先提供或通过 StorageClass 动态创建。
  • 实现:PV 代表某种后端存储(NFS、Ceph、云盘),包含容量、访问模式和回收策略。

PVC(PersistentVolumeClaim)

  • 概念:用户对存储资源的请求,Pod 通过 PVC 使用存储。
  • 实现:PVC 指定所需容量和访问模式,PV 控制器会寻找匹配的 PV 并绑定。绑定后 PVC 成为 PV 的唯一所有者。

StorageClass

  • 概念:动态供应存储的模板,定义卷插件类型及参数。
  • 实现:当 Pod 引用的 PVC 未绑定到现有 PV 且 StorageClass 有 provisioner(如 kubernetes.io/aws-ebs),provisioner 会自动创建新存储资源并生成 PV。

第四阶段:Kubernetes(容器编排)·安全机制

RBAC(基于角色的访问控制)

  • 概念:通过 Role(namespace 范围)或 ClusterRole(集群范围)定义权限(verbs + resources),再通过 RoleBinding/ClusterRoleBinding 将角色授予用户、Group 或 ServiceAccount。
  • 实现:API Server 在请求处理前检查访问者的身份(认证阶段)和授权(RBAC 鉴权模块),查看是否有匹配的 RoleBinding。

ServiceAccount

  • 概念:Pod 使用的身份标识,对应一个 Secret(Token)挂载到 Pod 内。
  • 实现:Pod 在创建时自动挂载 ServiceAccount 的 JWT Token,Pod 内应用可使用该 Token 访问 API Server。

PodSecurityPolicy(已废弃)及其替代 Pod Security Admission

  • 概念:Pod 运行时安全策略,如禁止特权容器、限制 root 权限、只读根文件系统等。
  • 实现:PSA 利用命名空间标签(pod-security.kubernetes.io/enforce)设置三个级别,API Server 在 Pod 创建或更新时根据策略校验 Pod Spec。

NetworkPolicy

  • 概念:Pod 之间或 Pod 与外部的网络访问控制规则。
  • 实现:需要网络插件支持(Calico、Cilium、Weave 等)。插件根据 NetworkPolicy 资源生成 iptables 规则或 eBPF 程序,在节点上根据 Pod 标签和 ipBlock 过滤流量。

第四阶段:Kubernetes(容器编排)·核心概念全景

Pod

  • 概念:一组共享存储和网络资源的容器,是 Kubernetes 的最小部署单元。
  • 实现:Pod 内的容器共享同一个 netns(localhost 通信)、IPC namespace 和 volume。Pod 由 kubelet 通过调用容器运行时(如 containerd)创建,并设置 pause 容器(基础架构容器)持有 netns。

控制器

Deployment

  • 概念:管理无状态应用的期望副本数、滚动更新和回滚。
  • 实现:Deployment 控制器在控制循环中管理 ReplicaSet(下一级控制器),每个 ReplicaSet 记录一个版本的 Pod 模板。滚动更新时创建新 ReplicaSet,逐步提升其副本数并缩减旧 ReplicaSet。

StatefulSet

  • 概念:管理有状态应用,提供稳定的网络标识(Pod 名称固定)和有序部署/伸缩。
  • 实现:StatefulSet 控制器为每个 Pod 分配序号(0..N-1),并按顺序启停。PVC(持久卷声明)模板自动为每个 Pod 创建对应存储。

DaemonSet

  • 概念:确保每个节点(或符合条件的节点)运行一个 Pod 副本。
  • 实现:DaemonSet 控制器监听节点添加/删除事件,使用 NodeAffinity 和 Pod 的 spec.nodeName 调度,由节点上的 kubelet 启动 Pod。

Service

  • 概念:为一组 Pod 提供稳定的虚拟 IP 和负载均衡。
  • 实现
    • ClusterIP:集群内部虚拟 IP,通过 kube-proxy(iptables 或 IPVS 模式)实现转发。kube-proxy 在每个节点上监听 API Server,创建 iptables 规则,将 Service IP 的访问随机或轮询地指向后端 Pod IP。
    • NodePort:在 ClusterIP 基础上,在每个节点打开一个固定端口(30000-32767),流量经 NodePort 转发到 Service。
    • LoadBalancer:对接云厂商负载均衡器,自动创建外部负载均衡并将流量指向 NodePort。

Ingress

  • 概念:七层(HTTP/HTTPS)路由规则,将外部请求转发到集群内 Service。
  • 实现:需要部署 Ingress Controller(如 Nginx Ingress Controller)。Controller 监听 Ingress 资源变化,动态更新自身配置文件(如 Nginx 的 server 块),并通过 Pod 的服务地址进行路由。

第四阶段:Kubernetes(容器编排)·网络模型与实现

CNI 插件

  • 概念:容器网络接口,Kubernetes 通过 CNI 配置 Pod 网络。
  • 实现:kubelet 在创建 Pod 时调用 CNI 可执行文件(如 Calico、Flannel),传递 JSON 配置。插件负责分配 IP、创建 veth 对、设置路由及网络策略。
    • Flannel:提供简单 Overlay 网络(VXLAN/host-gw),节点间通过隧道或直接路由转发 Pod 网络。
    • Calico:基于 BGP 的三层路由方案,同时支持 NetworkPolicy 以 iptables 或 eBPF 实现。

Service 网络实现

  • iptables 模式:Service 的每个端口生成若干 iptables 规则(PREROUTING、OUTPUT 等),随机或轮询选后端 Pod IP。
  • IPVS 模式:使用 Linux 内核 IPVS 模块,支持更多负载均衡算法(rr、wrr、lc、sh 等),性能优于 iptables。

Ingress Controller 实现

以 Pod 形式运行,监听 Ingress 资源,生成负载均衡器配置(如 Nginx 的 nginx.conf),并将外部流量代理到对应 Service。通常作为 NodePort 或 LoadBalancer 类型暴露。

第四阶段:Kubernetes(容器编排)·调度与部署策略

调度机制

NodeSelector

简单节点选择,Pod 的 .spec.nodeSelector 匹配节点标签。

亲和性与反亲和性

  • 概念:用更复杂的表达式(In/NotIn/Exists)定义软/硬约束,如 Pod 间亲和(同一拓扑域)或反亲和(互斥)。
  • 实现:调度器在预选阶段根据节点标签及已有 Pod 拓扑信息过滤节点,在优选阶段打分。

污点与容忍

  • 概念:节点可标记污点(Key=Value:Effect),Effect 包括 NoSchedule(不调度)、PreferNoSchedule(尽量不调)、NoExecute(驱逐已有 Pod)。Pod 通过 tolerations 声明可容忍的污点。
  • 实现:调度器检查节点污点与 Pod 容忍度是否匹配;NoExecute 污点添加后,taint manager 会驱逐不匹配的 Pod。

部署策略

滚动更新

  • 概念:逐步用新版本 Pod 替换旧版本,保证服务不中断。
  • 实现:Deployment 控制器通过 maxSurge 和 maxUnavailable 参数控制更新速率,创建新 ReplicaSet 并调整副本比例。

回滚

Deployment 保留历史 ReplicaSet,回滚时选择目标版本 ReplicaSet 并反向调整副本数。

HPA(水平自动扩缩)

  • 概念:根据 CPU、内存或自定义指标动态调整 Deployment/ReplicaSet 副本数。
  • 实现:HPA 控制器定期(默认 15 秒)从 Metrics Server(或自定义 API)获取指标,计算所需副本数(公式:期望副本数 = 当前副本数 × (当前指标值/期望指标值)),并更新 scale 子资源。

第四阶段:Kubernetes(容器编排)·资源管理

声明式 YAML

  • 概念:通过 YAML 或 JSON 文件描述资源的期望状态,Kubernetes 持续调谐实际状态以匹配期望。
  • 实现:API Server 接收并验证 YAML,将其存储到 etcd。各控制器从 API Server Watch 资源变化,执行调谐逻辑。

kubectl 与 API

  • 概念:命令行工具通过 API Server 的 RESTful 接口进行 CRUD 操作。
  • 实现:kubectl 读取 kubeconfig 获取集群 API 地址和认证凭据,发送 HTTP 请求(JSON 或 Protobuf)。

Namespace

  • 概念:逻辑隔离的多租户环境,资源名称在同一 Namespace 内唯一。
  • 实现:API Server 在处理请求时根据 Namespace 字段过滤资源,etcd 中的资源 key 包含 Namespace 前缀。RBAC 和 NetworkPolicy 可基于 Namespace 做访问控制。

第四阶段:Kubernetes(容器编排)·配置与密文

ConfigMap

  • 概念:存储非敏感的配置数据(键值对或文件)。
  • 实现:ConfigMap 作为 etcd 中的资源,Pod 可通过环境变量(将数据注入进程环境)或 Volume(挂载为文件或目录)方式获取配置。当 Volume 方式使用时,kubelet 会自动同步更新内容。

Secret

  • 概念:存储敏感数据(如密码、Token、SSH 密钥),默认 Base64 编码,支持加密存储。
  • 实现:Secret 在 etcd 中可开启静态加密(通过 kube-apiserver 的 encryption provider)。Pod 挂载 Secret 为 Volume 时会创建 tmpfs(内存文件系统),避免写入磁盘。

第一阶段:容器基础·OCI 标准概述

OCI 标准

  • 概念:Open Container Initiative 制定的开放标准,确保容器运行时和镜像格式的互操作性。
  • 核心规范
    • 镜像规范(image-spec):定义容器镜像的清单、索引、层文件系统及配置的 JSON 格式。镜像由一组只读层(tar 归档)和元数据组成,支持内容寻址存储。
    • 运行时规范(runtime-spec):定义容器配置(如 rootfs 路径、挂载点、命名空间、cgroups 参数)和生命周期操作(创建、启动、停止、删除)。
  • 实现生态
    • runc:OCI 的参考实现,基于 libcontainer,直接与内核交互创建容器。
    • containerd:高级运行时,管理容器生命周期、镜像传输、存储及执行(调用 runc)。
    • CRI-O:为 Kubernetes CRI 接口实现的轻量级运行时,直接运行 OCI 容器。
    • 其他实现:gVisor(用户态内核)、Kata Containers(轻量虚拟机)。

容器云学习路径

学习容器云通常建议按“容器基础 → Docker → Kubernetes ”的顺序推进。


1. 第一阶段:容器基础

  • 容器核心概念:理解容器与虚拟机的区别,掌握 Namespace(资源隔离)和 Cgroups(资源限制)的原理,这是容器的底层支撑。
  • OCI 标准:了解 Open Container Initiative 定义的运行时和镜像规范,Docker 和 Kubernetes 都遵循此标准。

2. 第二阶段:Docker(容器引擎入门)

  • Docker 架构:客户端、守护进程、镜像、容器、仓库之间的关系。
  • 镜像管理:Dockerfile 编写、镜像分层构建、多阶段构建、标签管理。
  • 容器生命周期:run/start/stop/rm、进入容器、日志查看、资源限制(–cpu/–memory)。
  • 数据持久化:Volume 和 Bind Mount 的使用场景与区别。
  • 网络模型:bridge、host、none、container 模式,以及端口映射。
  • 多容器编排入门:Docker Compose 定义多服务(如 Web + Redis),了解服务依赖与网络互通。
  • Docker Hub、私有仓库(如 Harbor)的推送与拉取.
    • Docker Hub:一个免费的官方容器镜像仓库,用户可以上传、分享、拉取和管理容器镜像。
    • 轩辕镜像:轩辕镜像专注公共仓库场景,整合 Docker Hub、Google Container Registry、Kubernetes 官方仓库等主流镜像源,为开发者提供镜像访问支持服务。

3. 第三阶段:Docker的实际应用(动手部署项目)

  1. 动手安装 Docker Engine, 演示视频
  2. 部署一个简单的 Web 应用(如使用Docker部署 Nginx),理解容器化部署的基本流程。
    • 理解docker run命令的参数,包括镜像名称、端口映射、环境变量、卷挂载等。
  3. 在本地构建一个简单的 Docker 镜像(如基于 Nginx 的镜像),理解镜像构建的基本流程。
    • 理解Dockerfile的基本语法,包括指令、指令顺序、工作目录、环境变量、复制文件等。

4. 第四阶段:Kubernetes(容器编排)

  • 核心概念:Pod(最小调度单位)、控制器(Deployment/StatefulSet/DaemonSet)、Service(服务发现与负载均衡)、Ingress(七层路由)。
  • 资源管理:声明式 YAML、kubectl 常用命令、Namespace 隔离。
  • 调度与部署:NodeSelector、亲和性反亲和性、污点与容忍;滚动更新、回滚、HPA(水平自动扩缩)。
  • 配置与密文:ConfigMap 和 Secret 的注入(环境变量/Volume)。
  • 存储抽象:PV(持久卷)、PVC(声明)、StorageClass 动态供应。
  • 网络模型与实现:CNI 插件(Calico/Flannel)、Service 的 ClusterIP/NodePort/LoadBalancer 类型、Ingress Controller。
  • 可观测性:资源监控(Metrics Server)、日志收集(如 EFK)、常见排查命令(describe/logs/exec)。
  • 安全基础:RBAC(角色/ServiceAccount/ClusterRole)、PodSecurityPolicy(或 Pod Security Admission)、NetworkPolicy。

5. 第五阶段:Kubernetes的实际应用(动手部署项目)

  • Kubernetes 部署项目概念与实现:理解 Kubernetes 部署项目的基本流程,包括资源定义、控制器、服务、存储、网络、可观测性、安全等。
  • Kubernetes 部署项目实践:实际部署一个简单的 Web 应用(如 Nginx),理解容器化部署的基本流程。

第一阶段:容器基础·容器与虚拟机的区别

容器与虚拟机的区别

  • 虚拟机:通过 Hypervisor 模拟完整硬件,每个虚拟机包含独立的 Guest 操作系统,资源开销大,启动慢。
  • 容器:共享宿主机操作系统内核,通过操作系统级虚拟化实现进程隔离,资源占用小,启动快。

Namespace(资源隔离)

  • 概念:Linux 内核提供的机制,使一组进程看到独立的系统资源视图。
  • 实现:为每个容器创建独立的 Namespace 实例,内核在访问资源时根据进程所属的 Namespace 进行映射。
    • PID Namespace:隔离进程 ID 空间,容器内进程 PID 从 1 开始,宿主机上实际为其他值。
    • NET Namespace:隔离网络栈(网卡、路由表、端口、套接字)。
    • MNT Namespace:隔离文件系统挂载点,容器拥有独立的根文件系统视图。
    • UTS Namespace:隔离主机名和域名。
    • IPC Namespace:隔离进程间通信资源(如信号量、消息队列)。
    • USER Namespace:隔离用户 ID,允许容器内 root 映射为宿主机非特权用户。

Cgroups(资源限制)

  • 概念:Linux 内核功能,将进程分组并对组内进程使用的资源(CPU、内存、磁盘 IO 等)进行统计、限制和优先级分配。
  • 实现:通过虚拟文件系统(通常挂载于 /sys/fs/cgroup/)操作控制组。
    • cpu 子系统:使用 CFS(完全公平调度器)配额和周期限制 CPU 时间;或使用 cpuset 绑定特定 CPU 核心。
    • memory 子系统:限制内存使用量,超出时触发 OOM Killer。
    • blkio 子系统:限制块设备读写速率。
    • pids 子系统:限制进程总数。
  • 典型流程:容器运行时为每个容器创建控制组目录,写入限制值,然后将容器进程 PID 加入该组。
0%