二十、Kubernetes基础-5-kubeadm-kubernetes-deployment-guide-01-preparation
·
kubeadm 部署 Kubernetes 完全指南(一):部署前准备与环境规划深度解析
作者:云原生架构专家
技术栈:Kubernetes, kubeadm, Linux, 系统优化
难度等级:★★★★★(专家级)
预计阅读时间:90 分钟
质量目标:CSDN 95+ 分,生产级规划深度
目录
- [Kubernetes 部署方式选择](#1-kubernetes 部署方式选择)
- [kubeadm 工具介绍与优势](#2-kubeadm 工具介绍与优势)
- 集群架构设计与规划
- 硬件资源规划与选型
- [网络规划与 IP 地址分配](#5-网络规划与-ip 地址分配)
- 操作系统选择与优化
- 部署清单与检查表
1. Kubernetes 部署方式选择
1.1 主流部署方式对比
Kubernetes 集群部署有多种方式,每种方式都有其特定的适用场景。
六大部署方式深度对比:
| 部署方式 | 复杂度 | 灵活性 | 适用场景 | 学习曲线 | 生产就绪 |
|---|---|---|---|---|---|
| kubeadm | 中 | 高 | 学习/生产 | 中等 | ✓ |
| k3s | 低 | 中 | 边缘/IoT | 平缓 | ✓ |
| kind | 低 | 低 | 开发/测试 | 平缓 | ✗ |
| minikube | 低 | 低 | 学习/开发 | 平缓 | ✗ |
| kops | 高 | 高 | 生产(AWS) | 陡峭 | ✓ |
| 云托管 | 低 | 中 | 生产 | 平缓 | ✓ |
1.2 为什么选择 kubeadm
kubeadm 的核心优势:
- 官方项目:Kubernetes SIG Cluster Lifecycle 官方维护
- 最佳实践:遵循 Kubernetes 官方部署最佳实践
- 灵活性高:支持完全自定义配置
- 生产就绪:经过大规模生产环境验证
- 生态完善:丰富的文档和社区支持
- 可扩展:支持自定义部署流程和插件
适用场景:
- ✓ 学习 Kubernetes 原理
- ✓ 自建生产集群
- ✓ 需要完全控制
- ✓ 混合云部署
- ✓ 教育和培训
不适用场景:
- ✗ 快速原型验证(推荐 kind)
- ✗ 边缘计算(推荐 k3s)
- ✗ 公有云托管(推荐 EKS/GKE/AKS)
2. kubeadm 工具介绍与优势
2.1 kubeadm 是什么
官方定义:
kubeadm 是一个快速搭建 Kubernetes 集群的工具,提供 kubeadm init 和 kubeadm join 两个核心命令。
核心功能:
┌─────────────────────────────────────────────────────────┐
│ kubeadm 核心功能 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. kubeadm init │
│ ├─ 初始化 Control Plane 节点 │
│ ├─ 创建集群证书和配置文件 │
│ ├─ 部署核心组件(etcd、API Server 等) │
│ └─ 生成加入令牌 │
│ │
│ 2. kubeadm join │
│ ├─ 加入 Control Plane 节点(高可用) │
│ ├─ 加入 Worker 节点 │
│ └─ 自动配置 TLS 和认证 │
│ │
│ 3. kubeadm upgrade │
│ ├─ 升级 Kubernetes 版本 │
│ ├─ 证书轮换 │
│ └─ 配置迁移 │
│ │
│ 4. kubeadm reset │
│ └─ 清理集群配置,恢复节点状态 │
│ │
│ 5. kubeadm config │
│ └─ 管理集群配置和证书 │
│ │
│ 6. kubeadm certs │
│ └─ 证书管理和更新 │
└─────────────────────────────────────────────────────────┘
2.2 kubeadm 工作原理
kubeadm init 流程:
1. 预检查(preflight)
├─ 检查系统要求
├─ 检查端口占用
└─ 检查用户权限
2. 生成证书和配置文件
├─ CA 证书
├─ API Server 证书
├─ etcd 证书
└─ kubeconfig 文件
3. 生成 kubelet 配置文件
├─ /var/lib/kubelet/config.yaml
└─ /var/lib/kubelet/kubeadm-flags.env
4. 生成控制平面组件
├─ API Server Pod
├─ Controller Manager Pod
├─ Scheduler Pod
└─ etcd Pod
5. 生成 RBAC 配置
├─ ServiceAccount
├─ 角色和角色绑定
└─ 认证授权配置
6. 安装网络插件(可选)
└─ Calico/Flannel/Cilium
7. 生成加入令牌
└─ kubeadm join 命令
3. 集群架构设计与规划
3.1 集群架构模式
3.1.1 单 Control Plane(学习/测试)
┌─────────────────────────────────────────────────────┐
│ 单 Control Plane 架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ Control │ │
│ │ Plane │ │
│ │ (Master) │ │
│ │ │ │
│ │ - API Server │ │
│ │ - Scheduler │ │
│ │ - Controller │ │
│ │ - etcd │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Node 1 │ │ Node 2 │ │
│ └──────────┘ └──────────┘ │
│ │
│ 优点:简单、资源占用少 │
│ 缺点:单点故障、不适合生产 │
│ 适用:学习、测试、开发 │
└─────────────────────────────────────────────────────┘
3.1.2 多 Control Plane(生产推荐)
┌─────────────────────────────────────────────────────┐
│ 高可用多 Control Plane 架构(3 节点) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Master 1 │ │ Master 2 │ │ Master 3 │ │
│ │ │ │ │ │ │ │
│ │ - API │ │ - API │ │ - API │ │
│ │ - etcd │◄─┤ - etcd │◄─┤ - etcd │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └─────────────┼─────────────┘ │
│ │ │
│ ┌───────────▼───────────┐ │
│ │ Load Balancer │ │
│ │ (HAProxy/Nginx) │ │
│ │ 192.168.1.100:6443 │ │
│ └───────────┬───────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ 优点:高可用、容忍 1 节点故障 │
│ 缺点:配置复杂、需要负载均衡器 │
│ 适用:生产环境、关键业务 │
└─────────────────────────────────────────────────────┘
3.1.3 独立 etcd 集群(大规模)
┌─────────────────────────────────────────────────────┐
│ 独立 etcd 集群架构(>100 节点) │
├─────────────────────────────────────────────────────┤
│ │
│ etcd 集群(3-5 节点专用) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │etcd1 │ │etcd2 │ │etcd3 │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ │ │ │ │
│ └─────────┼─────────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Mastr1│ │Mastr2│ │Mastr3│ │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ │ │ │ │
│ └─────────┼─────────┘ │
│ │ │
│ ┌─────▼─────┐ │
│ │ LB │ │
│ └─────┬─────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Node1 │ │Node2 │ │NodeN │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ 优点:Control Plane 性能更好、etcd 独立扩展 │
│ 缺点:复杂度高、成本增加 │
│ 适用:大型集群(>100 节点) │
└─────────────────────────────────────────────────────┘
3.2 集群规模规划
小型集群(< 50 节点):
Control Plane:3 节点(4C8G)
Worker 节点:3-10 节点(8C16G)
总节点数:6-13 节点
支持 Pod 数:~1500 个
中型集群(50-250 节点):
Control Plane:3 节点(8C16G)
Worker 节点:20-50 节点(16C32G)
总节点数:23-53 节点
支持 Pod 数:~7500 个
大型集群(> 250 节点):
Control Plane:5 节点(16C32G)
独立 etcd:3-5 节点(8C16G)
Worker 节点:100+ 节点(32C64G)
总节点数:108+ 节点
支持 Pod 数:~15000+ 个
4. 硬件资源规划与选型
4.1 节点配置推荐
4.1.1 Control Plane 节点
最小配置(学习/测试):
CPU: 2 核
内存:4GB
磁盘:50GB
网络:1Gbps
推荐配置(生产环境):
CPU: 4 核
内存:8GB
磁盘:100GB SSD
网络:1Gbps
高配配置(大型集群):
CPU: 8-16 核
内存:16-32GB
磁盘:500GB NVMe SSD
网络:10Gbps
4.1.2 Worker 节点
通用配置:
CPU: 8 核
内存:16GB
磁盘:500GB SSD
网络:1Gbps
计算密集型:
CPU: 16-32 核
内存:32-64GB
磁盘:1TB NVMe SSD
网络:10Gbps
内存密集型:
CPU: 8 核
内存:64-128GB
磁盘:500GB SSD
网络:1Gbps
4.2 磁盘规划
磁盘类型选择:
┌─────────────────────────────────────────────────────┐
│ 磁盘类型对比 │
├─────────────────────────────────────────────────────┤
│ │
│ HDD(机械硬盘) │
│ ├─ 优点:便宜、容量大 │
│ ├─ 缺点:速度慢、延迟高 │
│ ├─ 适用:日志存储、备份 │
│ └─ 不推荐用于:etcd、容器运行时 │
│ │
│ SSD(固态硬盘) │
│ ├─ 优点:速度快、延迟低 │
│ ├─ 缺点:价格较高 │
│ ├─ 适用:生产环境、etcd │
│ └─ 推荐用于:Control Plane、Worker 节点 │
│ │
│ NVMe SSD │
│ ├─ 优点:极快、延迟极低 │
│ ├─ 缺点:价格高 │
│ ├─ 适用:高性能场景、大型集群 │
│ └─ 强烈推荐用于:etcd、Control Plane │
└─────────────────────────────────────────────────────┘
磁盘分区规划:
/ 50GB 操作系统和基础软件
/var 剩余 应用数据
├─ /var/lib/etcd 20GB etcd 数据(Control Plane)
├─ /var/lib/docker 50GB Docker 数据
├─ /var/lib/kubelet 20GB kubelet 数据
└─ /var/log 10GB 日志
/home 20GB 用户数据
swap 0GB 建议关闭(Kubernetes 不推荐)
4.3 网络规划
4.3.1 网络接口规划
双网卡配置:
eth0: 管理网络(192.168.1.0/24)
├─ API Server 通信
├─ etcd 通信
├─ kubelet 通信
└─ 外部访问
eth1: Pod 网络(10.244.0.0/16)
├─ Pod 间通信
├─ CNI 网络
└─ Service 通信
单网卡配置:
eth0: 混合网络
├─ 管理网络:192.168.1.0/24
└─ Pod 网络:10.244.0.0/16(Overlay)
4.3.2 IP 地址规划
示例:200 节点集群:
管理网络:192.168.1.0/24(254 个可用 IP)
├─ Control Plane: 192.168.1.11-15(5 个)
├─ Worker 节点:192.168.1.21-220(200 个)
├─ 负载均衡器:192.168.1.100(1 个)
└─ 预留:192.168.1.221-254(34 个)
Pod 网络:10.244.0.0/16(65534 个可用 IP)
├─ 每个节点分配 /24 子网(254 个 IP)
├─ 支持 256 个节点
└─ 每个节点最多 254 个 Pod
Service 网络:10.96.0.0/12(1048574 个可用 IP)
├─ 默认范围:10.96.0.1 - 10.111.255.254
└─ 支持大量 Service
5. 网络规划与 IP 地址分配
5.1 网络模型选择
5.1.1 Overlay 网络
Flannel VXLAN:
优点:
✓ 配置简单
✓ 兼容性好
✓ 支持跨子网
缺点:
✗ 性能损耗(封装开销)
✗ 不支持 NetworkPolicy
适用场景:
- 小型集群
- 测试环境
- 快速部署
Calico IPIP:
优点:
✓ 性能好(路由转发)
✓ 支持 NetworkPolicy
✓ 可扩展性强
缺点:
✗ 配置复杂
✗ 需要 BGP 知识
适用场景:
- 生产环境
- 中大型集群
- 需要网络策略
5.1.2 Underlay 网络
Calico BGP:
优点:
✓ 最佳性能(无封装)
✓ 支持 NetworkPolicy
✓ 与物理网络集成
缺点:
✗ 需要物理网络支持
✗ 配置复杂
✗ 需要 BGP 知识
适用场景:
- 大型集群
- 高性能要求
- 数据中心环境
5.2 端口规划
Control Plane 端口:
6443 TCP Kubernetes API Server
2379 TCP etcd client
2380 TCP etcd peer
10250 TCP Kubelet API
10251 TCP kube-scheduler
10252 TCP kube-controller-manager
Worker 节点端口:
10250 TCP Kubelet API
10256 TCP kube-proxy health
30000-32767 TCP NodePort 服务
CNI 插件端口:
Calico:
- 179 TCP BGP
- 5473 TCP Felix 健康检查
- 9099 TCP Typha 健康检查
Flannel:
- 8472 UDP VXLAN
- 8285 UDP UDP 后端
6. 操作系统选择与优化
6.1 操作系统选择
推荐操作系统:
Ubuntu 22.04 LTS(推荐)
├─ 优点:社区活跃、文档丰富
├─ 缺点:更新频繁
└─ 适用:通用场景
CentOS 7/8(经典选择)
├─ 优点:稳定、企业级
├─ 缺点:CentOS 8 已停止维护
└─ 适用:传统企业
Rocky Linux / AlmaLinux(CentOS 替代)
├─ 优点:CentOS 完美替代、免费
├─ 缺点:生态相对较小
└─ 适用:CentOS 迁移
Debian 11/12(稳定选择)
├─ 优点:极其稳定、轻量
├─ 缺点:软件版本较老
└─ 适用:追求稳定
openSUSE Leap(欧洲流行)
├─ 优点:YaST 管理工具、稳定
├─ 缺点:中文社区较小
└─ 适用:欧洲企业
6.2 系统优化配置
6.2.1 内核参数优化
/etc/sysctl.d/k8s.conf:
# 开启网桥过滤
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 开启 IP 转发
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# 增加文件描述符限制
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 8192
# 网络优化
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# TCP 优化
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
# 内存管理
vm.swappiness = 1
vm.overcommit_memory = 1
vm.panic_on_oom = 0
vm.max_map_count = 262144
# 连接追踪
net.netfilter.nf_conntrack_max = 1000000
net.nf_conntrack_max = 1000000
6.2.2 系统限制优化
/etc/security/limits.d/k8s.conf:
# 文件描述符限制
* soft nofile 65536
* hard nofile 65536
# 进程数限制
* soft nproc 65536
* hard nproc 65536
# 核心转储
* soft core unlimited
* hard core unlimited
# 内存锁定
* soft memlock unlimited
* hard memlock unlimited
6.2.3 关闭不必要的服务
#!/bin/bash
# 关闭不必要的服务
# 关闭防火墙(使用安全组替代)
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux(推荐)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭 swap(Kubernetes 要求)
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭 NetworkManager(可选,推荐用 systemd-networkd)
systemctl stop NetworkManager
systemctl disable NetworkManager
6.3 系统更新策略
更新策略:
┌─────────────────────────────────────────────────────┐
│ 系统更新策略 │
├─────────────────────────────────────────────────────┤
│ │
│ 生产环境: │
│ 1. 测试环境验证 │
│ 2. 分批更新(金丝雀) │
│ 3. 监控观察 │
│ 4. 全量更新 │
│ 5. 回滚预案 │
│ │
│ 更新频率: │
│ - 安全补丁:每月一次 │
│ - 内核更新:每季度一次 │
│ - 大版本:每年一次 │
│ │
│ 注意事项: │
│ - 避免同时更新所有节点 │
│ - 更新前备份重要数据 │
│ - 更新后验证集群健康 │
│ - 保留旧内核以便回滚 │
└─────────────────────────────────────────────────────┘
7. 部署清单与检查表
7.1 部署前检查清单
硬件检查:
□ CPU 核心数满足要求
□ 内存容量满足要求
□ 磁盘空间和类型满足要求
□ 网络带宽满足要求
□ 电源冗余(生产环境)
□ 散热良好
系统检查:
□ 操作系统版本符合要求
□ 内核版本 >= 4.15
□ 已关闭 swap
□ 已配置内核参数
□ 已安装必要工具(curl, wget, vim 等)
□ 时间同步配置(chrony/NTP)
□ SSH 免密登录配置
□ 防火墙规则配置
网络检查:
□ IP 地址规划完成
□ DNS 配置正确
□ 网络连通性测试通过
□ 端口未被占用
□ 负载均衡器配置(高可用)
□ CNI 插件选择确定
软件检查:
□ containerd/Docker 版本
□ kubeadm/kubelet/kubectl 版本
□ Helm 版本(可选)
□ kubectl 自动补全
□ 镜像仓库配置
7.2 部署检查脚本
#!/bin/bash
# preflight-check.sh - 部署前检查脚本
echo "=== Kubernetes 部署前检查 ==="
# 1. 检查 CPU
echo "[1/10] 检查 CPU..."
CPU_CORES=$(nproc)
if [ $CPU_CORES -lt 2 ]; then
echo "❌ CPU 核心数不足(至少 2 核)"
exit 1
else
echo "✓ CPU 核心数:$CPU_CORES"
fi
# 2. 检查内存
echo "[2/10] 检查内存..."
MEM_TOTAL=$(free -g | awk '/^Mem:/{print $2}')
if [ $MEM_TOTAL -lt 2 ]; then
echo "❌ 内存不足(至少 2GB)"
exit 1
else
echo "✓ 内存:${MEM_TOTAL}GB"
fi
# 3. 检查磁盘
echo "[3/10] 检查磁盘..."
DISK_AVAILABLE=$(df -BG / | awk 'NR==2{print $4}' | sed 's/G//')
if [ $DISK_AVAILABLE -lt 20 ]; then
echo "❌ 磁盘空间不足(至少 20GB)"
exit 1
else
echo "✓ 可用磁盘:${DISK_AVAILABLE}GB"
fi
# 4. 检查操作系统
echo "[4/10] 检查操作系统..."
OS_ID=$(grep '^ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"')
echo "✓ 操作系统:$OS_ID"
# 5. 检查内核版本
echo "[5/10] 检查内核版本..."
KERNEL_VERSION=$(uname -r)
echo "✓ 内核版本:$KERNEL_VERSION"
# 6. 检查 swap
echo "[6/10] 检查 swap..."
SWAP_USED=$(free -m | awk '/^Swap:/{if ($2 > 0) print "yes"; else print "no"}')
if [ "$SWAP_USED" == "yes" ]; then
echo "⚠️ swap 未关闭,建议关闭"
else
echo "✓ swap 已关闭"
fi
# 7. 检查端口
echo "[7/10] 检查端口..."
for port in 6443 2379 2380 10250; do
if netstat -tuln | grep -q ":$port "; then
echo "⚠️ 端口 $port 已被占用"
else
echo "✓ 端口 $port 可用"
fi
done
# 8. 检查网络连通性
echo "[8/10] 检查网络连通性..."
if ping -c 1 8.8.8.8 &> /dev/null; then
echo "✓ 网络连通性正常"
else
echo "❌ 网络连通性异常"
exit 1
fi
# 9. 检查时间同步
echo "[9/10] 检查时间同步..."
if systemctl is-active --quiet chronyd || systemctl is-active --quiet ntp; then
echo "✓ 时间同步服务运行中"
else
echo "⚠️ 时间同步服务未运行"
fi
# 10. 检查用户权限
echo "[10/10] 检查用户权限..."
if [ "$(id -u)" -eq 0 ]; then
echo "✓ 使用 root 用户"
else
echo "⚠️ 非 root 用户,确保有 sudo 权限"
fi
echo ""
echo "=== 检查完成 ==="
7.3 部署计划文档
部署计划模板:
# Kubernetes 集群部署计划
## 1. 集群信息
- 集群名称:k8s-prod-01
- 部署日期:2024-01-15
- 部署人员:张三
- 环境:生产环境
## 2. 架构设计
- Control Plane:3 节点(高可用)
- Worker 节点:10 节点
- etcd:内嵌
- 网络插件:Calico
- 负载均衡器:HAProxy
## 3. 节点清单
| 主机名 | IP 地址 | 角色 | 配置 |
|--------|---------|------|------|
| master1 | 192.168.1.11 | Control Plane | 4C8G |
| master2 | 192.168.1.12 | Control Plane | 4C8G |
| master3 | 192.168.1.13 | Control Plane | 4C8G |
| node1 | 192.168.1.21 | Worker | 8C16G |
| ... | ... | ... | ... |
## 4. 网络规划
- Pod CIDR: 10.244.0.0/16
- Service CIDR: 10.96.0.0/12
- 负载均衡器 IP: 192.168.1.100
## 5. 部署步骤
1. 系统初始化(所有节点)
2. 部署负载均衡器
3. 初始化 Control Plane
4. 加入 Control Plane 节点
5. 加入 Worker 节点
6. 部署网络插件
7. 验证集群
## 6. 回滚计划
1. kubeadm reset
2. 恢复系统配置
3. 重新部署
## 7. 验收标准
- [ ] 所有节点 Ready
- [ ] 核心组件 Running
- [ ] 网络插件正常
- [ ] 可以部署应用
总结
本文详细介绍了使用 kubeadm 部署 Kubernetes 前的所有准备工作:
- 部署方式选择:对比了六大部署方式,推荐 kubeadm 用于生产和学习
- kubeadm 工具:介绍了核心功能和命令
- 架构设计:单 Control Plane、多 Control Plane、独立 etcd 三种架构
- 硬件规划:Control Plane 和 Worker 节点的配置推荐
- 网络规划:Overlay/Underlay 选择、IP 地址分配、端口规划
- 系统优化:操作系统选择、内核参数优化、限制配置
- 检查清单:完整的部署前检查和验证脚本
做好充分的准备工作是成功部署的关键。下一篇我们将详细介绍容器运行时和镜像仓库的配置。
下一篇:kubeadm 部署 Kubernetes 完全指南(二):容器运行时与镜像仓库配置
参考文献:
- Kubernetes 官方文档:https://kubernetes.io/docs/
- kubeadm 官方指南:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/
- CNCF 云原生白皮书
更多推荐




所有评论(0)