kubeadm方式部署k8s集群

使用 kubeadm 部署 Kubernetes 集群是官方推荐的生产级方案,以下是详细的多节点集群部署步骤(1 个控制平面节点 + 1 个工作节点,可扩展):
前置准备

1. 服务器要求(每台节点)

  • 操作系统:Ubuntu 20.04/22.04、CentOS 7/8 或 Rocky Linux(推荐 Ubuntu)
  • 硬件:2 CPU、2GB 内存(控制平面),1 CPU、1GB 内存(工作节点,生产建议更高)
  • 网络:所有节点互通,控制平面需开放 6443 2380 (etcd)端口,节点间需开放 10250 等端口。如 果配置的是公网地址,需要开放端口
  • 其他:关闭 Swap、禁用 SELinux(CentOS)、配置静态 IP

配置主机名与 Hosts 解析(跨云互通关键,如果两台机器属于不同的云)
需让两台服务器通过主机名识别彼此,避免依赖公网 DNS:

# -------------------------- Master 节点(腾讯云)执行 --------------------------
# 设置主机名(如 k8s-master)
hostnamectl set-hostname k8s-master

# 编辑 /etc/hosts,添加两台节点的映射(替换为实际私网IP)
cat >> /etc/hosts << EOF
10.0.0.10  k8s-master  # 腾讯云 Master 私网IP
172.16.0.20 k8s-worker # 阿里云 Worker 私网IP
EOF

# -------------------------- Worker 节点(阿里云)执行 --------------------------
# 设置主机名(如 k8s-worker)
hostnamectl set-hostname k8s-worker

# 编辑 /etc/hosts,添加两台节点的映射(替换为实际私网IP)
cat >> /etc/hosts << EOF
10.0.0.10  k8s-master  # 腾讯云 Master 私网IP
172.16.0.20 k8s-worker # 阿里云 Worker 私网IP
EOF

验证:
主机名:hostname,Master 输出 k8s-master,Worker 输出 k8s-worker
互通性:Master 执行 ping k8s-worker -c 3,Worker 执行 ping k8s-master -c 3,均需通(无丢包)

