kubeadm方式部署k8s集群
使用 kubeadm 部署 Kubernetes 集群是官方推荐的生产级方案,以下是详细的多节点集群部署步骤(1 个控制平面节点 + 1 个工作节点,可扩展):
前置准备
-
服务器要求(每台节点)
操作系统:Ubuntu 20.04/22.04、CentOS 7/8 或 Rocky Linux(推荐 Ubuntu)
硬件:2 CPU、2GB 内存(控制平面),1 CPU、1GB 内存(工作节点,生产建议更高)
网络:所有节点互通,控制平面需开放 6443 端口,节点间需开放 10250 等端口
其他:关闭 Swap、禁用 SELinux(CentOS)、配置静态 IP -
环境初始化(所有节点执行)
(1)关闭 Swap
# 临时关闭
sudo swapoff -a# 永久关闭(Ubuntu/Debian)
sudo sed -i '/swap/s/^/#/' /etc/fstab# 永久关闭(CentOS/RHEL)
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
(2)配置内核参数(启用 IPv4 转发和桥接)
# 创建配置文件
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
(3)安装容器运行时(以 containerd 为例)
# 安装 containerd(Ubuntu)
sudo apt-get update
sudo apt-get install -y containerd# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml# 修改配置(使用 systemd cgroup 驱动)
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml# 重启 containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
- 安装 kubeadm、kubelet、kubectl(所有节点)
# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl# 添加 Kubernetes 源密钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg# 添加 Kubernetes 源
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list# 安装指定版本(推荐 1.27.x 稳定版)
sudo apt-get update
sudo apt-get install -y kubelet=1.27.4-00 kubeadm=1.27.4-00 kubectl=1.27.4-00# 锁定版本(防止自动更新)
sudo apt-mark hold kubelet kubeadm kubectl
部署控制平面节点(主节点)
- 初始化控制平面
sudo kubeadm init \--pod-network-cidr=10.244.0.0/16 \ # 用于 Flannel 网络插件,固定此网段--kubernetes-version=v1.27.4 \ # 与安装的版本一致--cri-socket=unix:///run/containerd/containerd.sock初始化成功后,会输出 节点加入命令(含 token),请复制保存(后续工作节点需要)。
若忘记命令,可在主节点重新生成:
bash
sudo kubeadm token create --print-join-command
- 配置 kubectl 权限(主节点)
# 普通用户配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 验证控制平面状态
kubectl get pods -n kube-system
- 安装网络插件(主节点)
Kubernetes 集群必须安装网络插件才能使 Pod 之间通信,这里选择 Flannel(简单易用):
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.2/Documentation/kube-flannel.yml
等待 1-2 分钟,验证节点状态(变为 Ready):
kubectl get nodes # 控制平面节点状态应为 Ready
添加工作节点
在 工作节点 执行之前保存的 加入命令(格式如下):
bash
sudo kubeadm join 192.168.1.100:6443 \--token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
验证节点是否加入成功(在主节点执行):
kubectl get nodes # 应显示控制平面和工作节点,状态均为 Ready
验证集群状态
# 查看节点状态
kubectl get nodes# 查看系统组件状态
kubectl get pods -n kube-system# 查看集群信息
kubectl cluster-info
所有节点状态为 Ready,且 kube-system 命名空间下的 Pod 均为 Running 状态,说明集群部署成功。
可选:部署 Dashboard(可视化界面)
# 部署 Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml# 创建管理员账号(创建 dashboard-admin.yaml)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
EOF# 获取登录令牌
kubectl -n kubernetes-dashboard create token admin-user# 启动代理(本地访问)
kubectl proxy
访问 Dashboard:http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/,粘贴令牌登录。
常见问题解决
节点状态 NotReady:检查网络插件是否安装成功(kubectl get pods -n kube-system)。
初始化失败:执行 sudo kubeadm reset 清理环境后重新初始化。
工作节点加入失败:检查网络连通性、令牌是否过期(重新生成令牌)。
通过以上步骤,可搭建一个基础的多节点 Kubernetes 集群,适合测试和生产环境(生产环境建议配置 3 个控制平面节点实现高可用)。