4. 环境准备:搭建多节点K8s集群(kubeadm方式)与kubectl配置

本章节将指导你使用 kubeadm 工具搭建一个具备高可用基础的多节点 Kubernetes 集群。该集群将作为后续蓝绿发布与灾备自动化故障切换实验的底层基础设施。集群规划采用 1 个控制平面节点(Master)与 2 个工作节点(Worker)的标准拓扑,并完成 kubectl 的本地配置与验证。

4.1 集群架构与节点规划

本次搭建的集群采用最小化高可用架构,控制平面节点承载 etcd 与 API Server 等核心组件,工作节点负责运行业务 Pod。所有节点均位于同一二层网络,通过 Flannel CNI 插件实现跨节点容器通信。

节点角色与资源配置表
主机名 角色 IP 地址 vCPU 内存 磁盘
k8s-master 控制平面 192.168.1.10 4 8 GB 50 GB
k8s-node1 工作节点 192.168.1.11 4 8 GB 50 GB
k8s-node2 工作节点 192.168.1.12 4 8 GB 50 GB
生产建议: 生产环境建议至少部署 3 个控制平面节点以实现 etcd 与 API Server 的高可用。本课程为实验环境,单控制平面节点足以演示蓝绿发布与故障切换核心流程。
K8s 多节点集群拓扑图 K8s 多节点集群拓扑(kubeadm 部署) k8s-master 控制平面 (etcd, API, Scheduler) 192.168.1.10 k8s-node1 工作节点 (Pod 运行) 192.168.1.11 k8s-node2 工作节点 (Pod 运行) 192.168.1.12 所有节点通过 Flannel 网络互通,Pod CIDR: 10.244.0.0/16

4.2 基础环境初始化(所有节点执行)

在开始 kubeadm 部署之前,需要在所有节点上完成操作系统基础配置,包括关闭交换分区、配置 Docker 或 containerd 容器运行时、安装 kubeadm/kubelet/kubectl 工具包。

4.2.1 关闭交换分区与配置内核参数

# 关闭交换分区(临时 + 永久)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

4.2.2 安装容器运行时(containerd)

# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd

# 生成默认配置并启用 systemd cgroup 驱动
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置:SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 重启 containerd
sudo systemctl restart containerd
sudo systemctl enable containerd

4.2.3 安装 kubeadm、kubelet、kubectl

# 添加 Kubernetes 官方 APT 仓库
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 安装指定版本(锁定版本防止意外升级)
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl
版本锁定: 务必使用 apt-mark hold 锁定 kubelet、kubeadm、kubectl 的版本。不同版本之间的组件可能存在 API 兼容性问题,锁定版本可确保集群长期稳定运行。

4.3 初始化控制平面节点(Master 节点执行)

在 Master 节点上执行 kubeadm init 命令,初始化控制平面组件。初始化过程中会生成集群加入令牌()以及用于工作节点加入的证书哈希值。

# 初始化控制平面(指定 Pod 网络 CIDR)
sudo kubeadm init \
  --apiserver-advertise-address=192.168.1.10 \
  --pod-network-cidr=10.244.0.0/16 \
  --kubernetes-version=v1.28.0

# 初始化成功后,配置 kubectl 访问集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 记录加入命令(后续工作节点使用)
kubeadm  create --print-join-command

初始化成功后,控制台会输出类似如下的加入命令,请务必保存:

kubeadm join 192.168.1.10:6443 -- xxxxxx.xxxxxxxxxxxxxxxx \
    --discovery--ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

4.4 安装 CNI 网络插件(Flannel)

在 Master 节点上安装 Flannel 网络插件,确保跨节点 Pod 通信正常。Flannel 使用 VXLAN 或 host-gw 模式,本实验采用 VXLAN 模式。

# 应用 Flannel 部署清单
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

# 验证 Flannel Pod 是否正常运行
kubectl get pods -n kube-flannel -o wide
网络插件选择: 除 Flannel 外,Calico、Weave Net 也是常见选择。Flannel 配置简单,适合实验环境;生产环境建议使用 Calico 以支持网络策略。

4.5 工作节点加入集群

在每台工作节点上执行 Master 初始化时生成的 kubeadm join 命令,将节点加入集群。

# 在 k8s-node1 和 k8s-node2 上分别执行
sudo kubeadm join 192.168.1.10:6443 -- xxxxxx.xxxxxxxxxxxxxxxx \
    --discovery--ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

加入成功后,在 Master 节点上验证节点状态:

kubectl get nodes

# 预期输出(所有节点状态为 Ready)
NAME          STATUS   ROLES           AGE   VERSION
k8s-master    Ready    control-plane   10m   v1.28.0
k8s-node1     Ready    <none>          5m    v1.28.0
k8s-node2     Ready    <none>          4m    v1.28.0
kubeadm 集群初始化与节点加入流程 kubeadm 集群初始化与节点加入流程 Master 节点 kubeadm init 生成加入令牌 + CA Hash 安装 Flannel kubectl apply -f Node1 节点 kubeadm join Node2 节点 kubeadm join 验证集群 kubectl get nodes 关键检查点:所有节点状态为 Ready,CoreDNS Pod 正常运行 kubectl get pods -n kube-system | grep coredns kubectl get nodes -o wide # 查看节点 IP 与角色

4.6 kubectl 本地配置与验证

在 Master 节点上,kubeadm 初始化时已自动配置了 ~/.kube/config 文件。若需要在本地工作站(如笔记本)远程管理集群,需将 Master 节点的 admin.conf 文件复制到本地并配置 kubectl。

4.6.1 从 Master 节点复制 kubeconfig

# 在本地工作站执行(假设已通过 SSH 访问 Master)
scp user@192.168.1.10:~/.kube/config ~/.kube/config

# 或直接复制 /etc/kubernetes/admin.conf
scp user@192.168.1.10:/etc/kubernetes/admin.conf ~/.kube/config

4.6.2 验证 kubectl 连通性

# 查看集群信息
kubectl cluster-info

# 预期输出
Kubernetes control plane is running at https://192.168.1.10:6443
CoreDNS is running at https://192.168.1.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# 查看节点列表
kubectl get nodes -o wide

4.6.3 配置 kubectl 自动补全(可选)

# Bash 自动补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

# Zsh 自动补全
source <(kubectl completion zsh)
echo "source <(kubectl completion zsh)" >> ~/.zshrc

4.7 集群健康检查清单

完成上述步骤后,执行以下检查清单确认集群处于健康状态,为后续蓝绿发布实验做好准备。

检查项 命令 预期结果
节点状态 kubectl get nodes 所有节点状态为 Ready
核心组件 Pod kubectl get pods -n kube-system coredns、etcd、kube-apiserver、kube-controller-manager、kube-scheduler 均为 Running
CNI 网络 kubectl get pods -n kube-flannel Flannel Pod 在所有节点上 Running
Pod 通信 kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec test-pod -- ping 10.244.1.2
跨节点 Pod 互通
kubectl 配置 kubectl config view 显示正确的集群、用户、上下文信息