文章目录
- [Kubernetes 基础](#Kubernetes 基础)
-
- 一、云服务模式
- [二、K8s 核心功能](#二、K8s 核心功能)
- 三、集群架构与组件
-
- [工作流程(list-watch 机制)](#工作流程(list-watch 机制))
- 四、集群部署前置环境
-
- [1. 主机规划](#1. 主机规划)
- [2. 配置主机名](#2. 配置主机名)
- [3. 配置主机名解析](#3. 配置主机名解析)
- [4. 安装环境包](#4. 安装环境包)
- [5. 关闭防火墙与 SELinux](#5. 关闭防火墙与 SELinux)
- [6. 关闭 Swap](#6. 关闭 Swap)
- [7. 关闭 NetworkManager(可选)](#7. 关闭 NetworkManager(可选))
- [8. 调整内核参数](#8. 调整内核参数)
- [9. 升级内核(可选)](#9. 升级内核(可选))
- [10. 调整资源限制(可选)](#10. 调整资源限制(可选))
- [11. 时间同步](#11. 时间同步)
- [12. 加载 IPVS 内核模块](#12. 加载 IPVS 内核模块)
- [13. 重启服务并验证](#13. 重启服务并验证)
Kubernetes 基础
一、云服务模式
按抽象层次从高到低,常见的云服务模式如下:
| 模式 | 全称 | 说明 | 代表技术 |
|---|---|---|---|
| SaaS | 软件即服务 | 直接提供可用的软件 | --- |
| PaaS | 平台即服务 | 提供数据库、容器、大数据(Hadoop、Spark)等平台能力 | Kubernetes |
| IaaS | 基础设施即服务 | 提供虚拟化、存储、网络等基础资源 | OpenStack |
| MaaS | 模型即服务 | 直接提供 AI 模型能力 | --- |
| FaaS | 函数即服务 | 即无服务器架构(Serverless),以函数为单位运行代码 | --- |
二、K8s 核心功能
自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
弹性伸缩
使用命令、UI 或者基于 CPU 使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
自动部署和回滚
K8s 采用滚动更新策略更新应用,一次更新一个 Pod,而不是同时删除所有 Pod。如果更新过程中出现问题,将回滚更改,确保升级不影响业务。
服务发现和负载均衡
K8s 为多个容器提供一个统一访问入口(内部 IP 地址和一个 DNS 名称),并且负载均衡关联的所有容器,使得用户无需考虑容器 IP 问题。
机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在 K8s 中,方便应用程序使用。
存储编排
挂载外部存储系统,无论是来自本地存储、公有云(如 AWS),还是网络存储(如 NFS、GlusterFS、Ceph),都作为集群资源的一部分使用,极大提高存储使用灵活性。
批处理
提供一次性任务、定时任务,满足批量数据处理和分析的场景。
三、集群架构与组件
工作流程(list-watch 机制)
1. 提交创建请求
用户通过客户端向 API Server 发送请求,API Server 接收请求后创建一批 Pod,并将 Pod 数据写入 etcd(只有 API Server 具备读写 etcd 的权限)。
2. 控制器与调度
- Controller Manager 通过 API Server 读取 etcd 中的数据,按预设模板(实例数量、生命周期等)创建 Pod。
- Controller Manager 再通过 API Server 读取 etcd 中的信息,交由 Scheduler 为新创建的 Pod 选择最合适的 Node 节点并完成调度。
- 调度分为两个阶段:
- 预选(Predicate):例如 Pod 需要 2C4G 资源,Scheduler 会在所有 Node 中筛选出资源满足要求的节点。各 Node 的剩余资源由 kubelet 上报给 API Server,并存储在 etcd 中。
- 优选(Priority):在通过预选的节点中,再根据 CPU 负载、内存剩余量等因素打分,选出最合适的节点。
3. kubelet 执行创建
- Scheduler 通过 API Server 触发 kubelet,由 kubelet 按调度结果在对应 Node 上执行 Pod 创建操作。
- kubelet 会监视节点状态,定时向 API Server 汇报节点上运行的服务状态,并存储到 etcd 中。
- 在此期间,Controller Manager 会根据 K8s 资源清单(manifest)中声明的副本数,保证 Pod 的实际副本数与期望一致。
4. 网络代理
每个 Node 上都运行 kube-proxy,负责 Pod 的网络代理。它是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作:
- 在任一节点上访问 Service 的虚拟 IP,都能访问到后端 Pod,即提供 ClusterIP 访问入口。
- 所有节点上的 kube-proxy 进程通过 API Server 查询并监听 Service 及其对应的 Endpoints 信息,建立软件方式的负载均衡器,实现 Service 到后端 Pod 的流量转发。
四、集群部署前置环境
以下操作如无特殊说明,均需在 master、node1、node2 三台节点上执行。
1. 主机规划
| CPU | 内存 | 硬盘 | IP | 主机名 | 软件 |
|---|---|---|---|---|---|
| 2 核 | 4G | 200G | 192.168.100.128 | master | docker |
| 4 核 | 6G | 400G | 192.168.100.129 | node1 | docker |
| 4 核 | 6G | 400G | 192.168.100.136 | node2 | docker |
2. 配置主机名
在三台主机中分别执行对应命令:
bash
# master 节点
hostnamectl set-hostname master
# node1 节点
hostnamectl set-hostname node1
# node2 节点
hostnamectl set-hostname node2
3. 配置主机名解析
所有节点都需配置 /etc/hosts,配置完成后互相 ping 测试:
bash
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.128 master
192.168.100.129 node1
192.168.100.136 node2
4. 安装环境包
bash
yum -y install vim lrzsz unzip wget net-tools tree bash-completion conntrack \
ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp git psmisc telnet \
gcc gcc-c++ make
| 类别 | 软件包 | 核心功能 |
|---|---|---|
| 文件操作 | vim、lrzsz、unzip | 编辑 / 上传下载 / 解压 ZIP |
| 网络管理 | net-tools、ipvsadm | 网络配置 / IPVS 负载均衡 |
| 系统监控 | sysstat、psmisc | 性能监控 / 进程管理 |
| 开发编译 | gcc、make | 代码编译 / 自动化构建 |
| 安全防护 | iptables、libseccomp | 防火墙 / 容器系统调用限制 |
5. 关闭防火墙与 SELinux
bash
systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0
6. 关闭 Swap
启用 Swap 会对系统性能产生非常负面的影响,因此 Kubernetes 要求每个节点都禁用 Swap:
bash
swapoff -a # 立即关闭 Swap
sed -i '/swap/s/^/#/' /etc/fstab # 注释 /etc/fstab 中的 swap 行,防止开机自动挂载
7. 关闭 NetworkManager(可选)
bash
systemctl stop NetworkManager
systemctl disable NetworkManager
8. 调整内核参数
bash
cat > /etc/sysctl.d/kubernetes.conf <<EOF
# 开启 Linux 内核的网络桥接功能,同时启用 iptables 和 ip6tables 的网络包过滤功能
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发 IPv4 数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升 k8s 性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
EOF
配置立即生效:
bash
sysctl --system
9. 升级内核(可选)
bash
yum update -y kernel && reboot
| 部分 | 含义 |
|---|---|
yum update |
升级指定软件包到仓库中的最新版本(此处只指定 kernel,并非全系统更新) |
-y |
自动回答 yes,全程无需手动确认 |
kernel |
仅升级 Linux 内核包,不会更新其他系统软件 |
&& |
前一条命令执行成功(返回 0)才执行后面的命令;升级失败时不会重启 |
reboot |
重启服务器,新内核必须重启后才会加载生效 |
补充说明:
- 新内核 rpm 包会安装到
/boot并自动添加 GRUB 启动菜单,旧内核默认保留,重启时可在 GRUB 中选择旧内核启动。 - K8s 部署通常要求较高的内核版本:CentOS 7 默认内核为 3.10,部分功能(IPVS、Overlay 网络、容器特性)需要更新内核。
- 建议三台节点内核版本保持一致。
- ⚠️ 生产环境谨慎执行:内核升级存在小概率驱动 / 模块不兼容,导致重启后无法开机,建议先做快照备份。
- 注意区分:
yum update -y kernel:仅升级内核yum update -y:升级系统全部软件包(风险更大,生产环境通常禁止随意全量更新)
重启后验证内核版本:
bash
uname -r
10. 调整资源限制(可选)
bash
# 设置当前会话中一个进程可以打开的最大文件句柄数(临时生效)
ulimit -SHn 65535
# Linux 默认情况下一个进程可打开的最大文件句柄数为 1024
cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited
EOF
说明:
ulimit命令只是临时生效,写入limits.conf后需要重新登录会话才会永久生效。
11. 时间同步
bash
yum -y install chrony
systemctl restart chronyd
chronyc sources -v # 列出 Chrony 当前配置和使用的所有时间源(NTP 服务器)及同步状态
hwclock -s # 将硬件时钟的时间同步到系统时钟
12. 加载 IPVS 内核模块
bash
cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF
各模块功能说明:
| 类别 | 模块 | 功能 |
|---|---|---|
| 核心调度 | ip_vs |
IPVS 负载均衡基础模块 |
| 核心调度 | ip_vs_rr |
轮询(Round Robin)调度算法 |
| 核心调度 | ip_vs_wrr |
加权轮询(Weighted Round Robin)调度算法 |
| 核心调度 | ip_vs_sh |
源地址哈希(Source Hashing)调度算法 |
| 连接跟踪与过滤 | nf_conntrack_ipv4 |
IPv4 连接跟踪(NAT / 防火墙依赖,内核 ≥ 4.19 时已合并至 nf_conntrack) |
| 连接跟踪与过滤 | ip_tables |
iptables 基础框架 |
| 连接跟踪与过滤 | ipt_REJECT |
实现数据包拒绝(REJECT 动作) |
| IP 集合管理 | ip_set |
IP 地址集合管理 |
| IP 集合管理 | xt_set、ipt_set |
iptables 与 IP 集合的扩展匹配 |
| 隧道与桥接 | ipip |
IP-over-IP 隧道协议 |
| 隧道与桥接 | overlay |
Overlay 网络支持(如 Docker 跨主机网络) |
| 隧道与桥接 | br_netfilter |
桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参数) |
| 反向路径过滤 | ipt_rpfilter |
反向路径验证(防 IP 欺骗) |
典型应用场景:
- Kubernetes 节点初始化:IPVS 模式下的 kube-proxy 依赖这些模块
- 负载均衡服务器:启用 IPVS 调度算法
- 容器网络配置:Overlay 和桥接模块支持
13. 重启服务并验证
写入文件后,也可执行 modprobe --all /etc/modules-load.d/ipvs.conf 手动加载所有模块。
bash
systemctl restart systemd-modules-load
systemd-modules-load 会读取 /etc/modules-load.d/ 目录下的配置,自动加载 ipvs.conf 中定义的所有模块。
验证模块是否成功载入内核:
bash
lsmod | grep -e ip_vs -e nf_conntrack_ipv4