Summary
先原理,后应用。
目录:
- 硬件
- Linux 系统
- 虚拟化
- 容器与容器编排
- 配置管理与自动化运维
- CI / CD 与代码管理
- 日志、搜索与分析
- 消息队列与流处理
- 负载均衡与流量调度
- 数据库与数据存储
- 文件传输与数据同步
- 监控与告警
- 发布系统
- 滚动发布
- 蓝绿发布
- 金丝雀发布
总览:从硬件到容器的分层
+-------------------------------------------------------------------+
应用程序 / 服务
MySQL / Nginx / Redis / Java / Python
+-------------------------------------------------------------------+
容器平台 (可选)
Docker / containerd / Podman / Kubernetes
+-------------------------------------------------------------------+
Linux 用户空间:容器运行时
runc
+-------------------------------------------------------------------+
Linux 用户空间:基础组件
shell / libc / systemd / coreutils
+-------------------------------------------------------------------+
Linux 内核空间
- 五大子系统:进程管理 / 内存管理 / 文件系统 / 网络子系统 / 设备与驱动
- 增强机制:Namespaces / cgroups / UnionFS
+-------------------------------------------------------------------+
硬件层
CPU / 内存 / 硬盘 / 网卡
+-------------------------------------------------------------------+
硬件是一切资源的源头。
主要包括:CPU、内存、硬盘、主板、网卡、显卡、阵列卡、电源、机箱
- CPU
- 家用:奔腾,酷睿,核心数少,主频高,缓存小,追求“快”
- 服务器:至强,核心数多,主频低,缓存大,追求“稳 + 并发”
- 虚拟化:家用和服务器CPU现在基本都支持虚拟化
- 内存
- 服务器:支持 ECC 校验 和 多通道
- ECC 是服务器的灵魂(防止内存翻转导致数据库损坏)
- 硬盘
- 家用:SATA接口,7200转,读写速度80M/s左右,
- 服务器:SAS接口,15000转,读写速度150M/s 左右
- SSD:现在基本都支持 NVMe
- 主板
- 家用:一块CPU,2到4根内存,2到4块硬盘
- 服务器:支持更多的CPU、内存、硬盘,支持硬盘热插拔
- 网卡
- 家用:1G
- 服务器:10G
- 显卡
- PCI-E 插槽
- 阵列卡
- RAID:0,1,5,10
- 电源
- 家用:单电源
- 服务器:双电源(冗余)
- 机箱
- 塔式机箱
- 机架式机箱:1U、2U、4U
- 刀片机箱
服务器主机有更好的扩展性和稳定性。
Linux 系统主要由 内核空间 + 用户空间 + 应用程序 组成。
内核空间是资源的“管理者”,是 Linux 系统的根基。
内核空间包括:五大核心子系统
- 进程管理
- 内存管理
- 文件系统
- 网络子系统
- 设备与驱动
负责处理进程的创建、调度、终止以及进程间通信等等。
决定“哪个程序在什么时候用 CPU 跑多久”。
负责管理物理内存和虚拟内存,为每个进程提供独立的虚拟地址空间。
决定“内存怎么分配、怎么回收、怎么映射”。
负责提供对存储设备上数据的组织、存储和访问能力。
统一“文件”这一抽象,让程序不关心底层存储。
常见的文件系统有:xfs、ext4,现在最常用的是 xfs。
负责实现各种网络协议,包括 TCP/IP 协议栈,Socket,Netfilter,使 Linux 能够进行网络通信。
负责“数据包如何进入、处理、发送出系统”。
负责充当硬件与软件之间的接口,是内核与硬件设备通信的桥梁。
Linux 内核
- 通过调度器使用 CPU
- 通过内存管理子系统管理内存
- 通过块层与文件系统访问硬盘
- 通过网络协议栈驱动网卡
实现对硬件资源的统一抽象与高效调度。
不是子系统
目前最常见的三个,也是容器的基石:Namespaces、cgroups、UnionFS
- Namespaces (隔离视图):决定“你看到什么”,隔离对象:PID、网络、挂载、用户
- cgroups (资源限制):决定“你能用多少”,资源:CPU、内存、硬盘、网络
- UnionFS (联合文件系统):文件系统子系统内部机制,文件系统层叠,只读镜像 + 可写层,UnionFS 是 “设计思想”,overlay2 是 “具体实现”
用户空间的几个重要组成:shell,libc,systemd,runc 等等。
shell 负责 用户和内核以及应用程序等之间进行交互,是一个桥梁。
- 本质是一个普通进程,用于 解析命令,管理进程,控制 IO,协调程序运行 等
- 常见的 shell:Bash
libc 负责 系统调用封装,提供标准 C 接口。
- 应用程序 不直接调用内核,而是通过 libc。
- 常见的 libc:glibc 和 musl。
systemd 负责 系统初始化,服务管理,cgroups 管理。
- systemd 不是“启动脚本工具”,是 系统级进程编排器。
runc 负责 把 namespaces、cgroups 等配置,转化为一个真正运行中的 Linux 进程。
- runc 是 容器运行时,Docker、Podman 等等,底层都使用的是 runc。
包括 Docker、Nginx、MySQL、Redis、Java、Python 等。
Linux 系统 = 内核 + 用户空间工具 + 服务管理 + 配置体系
它的核心职责是:
- 管理硬件
- 提供稳定接口
- 支撑应用程序运行
Linux 系统常见的有 RHEL系列 和 Debian系列。
这两个系列最大的区别的是包管理方式不同:RHEL系列使用 RPM 包管理,Debian系列使用 DEB 包管理。
以 MySQL 一次查询 为例:
MySQL 进程
↓
进程调度(CPU 时间片)
↓
内存管理(Buffer Pool / Page Cache)
↓
文件系统(VFS -> ext4 / xfs)
↓
块设备层
↓
设备驱动(NVMe / SATA)
↓
硬件
网络请求则会多走一条:
网卡 -> 驱动 -> 网络栈 -> Socket -> MySQL
基于 硬件 和 Linux 系统之上,有一个重要的概念:虚拟化
虚拟化(Virtualization) 是把一套物理资源(CPU / 内存 / 磁盘 / 网络)抽象成多套逻辑资源,让多套系统或应用相互隔离、同时运行的技术。
在不增加物理机器的前提下,提高资源利用率、隔离性和可管理性。
虚拟化包括:硬件虚拟化、操作系统级虚拟化、网络虚拟化、存储虚拟化
也就是虚拟机
本质:虚拟机通过虚拟化硬件并运行完整操作系统,在同一物理主机上实现强隔离的多系统运行。
每个虚拟机都有自己的内核,资源隔离靠硬件虚拟化
常见应用
- ESXi
- KVM
- XEN
- VirtualBox
- VMware Workstation
也就是容器
本质:通过内核级隔离与资源限制,在共享同一内核的前提下运行彼此隔离的进程环境。
容器化:不虚拟内核,只虚拟“使用方式”
常见应用
- Docker
- Podman
- Kubernetes
把物理网络抽象成逻辑网络
- VLAN
- Kubernetes CNI
多块物理盘 -> 统一逻辑存储池
- LVM
- Ceph
- SAN / NAS
定位:应用容器化运行时,用于构建、打包和运行容器。
Docker = 利用 Linux 内核能力(Namespace + cgroups + UnionFS), 把应用进程“隔离、限制、打包、分发、运行”的一整套工程体系。
Docker 本质是 进程管理 + 文件系统抽象
Docker 解决了什么问题
- 环境一致性
- 部署复杂度
- 资源利用率
容器的三大底层基石:Namespace,cgroups,UnionFS
Namespace —- 隔离
- Linux 内核提供的「资源视图隔离机制」
- 本质:同一内核,不同视角
- Namespace 绑定的是「进程」,Namespace 不是系统级,是 进程属性
- 进程看到的是“自己的”:PID / 网络 / 挂载点 / 主机名 / 用户
- 容器用它:让容器“像一台独立主机”
cgroups —- 资源限制
- Linux 内核的「资源配额与控制系统」
- Namespace:你 能看到什么
- cgroups:你 能用多少
- 限制 CPU / 内存 / IO / PIDs
- 容器 = Namespace + cgroups
- 容器用它:控制每个容器最多能用多少资源
UnionFS —- 文件系统分层
- 是一种“把多个目录(分支)叠加成一个统一视图”的文件系统机制
- UnionFS 把多层目录叠成一层
- 底层:只读镜像层
- 上层:可写层
- 对进程:看起来只有一个目录树
- 容器用它:镜像可复用
- overlay2 是 Linux 原生、高性能的 UnionFS
UnionFS:一类“把多层目录合并成一个视图”的文件系统思想
overlay2:基于 Linux OverlayFS 的 Docker 存储驱动实现
UnionFS 是联合文件系统的统称,overlay2 是 Docker 基于 Linux OverlayFS 实现的 UnionFS 存储驱动,也是当前默认和最推荐的实现。
overlay2 不是一个文件系统,而是 Docker 使用 OverlayFS 的方式。
Docker 四大核心对象
- Image(镜像):应用的模版,只读,不可变,分层
- Container(容器):镜像的运行实例,本质是一个 Linux 进程
- Dockerfile:构建镜像的文件,描述“如何构建镜像”,每条指令 -> 一个镜像层
- Registry:镜像仓库,镜像的分发系统
Docker 网络的四个核心组件
- Network Namespace(网络隔离)
- veth pair(虚拟网线)
- Linux bridge(docker0
- iptables / NAT(地址转换)
默认 bridge 网络
[container] --veth--> [docker0] --NAT--> [eth0] --> Internet
外部 -> 容器(端口映射原理)
Client
↓
宿主机 8080
↓ (DNAT)
容器 80
容器 -> 外部(SNAT
container 172.17.0.2
↓
docker0
↓ (SNAT)
宿主机 IP
↓
Internet
host 网络:与宿主机共用网络栈,容器端口 = 宿主机端口
Dockerfile
FROM 定义基础镜像, 必须是第一条
ARG 构建参数
ENV 环境变量
RUN 构建时执行
COPY/ADD 拷贝文件, 90% 场景用 COPY
WORKDIR 工作目录
CMD 容器启动命令 (docker run 可以覆盖)
ENTRYPOINT 入口点 (固定命令, docker run 不能覆盖)
EXPOSE 声明端口
VOLUME 声明挂载点
USER 用户
可以多阶段构建
定位:无守护进程的容器运行时,兼容 Docker CLI,强调安全性。
定位:容器编排与集群管理平台,负责容器的调度、伸缩与高可用。
Kubernetes 解决的是:容器的自动部署、调度、扩缩容、自愈、网络、存储、升级
+----------------------------+
| 用户 / kubectl |
+-------------+--------------+
|
+-------------v--------------+
| Control Plane |
| apiserver / scheduler |
| controller / etcd |
+-------------+--------------+
|
+-------------v--------------+
| Node |
| kubelet / containerd |
| kube-proxy / CNI |
+----------------------------+
- etcd:保存 集群所有状态
- kube-apiserver:所有请求入口,认证、鉴权、准入,唯一和 etcd 通信的组件
- kube-scheduler:任务调度,给 Pod 选择运行的 Node,不创建 Pod,只“决策”
- kube-controller-manager:一堆控制器的集合
kube-scheduler 流程(调度流程):
- Filter(预选):过滤节点,能跑的节点?(资源、污点、亲和性)
- Score(打分):哪个节点更适合?
- Bind(绑定):把 Pod 指定到节点
- kubelet:管理 Pod 生命周期,与 kube-apiserver 通信
- kube-proxy:提供网络代理,将 Pod 的 Service 暴露为网络服务
- container runtime:运行容器
- CNI:网络插件
- Kubernetes 一切皆资源,每个资源都是一个 YAML 对象
- Pod:最小调度单位,一个或多个容器的组合
- Workload:工作负载
- Deployment:无状态应用
- StatefulSet:有状态服务
- DaemonSet:每节点一个
- Job:一次性任务
- CronJob:定时任务
- Service:服务,解决什么问题?(Pod IP 会变,Pod 会重建,需要统一访问入口),Service 提供:虚拟 IP(VIP),DNS 名称,负载均衡
- Ingress:七层流量入口,HTTP/HTTPS 路由,域名转发
- Ingress = 规则
- Ingress Controller = 实现者(Nginx / Traefik
调度相关概念:
- NodeSelector:最简单节点选择
- NodeAffinity:更灵活的节点亲和
- PodAffinity / AntiAffinity:Pod 之间关系
Taint / Toleration:
- 污点
- Node 拒绝 Pod
- Pod 声明我能忍
资源管理:
- requests:决定调度
- limits:决定上限
HPA(自动扩缩容)
- 基于 CPU / 内存 / 自定义指标
- 需要 metrics-server
- PV:实际存储
- PVC:存储申请
- StorageClass:动态创建
Volume 类型
- emptyDir
- hostPath
- NFS
- CSI(云盘)
Pod 生命周期
- Pending
- Running
- Succeeded
- Failed
- Unknown
容器状态:
- Waiting(拉镜像)
- Running
- Terminated(退出码)
探针:
- startupProbe
- readinessProbe
- livenessProbe
自愈机制
- Pod 崩溃 -> 重启
- Node 掉线 -> Pod 漂移
- 副本不足 -> 自动补齐
- Calico:特点(高性能、BGP、eBPF),技术(路由为主)
- Flannel:特点(简单、兼容性高),技术(VXLAN、封包)
- Cilium:特点(eBPF、L7、网络安全),技术(eBPF)
- SIGTERM(grace period)
- readiness probe fail -> 从 LB 移除
- 等待 preStop
- SIGKILL(到达 timeout)
- kubectl logs pod
- kubectl describe deployment/service/pod
- 更新应用程序
- 下载新的镜像
- 升级计划:kubeadm upgrade plan
- 升级:kubeadm upgrade apply
Ansible 是一款无 Agent 的自动化运维与配置管理工具,使用 SSH 实现批量部署和环境一致性。
常用命令:
# ping 检测
ansible all -m ping
# 批量执行命令
ansible all -m shell -a "ps aux | grep nginx"
# 同步文件 (拉取)
ansible all -m synchronize -a "src=/opt/file dest=/tmp/ mode=pull"
# 同步文件 (推送)
ansible all -m synchronize -a "src=/opt/file dest=/tmp/ mode=push"
shell 和 command 的区别:
- command:默认,不解析 shell
- shell:允许管道、重定向
定位:分布式版本控制系统,用于源代码管理。
Git 工作区、暂存区、版本库分别是什么?
- 工作区(working directory):你的代码所在目录。
- 暂存区(stage/index):git add 后进入的区域。
- 本地仓库(repository):.git 目录,存储 commit、tree 对象。
- 远程仓库(origin):GitLab/GitHub 上的仓库。
流程图:
工作区 -> git add -> 暂存区 -> git commit -> 本地库 -> git push -> 远程库
Git 不是“文件差异系统”,是一个 内容寻址(Content-addressable)的对象数据库。
- SVN:存“文件 + 差异”
- Git:存“内容快照 + 指针”
分布式是“完整仓库复制”,每个 Git 仓库都包含:
- 完整历史
- 所有分支
- 所有对象
Git 仓库本质是一个对象数据库,只有 4 种对象:
- blob 文件内容
- tree 目录结构
- commit 一次提交
- tag 标签(指向 commit)
HEAD 的本质是一个指针,指向当前分支或 commit
分支不是拷贝,Git 分支的本质是一个 指向 commit 的可移动指针
定位:集成代码管理、CI/CD、Issue 和权限控制的 DevOps 平台。
GitLab 是一个 基于 Git 的代码托管 + DevOps 平台,集成 代码管理、CI/CD、Issue、WIKI、自动化、安全扫描、部署 等功能。
GitLab Runner 是一个 独立于 GitLab 的任务执行器,专门用来执行 .gitlab-ci.yml 中的 job。
GitLab Runner 的工作原理:
GitLab CI -> 调度 job -> 分配给 Runner -> Runner 执行 -> 上传结果 -> Pipeline 完成
定位:持续集成与持续交付工具,负责自动化构建、测试与发布。
定位:分布式搜索与日志分析引擎,用于日志检索和数据分析。
定位:高吞吐、分布式消息队列与流处理平台,用于系统解耦和异步通信。
定位:内核级四层负载均衡,用于高性能流量分发。
定位:高性能 Web 服务器与七层反向代理,常用于负载均衡与网关。
定位:关系型数据库,广泛用于业务数据存储。
定位:高级关系型数据库,强调一致性、扩展性和复杂查询能力。
定位:文档型 NoSQL 数据库,适合非结构化和半结构化数据。
定位:内存型数据存储,常用于缓存、会话和消息场景。
定位:传统文件传输协议,用于文件上传和下载。
定位:高效的数据同步工具,支持增量传输与远程备份。
定位:传统一体化监控系统,擅长主机、网络和中间件监控。
定位:云原生监控与时序数据库,强调指标采集和服务监控。