K8s 三节点集群部署(含轩辕镜像加速)
适用:Ubuntu 24.04 ×3 | containerd 2.x | K8s v1.30.14 | Calico v3.27.0
## 📋 节点规划
📦 轩辕镜像加速地址 (付费专属地址)
⚠️ 重要提醒
第 1~3 步每台节点都要执行(Master + Node1 + Node2)
修改 containerd 配置后必须重启 containerd 才能生效
kubeadm init成功后立即保存 join 命令(token 24h 有效)v1.30 对应 pause 3.9
一、系统初始化(每台执行)
# 1) 关 swap
swapoff -a
sed -i '/swap/d' /etc/fstab
# 2) 设置主机名(按节点执行对应命令)
hostnamectl set-hostname k8s-master # 在 k8s-master 上执行
hostnamectl set-hostname k8s-node1 # 在 k8s-node1 上执行
hostnamectl set-hostname k8s-node2 # 在 k8s-node2 上执行
# 3) 配置 hosts(三台都写全)
cat >> /etc/hosts << EOF
192.168.7.70 k8s-master
192.168.7.71 k8s-node1
192.168.7.72 k8s-node2
EOF
# 4) 时间与内核参数
timedatectl set-timezone Asia/Shanghai
modprobe overlay && modprobe br_netfilter
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
EOF
sysctl --system二、安装并配置 containerd(每台执行)
# 安装 containerd
apt update && apt install -y containerd
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# ① cgroup 驱动统一 systemd
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# ② pause 镜像改阿里(v1.30 对应 pause:3.9)
sed -i "s|sandbox = 'registry.k8s.io/pause:3.9'|sandbox = 'registry.aliyuncs.com/google_containers/pause:3.9'|" /etc/containerd/config.toml
# 如果上面替换不成功,用下面这条(兼容不同版本默认值)
# sed -i "s|sandbox = 'registry.k8s.io/pause:3.10.1'|sandbox = 'registry.aliyuncs.com/google_containers/pause:3.9'|" /etc/containerd/config.toml
# ③ config_path 改单路径(containerd v2 不认冒号多路径)
sed -i "s|config_path = '/etc/containerd/certs.d:/etc/docker/certs.d'|config_path = '/etc/containerd/certs.d'|" /etc/containerd/config.toml
# ④ 配置镜像加速(轩辕 + 多个备用公共源)
# docker加速配置
cat > /etc/containerd/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://registry-1.docker.io"
# ============================================================
# 轩辕通道(付费主源)- 不用时注释掉下面两行即可
# ============================================================
[host."https://gfbe9mm2xqo0wqw6ze.xuanyuan.dev/v2"]
capabilities = ["pull", "resolve"]
# ============================================================
# 备用公共镜像源(免费,无需认证)—— 实测可用 2026-09
# containerd 会按顺序尝试:前面的源失败会自动切下一个;
# server = registry-1.docker.io 作为最后官方兜底(国内直连慢)。
# ============================================================
[host."https://docker.1panel.live"]
capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://docker.1ms.run"]
capabilities = ["pull", "resolve"]
EOF
# K8s加速配置
cat > /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"
# ============================================================
# 轩辕 K8s 通道(付费主源)
# 不用付费通道:把下面 [host] + capabilities 两行注释掉即可
# ============================================================
[host."https://gfbe9mm2xqo0wqw6ze-k8s.xuanyuan.dev/v2"]
capabilities = ["pull", "resolve"]
EOF
# GCR加速配置
cat > /etc/containerd/certs.d/gcr.io/hosts.toml << 'EOF'
server = "https://gcr.io"
# ============================================================
# 轩辕 GCR 通道(付费主源)
# 不用付费通道:把下面 [host] + capabilities 两行注释掉即可
# ============================================================
[host."https://gfbe9mm2xqo0wqw6ze-gcr.xuanyuan.dev/v2"]
capabilities = ["pull", "resolve"]
EOF
# ⑤ 重启 containerd(改 /etc/containerd 下任何配置后都必须重启)
systemctl restart containerd && systemctl is-active containerd
# 验证镜像加速是否生效
crictl pull registry.k8s.io/pause:3.9三、安装 kubeadm/kubelet/kubectl(每台执行)
apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | 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.30/deb/ /' > /etc/apt/sources.list.d/kubernetes.list
apt update && apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl四、初始化 Master(仅 Master)
kubeadm init \
--apiserver-advertise-address=192.168.7.70 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12⚠️ 成功末尾会输出 join 命令,立即保存!
如果失败需要重置:
kubeadm reset -f && rm -rf /etc/kubernetes/ /var/lib/etcd/ $HOME/.kube/
五、配置 kubectl(仅 Master)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes # 此时 NotReady 正常(还没装 CNI)六、安装 Calico(仅 Master)
cd /tmp
wget https://ghproxy.net/https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
# 将 Calico 默认网段 192.168.0.0/16 改为 10.244.0.0/16(与 init 一致)
sed -i 's#192.168.0.0/16#10.244.0.0/16#' calico.yaml
kubectl apply -f calico.yaml
# 等待 Calico 全部 Running(约 1-3 分钟)
watch kubectl get pods -n kube-system七、Worker 加入集群(Node1/Node2 各执行一次)
# 使用第 四 步 init 输出的真实命令
kubeadm join 192.168.7.70:6443 --token <真实token> \
--discovery-token-ca-cert-hash sha256:<真实hash>Worker 加入后若一直 NotReady,等待 1-3 分钟让 calico-node 自动部署完成即可。
八、验证集群
kubectl get nodes # 三节点全 Ready
kubectl get pods -n kube-system # 所有 Pod Running九、给 Worker 打角色标签(可选)
kubectl label node k8s-node1 node-role.kubernetes.io/worker=
kubectl label node k8s-node2 node-role.kubernetes.io/worker=十、Token 过期处理(24h 后要加新节点时)
kubeadm token create --print-join-command十一、常用运维命令速查
# 查看节点状态
kubectl get nodes
kubectl get nodes -o wide
kubectl get nodes --show-labels
# 查看系统 Pod
kubectl get pods -n kube-system
kubectl get pods -n kube-system -o wide
# 查看所有命名空间的 Pod
kubectl get pods --all-namespaces
# 查看集群信息
kubectl cluster-info
# 查看集群事件
kubectl get events --all-namespaces --sort-by='.lastTimestamp'
# 查看节点详情
kubectl describe node k8s-master
# 给节点打标签
kubectl label node k8s-node1 disk=ssd
# 查看带特定标签的节点
kubectl get nodes -l disk=ssd
# 删除标签(标签名加 -)
kubectl label node k8s-node1 disk-十二、测试集群功能
# 1. 部署测试应用
kubectl create deployment nginx-test --image=nginx:latest --replicas=3
# 2. 查看 Pod 分布
kubectl get pods -o wide
# 3. 暴露服务
kubectl expose deployment nginx-test --port=80 --type=NodePort
# 4. 查看访问端口
kubectl get svc nginx-test
# 5. 访问测试(用任意节点 IP + NodePort)
curl http://192.168.7.71:NodePort
# 6. 清理测试
kubectl delete deployment nginx-test
kubectl delete svc nginx-test十三、节点标签的作用说明
⚠️ 注意:标签是在 Master 节点上通过
kubectl label命令打的,存储在集群 etcd 中,实时生效,无需重启节点。
十四、部署成功后的集群信息
十五、重要提醒
原创
K8s 三节点集群部署
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法