第四阶段: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 调度与部署策略 | Kubernetes 网络模型与实现 | Kubernetes 存储抽象 | Kubernetes 安全基础 | Kubernetes 可观测性 | 容器云学习路径

第四阶段: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 核心概念全景 | Kubernetes 调度与部署策略 | Kubernetes 安全基础

第四阶段: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 核心概念全景 | Kubernetes 网络模型与实现 | Kubernetes 存储抽象 | Kubernetes 配置与密文 | Kubernetes 资源管理

第四阶段: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 调度与部署策略 | Kubernetes 可观测性

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

ConfigMap

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

Secret

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

🔗 相关文档

Kubernetes 调度与部署策略 | Kubernetes 存储抽象 | Kubernetes 安全基础

第二阶段:Docker(容器引擎入门)·多容器编排

多容器编排入门

  • 概念:通过声明式 YAML 文件定义多容器应用的服务、网络、卷等依赖关系,单命令实现整体启动和停止。
  • 实现
    • Compose 解析 YAML 文件,生成每个服务的容器配置。
    • 自动创建项目专属的桥接网络,服务名解析为容器 IP(通过内部 DNS)。
    • 依赖关系(depends_on)仅控制启动顺序,不保证健康。
    • Compose v3 支持定义多种部署模式(swarm 模式除外,单纯 Compose 是单机编排)。

🔗 相关文档

Docker 网络模型 | Docker 数据持久化 | Docker多容器编排详解

第三阶段:Docker 的实际应用(部署项目概念与实现)·安装与部署 Nginx

安装 Docker Engine 的概览

  • 概念:Docker Engine 是一组软件包,包括 dockerd、containerd、runc 以及客户端。
  • 实现:Linux 版本通过包管理器安装,利用 systemd 管理守护进程。守护进程以 root 权限运行,监听 Unix socket(/var/run/docker.sock),客户端通过该 socket 通信。

部署 Web 应用的基本流程

  • 概念:容器化部署指将应用及依赖打包到镜像,运行容器并对外暴露服务。
  • 实现
    • 镜像拉取:从仓库下载镜像各层,存储到本地内容寻址存储。
    • 容器创建:分配 rootfs(镜像层 + 容器可写层)、网络 netns、IP 地址及 Cgroups 配置。
    • 端口映射:在宿主机 iptables 上添加 DNAT 规则。
    • 卷挂载:通过绑定挂载或 volume 挂载将数据目录映射进容器。

🔗 相关文档

Docker 容器生命周期 | Docker 网络模型 | Docker 数据持久化

第三阶段:Docker 的实际应用(部署项目概念与实现)·构建自定义镜像

本地构建 Docker 镜像

  • 概念:通过 Dockerfile 描述镜像构建步骤,生成可复用的应用镜像。
  • 实现
    • 构建上下文:Docker 将指定目录(或 URL)发送到守护进程。
    • 指令执行:守护进程逐条解析 Dockerfile 指令,每条指令启动临时容器执行(如 RUN),并将结果文件系统提交为新层。
    • 缓存机制:若指令及依赖文件未变更,则复用已有层(避免重复构建)。
    • 多阶段构建:构建器维护多个阶段镜像,最终仅将最后阶段的层导出为结果镜像。

🔗 相关文档

Docker 镜像管理 | Docker镜像仓库详解 | Docker 实际应用:安装与部署 Nginx

第二阶段:Docker(容器引擎入门)·容器生命周期管理

生命周期状态

已创建、运行中、已暂停、已停止、已删除。

实现机制

  • 创建:准备 rootfs、配置 Namespace 和 Cgroups,但不启动进程。
  • 启动:通过 runc 执行容器进程(通常是 init 进程),设置网络和挂载点。
  • 运行:容器进程在隔离环境中运行,守护进程通过 waitptrace 监控状态。
  • 停止:发送 SIGTERM 信号,等待进程退出,若超时则 SIGKILL。然后清理 Namespace 和 Cgroups。
  • 资源限制:通过 Cgroups 在容器启动前或运行时动态设置 CPU、内存、IO 配额。

🔗 相关文档

Docker 架构解析 | Docker 镜像管理 | Docker 网络模型 | Docker 数据持久化

第二阶段:Docker(容器引擎入门)·数据持久化

Volume

  • 概念:Docker 管理的宿主机目录(默认位于 /var/lib/docker/volumes/),独立于容器生命周期。
  • 实现:Volume 以目录形式存在,可通过 docker volume 命令创建和管理。挂载到容器时,实际上是 bind mount 到该目录。Volume 支持驱动程序(如本地、NFS、云存储)实现不同后端。

Bind Mount

  • 概念:将宿主机任意路径直接挂载到容器目录。
  • 实现:通过 Linux 的 mount 系统调用将源路径(宿主机)绑定到目标路径(容器内 mount namespace)。依赖宿主机目录结构,不提供跨主机可移植性。

区别本质

Volume 是 Docker 对 Bind Mount 的封装,增加了命名管理、驱动扩展和备份恢复接口;Bind Mount 是直接利用内核特性。

🔗 相关文档

Docker 容器生命周期 | Docker Compose 多容器编排入门
0%