Kubernetes v1.32 集群部署详解(含命令 + 原理 + 图表)
一、部署架构总览
本次部署为 1 Master + 2 Worker 的标准测试集群,适用于生产环境前的验证。
1️⃣ 节点规划表
| 角色 | 主机名 | IP | 核心组件 |
|---|---|---|---|
| Control Plane | k8s-master01 | 192.168.222.141 | apiserver / etcd / scheduler / controller-manager |
| Worker | k8s-node1 | 192.168.222.142 | kubelet / kube-proxy / Pod |
| Worker | k8s-node2 | 192.168.222.143 | kubelet / kube-proxy / Pod |
2️⃣ 集群逻辑架构图
纯文本
纯文本
┌──────────────────────────────────┐
│ k8s-master01 │
│ ┌────────────┐ ┌────────────┐ │
│ │ apiserver │◄─┤ controller │ │
│ └─────▲──────┘ └─────┬──────┘ │
│ │ │ │
│ ┌─────┴──────┐ ┌─────▼──────┐ │
│ │ etcd │ │ scheduler │ │
│ └────────────┘ └────────────┘ │
└───────────────┬─────────────────┘
│ 6443
┌──────────┴──────────┐
│ │
┌────▼─────┐ ┌──────▼─────┐
│ k8s-node1│ │ k8s-node2 │
│ kubelet │ │ kubelet │
│ kube-proxy│ │ kube-proxy │
│ Calico │ │ Calico │
└──────────┘ └────────────┘
📌 知识点
-
apiserver 是唯一入口
-
etcd 存储所有集群状态
-
kubelet 是"节点管家"
-
CNI 解决 Pod 网络
二、系统层准备(所有节点)
1️⃣ 主机名与静态解析
bash
bash
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
bash
bash
cat >> /etc/hosts << EOF
192.168.222.141 k8s-master01
192.168.222.142 k8s-node1
192.168.222.143 k8s-node2
EOF
📌 原理
K8s 不使用 IP 识别节点,而是使用 hostname。
2️⃣ 关闭 Swap(强约束)
bash
bash
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
| 项 | 原因 |
|---|---|
| K8s 设计 | 假设内存可预测 |
| Swap | 会导致 OOM 行为异常 |
| 后果 | kubelet 拒绝启动 |
3️⃣ 时间同步(分布式系统基础)
bash
bash
yum install -y chrony
systemctl enable --now chronyd
chronyc sources -v
📌 时间不一致的后果
-
etcd 选主失败
-
TLS 证书校验失败
-
调度时间漂移
三、内核参数与模块(网络核心)
1️⃣ 内核模块对照表
| 模块 | 作用 |
|---|---|
| br_netfilter | 桥接流量进入 iptables |
| ip_vs | IPVS 负载均衡 |
| ip_vs_rr / wrr / sh | 调度算法 |
| nf_conntrack | 连接跟踪 |
bash
bash
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
2️⃣ sysctl 参数(K8s 网络必需)
bash
bash
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
fs.file-max = 52706963
net.netfilter.nf_conntrack_max = 2310720
EOF
sysctl --system
📌 作用
-
Service NAT
-
Pod 跨节点通信
-
CNI 插件依赖
四、资源限制(防雪崩)
bash
bash
cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
EOF
bash
bash
sed -i 's/^#DefaultLimitNOFILE=.*/DefaultLimitNOFILE=655360/' /etc/systemd/system.conf
systemctl daemon-reload
📌 原因
-
单节点可运行数百 Pod
-
文件句柄不足 → kubelet 崩溃
五、容器运行时(Docker + cri-dockerd)
1️⃣ 架构关系图
纯文本
纯文本
kubelet
│
▼
CRI (cri-dockerd)
│
▼
Docker
│
▼
Container
2️⃣ Docker 配置
bash
bash
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://p3kgr6db.mirror.aliyuncs.com"
]
}
EOF
systemctl enable --now docker
📌 关键点
- cgroup driver 必须与 kubelet 一致
3️⃣ 安装 cri-dockerd
bash
bash
yum install -y libcgroup
rpm -ivh cri-dockerd-0.3.16-3.fc35.x86_64.rpm
systemctl enable --now cri-docker.socket cri-docker
六、K8s 组件安装
bash
bash
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
bash
bash
yum install -y kubelet kubeadm kubectl kubernetes-cni
systemctl enable kubelet
七、Master 初始化(核心)
bash
bash
kubeadm init \
--apiserver-advertise-address=192.168.222.141 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.32.13 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock
初始化后配置
bash
bash
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
📌 kubeadm 做了什么?
-
生成 CA
-
启动 etcd
-
启动 apiserver
-
生成 kubeconfig
八、Worker 加入集群
bash
bash
kubeadm join 192.168.222.141:6443 \
--token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx \
--cri-socket unix:///var/run/cri-dockerd.sock
九、Calico 网络插件
bash
bash
docker load -i /opt/calico_3.28.1_image.tar
kubectl apply -f calico.yaml
最终状态表
| 组件 | 状态 |
|---|---|
| Node | Ready |
| CoreDNS | Running |
| Calico | Running |
| kube-proxy | Running |