Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Summary

先原理,后应用。

目录:

总览:从硬件到容器的分层

+-------------------------------------------------------------------+
    应用程序 / 服务
    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 系统主要由 内核空间 + 用户空间 + 应用程序 组成。

内核空间

内核空间是资源的“管理者”,是 Linux 系统的根基

内核空间包括:五大核心子系统

  • 进程管理
  • 内存管理
  • 文件系统
  • 网络子系统
  • 设备与驱动

进程管理

负责处理进程的创建、调度、终止以及进程间通信等等。

决定“哪个程序在什么时候用 CPU 跑多久”。

内存管理

负责管理物理内存和虚拟内存,为每个进程提供独立的虚拟地址空间。

决定“内存怎么分配、怎么回收、怎么映射”。

文件系统

负责提供对存储设备上数据的组织、存储和访问能力。

统一“文件”这一抽象,让程序不关心底层存储。

常见的文件系统有:xfs、ext4,现在最常用的是 xfs。

网络子系统

负责实现各种网络协议,包括 TCP/IP 协议栈,Socket,Netfilter,使 Linux 能够进行网络通信。

负责“数据包如何进入、处理、发送出系统”。

设备与驱动

负责充当硬件与软件之间的接口,是内核与硬件设备通信的桥梁。

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 系统 = 内核 + 用户空间工具 + 服务管理 + 配置体系

它的核心职责是:

  • 管理硬件
  • 提供稳定接口
  • 支撑应用程序运行

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

定位:应用容器化运行时,用于构建、打包和运行容器。

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        用户

可以多阶段构建

Podman

定位:无守护进程的容器运行时,兼容 Docker CLI,强调安全性。

Kubernetes

定位:容器编排与集群管理平台,负责容器的调度、伸缩与高可用。

Kubernetes 解决的是:容器的自动部署、调度、扩缩容、自愈、网络、存储、升级

Kubernetes 的整体架构

+----------------------------+
|        用户 / kubectl       |
+-------------+--------------+
              |
+-------------v--------------+
|        Control Plane       |
|    apiserver / scheduler   |
|      controller / etcd     |
+-------------+--------------+
              |
+-------------v--------------+
|            Node            |
|     kubelet / containerd   |
|       kube-proxy / CNI     |
+----------------------------+

控制平面(Control Plane)

  • etcd:保存 集群所有状态
  • kube-apiserver:所有请求入口,认证、鉴权、准入,唯一和 etcd 通信的组件
  • kube-scheduler:任务调度,给 Pod 选择运行的 Node,不创建 Pod,只“决策”
  • kube-controller-manager:一堆控制器的集合

kube-scheduler 流程(调度流程):

  • Filter(预选):过滤节点,能跑的节点?(资源、污点、亲和性)
  • Score(打分):哪个节点更适合?
  • Bind(绑定):把 Pod 指定到节点

工作节点(Node)

  • kubelet:管理 Pod 生命周期,与 kube-apiserver 通信
  • kube-proxy:提供网络代理,将 Pod 的 Service 暴露为网络服务
  • container runtime:运行容器
  • CNI:网络插件

核心对象模型(Object Model)

  • 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

调度与资源管理(How)

调度相关概念:

  • NodeSelector:最简单节点选择
  • NodeAffinity:更灵活的节点亲和
  • PodAffinity / AntiAffinity:Pod 之间关系

Taint / Toleration:

  • 污点
  • Node 拒绝 Pod
  • Pod 声明我能忍

资源管理:

  • requests:决定调度
  • limits:决定上限

HPA(自动扩缩容)

  • 基于 CPU / 内存 / 自定义指标
  • 需要 metrics-server

存储(Persistence)

  • 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)

如何优雅关闭一个 Pod?

  • 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

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:允许管道、重定向

CI / CD 与代码管理

Git

定位:分布式版本控制系统,用于源代码管理。

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 的可移动指针

GitLab

定位:集成代码管理、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 完成

Jenkins

定位:持续集成与持续交付工具,负责自动化构建、测试与发布。


日志、搜索与分析

ElasticSearch

定位:分布式搜索与日志分析引擎,用于日志检索和数据分析。


消息队列与流处理

Kafka

定位:高吞吐、分布式消息队列与流处理平台,用于系统解耦和异步通信。


负载均衡与流量调度

LVS

定位:内核级四层负载均衡,用于高性能流量分发。

Nginx

定位:高性能 Web 服务器与七层反向代理,常用于负载均衡与网关。


数据库与数据存储

MySQL

定位:关系型数据库,广泛用于业务数据存储。

PostgreSQL

定位:高级关系型数据库,强调一致性、扩展性和复杂查询能力。

MongoDB

定位:文档型 NoSQL 数据库,适合非结构化和半结构化数据。

Redis

定位:内存型数据存储,常用于缓存、会话和消息场景。


文件传输与数据同步

FTP

定位:传统文件传输协议,用于文件上传和下载。

rsync

定位:高效的数据同步工具,支持增量传输与远程备份。


监控与告警

Zabbix

定位:传统一体化监控系统,擅长主机、网络和中间件监控。

Prometheus

定位:云原生监控与时序数据库,强调指标采集和服务监控。