2. 环境初始化(所有节点执行

(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 为例)

  1. 安装 containerd
dnf install -y containerd.io

验证:

rpm -q containerd.io

应显示已安装的版本号
2. 配置 containerd

containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd

AI /etc/containerd/config.toml 配置阿里镜像

# 验证配置是否生效
sudo ctr -n k8s.io images pull registry.k8s.io/pause:3.6

containerd v1.5+ 中 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 配置格式已过时,未来在 v2.0 中将被移除,推荐使用 config_path 方式配置镜像仓库

手动导入 pause:3.6 镜像(彻底绕开网络)
如果镜像源仍不生效,直接下载并导入镜像到 containerd:

# 1. 下载阿里云 pause:3.6 镜像(保存为本地文件)
sudo ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.6
sudo ctr -n k8s.io images export pause_3.6.tar registry.aliyuncs.com/google_containers/pause:3.6

# 2. 删除可能存在的错误镜像引用
sudo ctr -n k8s.io images rm us-west2-docker.pkg.dev/k8s-artifacts-prod/images/pause:3.6
sudo ctr -n k8s.io images rm registry.k8s.io/pause:3.6

# 3. 重新导入并标记
sudo ctr -n k8s.io images import pause_3.6.tar
sudo ctr -n k8s.io images tag \
  registry.aliyuncs.com/google_containers/pause:3.6 \
  us-west2-docker.pkg.dev/k8s-artifacts-prod/images/pause:3.6
sudo ctr -n k8s.io images tag \
  registry.aliyuncs.com/google_containers/pause:3.6 \
  registry.k8s.io/pause:3.6
sudo ctr -n k8s.io images pull registry.k8s.io/pause:3.6

若输出同时包含 registry.aliyuncs.com、us-west2-docker.pkg.dev 和 registry.k8s.io 的 pause:3.6 镜像,则配置生效。
总结
错误原因是镜像源配置未覆盖 us-west2-docker.pkg.dev 仓库,或 containerd 仍优先尝试远程拉取。解决关键:

用新规范配置 certs.d 目录,覆盖所有相关仓库;
手动导入并标记镜像,确保本地存在目标镜像;
禁用远程拉取,强制使用本地镜像。

配置国内镜像(注意格式对齐,不然会报错),否则可能会拉取不到

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
   endpoint = ["https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub.docker.com"]

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
   endpoint = ["https://registry.aliyuncs.com/google_containers"]

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
   endpoint = ["https://registry.aliyuncs.com/google_containers"]

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
   endpoint = ["https://quay.mirrors.ustc.edu.cn"]

验证:

systemctl status containerd

应显示 “active (running)”

3. 安装 kubeadm、kubelet、kubectl(所有节点

# 对于 CentOS 8/Rocky Linux 8,使用阿里云源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# 安装 1.27.4 版本(可替换为其他稳定版本)
sudo dnf install -y kubelet-1.27.4 kubeadm-1.27.4 kubectl-1.27.4 --disableexcludes=kubernetes

防止自动升级版本

sudo yum versionlock add kubelet kubeadm kubectl

部署控制平面节点(主节点)

  1. 初始化控制平面
    –apiserver-advertise-address=47.100.169.179 此处的ip是部署的master ip(确保其他节点能够访问)
#提前拉取镜像,加快安装(此步骤可做可不做)
#master节点提前拉取镜像,这里使用阿里云的镜像
kubeadm  config images list --kubernetes-version=v1.28.2  --image-repository=registry.aliyuncs.com/google_containers
kubeadm  config images pull --kubernetes-version=v1.28.2  --image-repository=registry.aliyuncs.com/google_containers

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///run/containerd/containerd.sock --kubernetes-version=v1.28.2

参数说明:
–apiserver-advertise-address=47.100.169.179 \ #指定apiserver的IP,即master节点的IP
–image-repository registry.aliyuncs.com/google_containers \ #设置镜像仓库为国内的阿里云镜像仓库
–kubernetes-version v1.27.4 \ #设置k8s的版本,跟步骤三的kubeadm版本一致
–service-cidr=10.96.0.0/12 \ #这是设置node节点的网络的,暂时这样设置
–pod-network-cidr=10.244.0.0/16 #这是设置node节点的网络的,暂时这样设置

说明:部分云厂商(如阿里云、腾讯云)的 ECS 实例默认禁止公网 IP 绑定到进程,需在安全组中单独配置允许 6443 端口的入站规则。

指定的公网 IP 不属于当前节点的网络接口(即节点本身没有这个公网 IP 可通过 ip addr 命令查看)。
kube-apiserver 需要绑定到节点实际存在的 IP 上,若公网 IP 是通过网关 / 负载均衡器映射的(如节点只有内网 IP,公网 IP 是云厂商的弹性 IP),直接绑定会失败。

核心配置思路
API 服务器绑定节点内网 IP:让 kube-apiserver 绑定到节点实际存在的内网 IP(确保能正常启动)。
对外网端点对外暴露:通过 --control-plane-endpoint 指定公网 IP 作为集群对外的访问端点(供外部节点 join 使用)。
通过配置文件同时指定内网绑定 IP 和公网端点,确保参数兼容:

cat > kubeadm-config.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.0.4.9  # 节点实际内网 IP(必须存在于节点网卡)
  bindPort: 6443
nodeRegistration:
  name: k8s-master  # 节点名称(可自定义)
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.28.0  # 替换为你的 Kubernetes 版本
controlPlaneEndpoint: "124.221.182.26:6443"  # 公网 IP:端口(弹性 IP 或负载均衡器地址)
networking:
  podSubnet: 10.244.0.0/16  # 与容器网络插件匹配(如 flannel 用此网段)
certificateSANs:  # 证书中必须包含公网 IP,否则 HTTPS 验证失败
- "124.221.182.26"  # 公网 IP
- "10.0.4.9"        # 内网 IP(确保集群内部通信)
- "localhost"
- "127.0.0.1"
EOF

使用配置文件初始化,避免直接在命令行指定冲突参数:

sudo kubeadm init --config=kubeadm-config.yaml

配置网关 / 负载均衡器端口转发
由于 API 服务器实际绑定在内网 IP:6443,需让公网 IP 的 6443 端口流量转发到内网 IP:6443:
云厂商弹性 IP:在云控制台配置 “端口转发” 或 “DNAT 规则”,将公网 IP:6443 转发到节点内网 IP:6443。
自建网关:通过 iptables 配置端口转发(在网关节点执行)

# 将公网 IP(124.221.182.26)的 6443 端口转发到节点内网 IP(10.0.4.9)的 6443 端口
sudo iptables -t nat -A PREROUTING -d 124.221.182.26 -p tcp --dport 6443 -j DNAT --to-destination 10.0.4.9:6443
# 查看 API 服务器的启动参数(确认绑定的是内网 IP)
sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep advertise-address

# 检查证书是否包含公网 IP(需安装 cfssl)
cfssl-certinfo -cert /etc/kubernetes/pki/apiserver.crt | grep 124.221.182.26

查看kubelet日志

journalctl -xeu kubelet

在这里插入图片描述
在这里插入图片描述
显示启动成功。

初始化成功后,会输出 节点加入命令(含 token),请复制保存(后续工作节点需要)。
若忘记命令,可在主节点重新生成:

sudo kubeadm token create --print-join-command
  1. 配置 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
  1. 安装网络插件(主节点

K8s 需网络插件实现 Pod 间通信,此处部署 Calico:
网络插件选择flannel或者cni (正式环境用cni)

没有安装cni
failed to reload cni configuration after receiving fs change event(“/etc/cni/net.d”: REMOVE)" error="cni config load failed: no network config
安装 Calico CNI 插件
下载 Calico 配置文件

# 下载 Calico 配置文件(适配 1.28 版本)
curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml

# 修改配置:指定 Pod 网络网段(与初始化时 --pod-network-cidr 一致)
sed -i 's/10.244.0.0\/16/10.244.0.0\/16/' calico.yaml # 若默认已为该值,可跳过

# 部署 Calico
kubectl apply -f calico.yaml

部署完成后,Calico 会自动在/etc/cni/net.d/目录下生成相应的配置文件。

	# 1. 从官方仓库拉取 Calico CNI 镜像(若网络允许)
sudo crictl pull docker.io/calico/cni:v3.29.2

# 2. 拉取 Calico 其他必要镜像
sudo crictl pull docker.io/calico/node:v3.29.2
sudo crictl pull docker.io/calico/kube-controllers:v3.29.2


# 3. 若官方仓库访问困难,使用国内镜像(如腾讯云镜像)
sudo crictl pull mirror.ccs.tencentyun.com/calico/cni:v3.29.2
sudo ctr -n k8s.io images tag mirror.ccs.tencentyun.com/calico/cni:v3.29.2 docker.io/calico/cni:v3.29.2

sudo crictl pull mirror.ccs.tencentyun.com/calico/node:v3.29.2
sudo ctr -n k8s.io images tag mirror.ccs.tencentyun.com/calico/node:v3.29.2 docker.io/calico/node:v3.29.2

sudo crictl pull mirror.ccs.tencentyun.com/calico/kube-controllers:v3.29.2
sudo ctr -n k8s.io images tag mirror.ccs.tencentyun.com/calico/kube-controllers:v3.29.2 docker.io/calico/kube-controllers:v3.29.2

等待 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-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: 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 个控制平面节点实现高可用)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值