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 |
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
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
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 3600kubectl exec test-pod -- ping 10.244.1.2 |
跨节点 Pod 互通 |
| kubectl 配置 | kubectl config view |
显示正确的集群、用户、上下文信息 |