K8s 三节点集群部署(含轩辕镜像加速)

适用:Ubuntu 24.04 ×3 | containerd 2.x | K8s v1.30.14 | Calico v3.27.0

## 📋 节点规划

角色

IP

主机名

配置

Master

192.168.7.70

k8s-master

2C/2G+

Node1

192.168.7.71

k8s-node1

1C/2G+

Node2

192.168.7.72

k8s-node2

1C/2G+

📦 轩辕镜像加速地址 (付费专属地址)

仓库

加速地址

Docker Hub

https://gfbe9mm2xqo0wqw6ze.xuanyuan.dev/v2

K8s 官方仓库

https://gfbe9mm2xqo0wqw6ze-k8s.xuanyuan.dev/v2

GCR

https://gfbe9mm2xqo0wqw6ze-gcr.xuanyuan.dev/v2

⚠️ 重要提醒

  • 第 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

十三、节点标签的作用说明

作用

说明

角色标识

让 kubectl get nodes 的 ROLES 列清晰显示节点类型

节点选择器

指定 Pod 只调度到带有特定标签的节点(如 gpu=true)

亲和性调度

控制 Pod 之间的聚散(如同区域部署)

运维管理

标记节点状态(如 maintenance=true)

资源隔离

按硬件类型分组(如 disk=ssd、gpu=true)

⚠️ 注意:标签是在 Master 节点上通过 kubectl label 命令打的,存储在集群 etcd 中,实时生效,无需重启节点。

十四、部署成功后的集群信息

项目

信息

K8s 版本

v1.30.14

节点数

3(1 Master + 2 Worker)

CNI 插件

Calico v3.27.0

容器运行时

containerd 2.x

Pod 网段

10.244.0.0/16

Service 网段

10.96.0.0/12

API Server

https://192.168.7.70:6443

十五、重要提醒

项目

说明

Token 有效期

join token 有效期 24 小时,过期后重新生成

证书有效期

默认 1 年,到期前需要更新

配置修改

修改 /etc/containerd/ 下任何配置后,必须 systemctl restart containerd

备份

建议备份 /etc/kubernetes/ 目录下的配置文件