国内阿里云环境ubuntu22安装k8s1.32
区分VMware虚拟机(无GPU) 和 物理服务器(有GPU P100),并附上 k8s 安装的 apt/yum 源配置。
备注:后续calico 和 gpu没写完
前面镜像都是验证过的 主要是 yaml和镜像替换注意细心一些
一、系统源配置(阿里云官方源)
优化内核 系统初始化
bash
#!/bin/bash
set -e
# 1. 设置主机名
hostnamectl set-hostname k8s-gpu-teacher
# 2. 关闭 swap
swapoff -a
sed -ri '/\sswap\s/ s/^#?/#/' /etc/fstab
# 3. 加载内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
vfio
vfio_pci
EOF
modprobe overlay
modprobe br_netfilter
modprobe vfio
modprobe vfio_pci
# 4. 内核参数优化(K8s + KubeVirt + GPU直通)
cat > /etc/sysctl.d/k8s.conf <<EOF
# K8s 要求
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
# 性能优化
vm.max_map_count = 262144
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 524288
kernel.pid_max = 65536
# 网络优化
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384
EOF
sysctl --system
# 5. 安装基础工具
apt-get update
apt-get install -y containerd net-tools curl wget vim git htop \
bash-completion openssh-server lvm2 nfs-common
Ubuntu 22.04 阿里源
bash
# 替换为阿里云 apt 源
sudo tee /etc/apt/sources.list <<'EOF'
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF
# 添加 k8s 阿里云 apt 源
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/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://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
CentOS / Rocky 8/9 阿里源
bash
# 替换为阿里云 yum 源
cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF'
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/RPM-GPG-KEY-CentOS-Official
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/RPM-GPG-KEY-CentOS-Official
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/
gpgcheck=0
EOF
# 添加 k8s 阿里云 yum 源
cat > /etc/yum.repos.d/kubernetes.repo <<'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache
二、安装 containerd 并配置(不搞镜像加速,只拉官方地址)
bash
# Ubuntu
sudo apt-get install -y containerd
apt-get install -y kubelet=1.32.10-1.1 kubeadm=1.32.10-1.1 kubectl=1.32.10-1.1
systemctl enable kubelet
# CentOS
# sudo yum install -y containerd
# 生成配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改 cgroup 驱动(k8s 需要)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启 containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd
三、直接拉取镜像(国内阿里云地址 + quay.io)
所有镜像均使用 ctr image pull 直接从原始仓库拉取,不走任何代理或加速器(如果 quay.io 慢,那是国内自然现象,但阿里云仓库很快)。
📦 1. Kubernetes 核心组件(从阿里云官方 google_containers 拉取)
bash
ctr image pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.32.10
ctr image pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.32.10
ctr image pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.32.10
ctr image pull registry.aliyuncs.com/google_containers/kube-proxy:v1.32.10
ctr image pull registry.aliyuncs.com/google_containers/etcd:3.5.16-0
ctr image pull registry.aliyuncs.com/google_containers/coredns:v1.11.3
ctr image pull registry.aliyuncs.com/google_containers/pause:3.10
🧩 2. KubeVirt v1.7.0(从 quay.io 拉取)
bash
ctr image pull quay.io/kubevirt/virt-operator:v1.7.0
ctr image pull quay.io/kubevirt/virt-api:v1.7.0
ctr image pull quay.io/kubevirt/virt-controller:v1.7.0
ctr image pull quay.io/kubevirt/virt-handler:v1.7.0
ctr image pull quay.io/kubevirt/virt-launcher:v1.7.0
📦 3. CDI(容器数据导入器,KubeVirt 依赖)
bash
ctr image pull quay.io/kubevirt/cdi-operator:v1.60.0
ctr image pull quay.io/kubevirt/cdi-controller:v1.60.0
ctr image pull quay.io/kubevirt/cdi-importer:v1.60.0
ctr image pull quay.io/kubevirt/cdi-cloner:v1.60.0
ctr image pull quay.io/kubevirt/cdi-apiserver:v1.60.0
ctr image pull quay.io/kubevirt/cdi-uploadproxy:v1.60.0
ctr image pull quay.io/kubevirt/cdi-uploadserver:v1.60.0
🌐 4. Calico 网络插件(从 quay.io/calico 拉取)
bash
ctr image pull quay.io/calico/node:v3.29.1
ctr image pull quay.io/calico/cni:v3.29.1
ctr image pull quay.io/calico/kube-controllers:v3.29.1
ctr image pull quay.io/calico/typha:v3.29.1
🎮 5. NVIDIA GPU Operator(仅物理服务器,从 nvcr.io 拉取)
bash
ctr image pull nvcr.io/nvidia/gpu-operator:v23.9.2
ctr image pull nvcr.io/nvidia/k8s-device-plugin:v0.14.5
ctr image pull nvcr.io/nvidia/driver:535.161.08-ubuntu22.04 # 适配 Ubuntu
💾 6. 虚拟机演示镜像(可选,测试用)
bash
ctr image pull quay.io/containerdisks/ubuntu:22.04
ctr image pull quay.io/containerdisks/centos-stream:9
ctr image pull docker.io/cirros:latest
# KubeVirt + 常用测试镜像(国内环境可用)
ctr image pull quay.io/containerdisks/centos:7 && \
ctr image pull quay.io/containerdisks/rocky:8 && \
ctr image pull quay.io/containerdisks/rocky:9 && \
ctr image pull quay.io/containerdisks/ubuntu:22.04 && \
ctr image pull docker.io/cirros:latest && \
ctr image pull quay.io/fedora/fedora-coreos-kubevirt:stable && \
ctr image pull docker.io/alpine:latest && \
ctr image pull quay.io/kubevirt/virt-operator:v1.2.0 && \
ctr image pull quay.io/kubevirt/virt-api:v1.2.0 && \
ctr image pull quay.io/kubevirt/virt-controller:v1.2.0 && \
ctr image pull quay.io/kubevirt/virt-handler:v1.2.0 && \
ctr image pull quay.io/kubevirt/virt-launcher:v1.2.0 && \
ctr image pull quay.io/kubevirt/cdi-operator:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-controller:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-importer:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-cloner:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-apiserver:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-uploadproxy:v1.58.0 && \
ctr image pull quay.io/kubevirt/cdi-uploadserver:v1.58.0
# 完成
echo "所有镜像拉取完毕"
# 备用源
ctr image pull m.daocloud.io/quay.io/containerdisks/centos:7
四、查看已拉取的镜像
bash
ctr image ls | grep -E "registry.aliyuncs.com|quay.io|nvcr.io"
如果列表齐全,就可以继续部署集群了。
五、快速部署命令(国内网络一键跑通)
🖥️ VMware 虚拟机(无 GPU)
bash
# 初始化镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
# 初始化(使用阿里云镜像仓库)
kubeadm init --pod-network-cidr=10.233.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.32.10 \
--apiserver-advertise-address=<你的IP>
# 配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 允许单节点调度
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
## 后续未曾验证
# 安装 Calico
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/custom-resources.yaml
kubectl apply -f custom-resources.yaml
# 安装 KubeVirt
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v1.7.0/kubevirt-operator.yaml
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v1.7.0/kubevirt-cr.yaml
kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/v1.60.0/cdi-operator.yaml
kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/v1.60.0/cdi-cr.yaml
🖥️ 物理服务器(含 GPU P100)
在完成上述 VMware 步骤的基础上,增加:
bash
# 1. 安装 NVIDIA 官方驱动(从阿里云 yum/apt 源安装)
# Ubuntu
sudo apt-get install -y nvidia-driver-535
# CentOS
sudo yum install -y nvidia-driver-535
# 2. 重启后验证
nvidia-smi
# 3. 配置 GPU 直通(参见上一轮回答的 vfio 部分)
# 4. 部署 NVIDIA GPU Operator
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/gpu-operator/v23.9.2/deploy/gpu-operator.yaml
✅ 最终检查
bash
echo "=== 1. 内核版本 ===" && uname -r && \
> echo "" && echo "=== 2. 操作系统 ===" && cat /etc/os-release | grep -E "PRETTY_NAME|VERSION_ID" && \
> echo "" && echo "=== 3. CPU虚拟化支持 ===" && grep -E "vmx|svm" /proc/cpuinfo | head -1 || echo "未检测到虚拟化支持" && \
> echo "" && echo "=== 4. KVM模块状态 ===" && lsmod | grep -E "kvm|vfio" || echo "模块未加载" && \
> echo "" && echo "=== 5. 内核关键参数 ===" && sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward vm.max_map_count 2>/dev/null || echo "部分参数不存在" && \
> echo "" && echo "=== 6. containerd状态 ===" && systemctl is-active containerd && ls -la /var/run/containerd/containerd.sock 2>/dev/null || echo "containerd未运行" && \
> echo "" && echo "=== 7. 端口占用检查 ===" && ss -tlnp | grep -E "6443|10250|2379|2380" || echo "端口空闲" && \
> echo "" && echo "=== 8. 磁盘空间 ===" && df -h / | tail -1 && \
> echo "" && echo "=== 9. 内存信息 ===" && free -h && \
> echo "" && echo "=== 10. 主机名解析 ===" && hostname -f && ping -c 1 $(hostname) 2>&1 | head -2 && \
> echo "" && echo "=== 11. IOMMU检查 ===" && dmesg | grep -E "IOMMU enabled|DMAR:" | head -2 || echo "未开启或未检测" && \
> echo "" && echo "=== 12. AppArmor状态 ===" && systemctl is-active apparmor && \
> echo "" && echo "=== 完成 ==="
=== 1. 内核版本 ===
5.15.0-176-generic
=== 2. 操作系统 ===
PRETTY_NAME="Ubuntu 22.04.5 LTS"
VERSION_ID="22.04"
=== 3. CPU虚拟化支持 ===
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm cpuid_fault pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep arat md_clear flush_l1d arch_capabilities ibpb_exit_to_user
=== 4. KVM模块状态 ===
kvm_intel 372736 0
kvm 1040384 1 kvm_intel
=== 5. 内核关键参数 ===
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.max_map_count = 262144
=== 6. containerd状态 ===
active
srw-rw---- 1 root root 0 Jun 14 00:38 /var/run/containerd/containerd.sock
=== 7. 端口占用检查 ===
LISTEN 0 32768 *:10250 *:* users:(("kubelet",pid=59042,fd=14))
=== 8. 磁盘空间 ===
/dev/mapper/ubuntu--vg-ubuntu--lv 38G 19G 18G 51% /
=== 9. 内存信息 ===
total used free shared buff/cache available
Mem: 7.7Gi 408Mi 138Mi 1.0Mi 7.2Gi 7.0Gi
Swap: 0B 0B 0B
=== 10. 主机名解析 ===
k8s-gpu-teacher
PING k8s-gpu-teacher (192.168.1.12) 56(84) bytes of data.
64 bytes from k8s-gpu-teacher (192.168.1.12): icmp_seq=1 ttl=64 time=0.031 ms
=== 11. IOMMU检查 ===
=== 12. AppArmor状态 ===
active
=== 完成 ===
# 节点状态
kubectl get nodes -o wide
# KubeVirt pod 状态
kubectl get pods -n kubevirt
# GPU 资源(如果有)
kubectl get nodes -o json | jq '.items[].status.capacity."nvidia.com/gpu"'
好的,我们终于成功了!现在给你清晰、正确的后续命令,并解释原理。
✅ 集群初始化状态确认
你已经看到 Your Kubernetes control-plane has initialized successfully!,说明 kubeadm init 成功。接下来只需配置访问权限、部署网络插件、测试、然后加 GPU 支持。
1. 配置 kubectl 访问权限
bash
# 方法一:直接拷贝配置文件(推荐)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 方法二:如果你是 root 用户,也可以导出环境变量
# export KUBECONFIG=/etc/kubernetes/admin.conf
原理 :admin.conf 包含管理员证书和 API Server 地址,kubectl 用它进行认证和通信。
2. 开启 kubectl 自动补全(临时 + 永久)
bash
# 安装 bash-completion(如果还没装)
apt-get install -y bash-completion
# 临时生效(当前会话)
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
# 添加快捷别名 k
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
# 测试:输入 k get <Tab><Tab> 查看补全效果
原理 :kubectl completion bash 输出一个 bash 函数,注册到 shell 中,按 Tab 时自动补全子命令、资源名称等。
3. 部署 Calico 网络插件(解决节点 NotReady 问题)
当前节点很可能 NotReady,因为没有 CNI 网络。部署 Calico:
bash
# 安装 Tigera Calico Operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/tigera-operator.yaml
# 安装 Calico 定制资源(使用你的 Pod CIDR 10.233.0.0/16)
curl -s https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/custom-resources.yaml | \
sed 's/192.168.0.0\/16/10.233.0.0\/16/g' | kubectl create -f -
等待 1-2 分钟后检查:
bash
watch kubectl get pods -n calico-system
# 所有 Pod 变成 Running 后,按 Ctrl+C 退出
然后检查节点状态:
bash
kubectl get nodes
# 应该显示 Ready
原理 :Calico 在每个节点上运行 agent,配置路由和 iptables 规则,实现 Pod 跨节点通信。podSubnet 必须与初始化时的 --pod-network-cidr 一致。
4. 允许控制平面节点调度普通 Pod(单节点集群必须)
bash
# 移除 master 节点上的污点(taint)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# 验证
kubectl describe node | grep -i taint
# 应该没有输出(或显示 <none>)
原理:默认 master 节点有污点,普通 Pod 不会被调度上去。移除后,单节点也可以运行工作负载。
5. 测试部署一个 Nginx Deployment
bash
# 创建 deployment
kubectl create deployment nginx --image=nginx:latest --replicas=2
# 暴露服务(可选,便于测试)
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看资源
kubectl get pods -o wide
kubectl get svc
# 测试访问(通过 NodePort,端口通常 3xxxx)
curl $(hostname -I | awk '{print $1}'):$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}')
原理:Deployment 管理 Pod 副本,Service 提供稳定访问入口。
6. 安装 GPU 直通支持(Tesla P100)
你的 P100 不支持 vGPU,只能整个卡直通给某一台虚拟机。以下是完整步骤:
6.1 安装 NVIDIA 驱动
bash
# 添加官方驱动 PPA
add-apt-repository ppa:graphics-drivers/ppa -y
apt update
# 安装推荐驱动(535 稳定版)
apt install -y nvidia-driver-535
# 重启
reboot
重启后验证:nvidia-smi 应显示 P100 状态。
6.2 启用 IOMMU(用于直通)
bash
# 编辑 grub
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& intel_iommu=on iommu=pt/' /etc/default/grub
update-grub
reboot
6.3 绑定 vfio-pci 驱动
bash
# 获取显卡 PCI ID(例如 10de:15f7)
lspci -nn | grep -i nvidia
# 写入 vfio 配置
echo "options vfio-pci ids=10de:15f7" > /etc/modprobe.d/vfio.conf
update-initramfs -u
reboot
6.4 配置 KubeVirt 允许使用该 PCI 设备
bash
# 编辑 KubeVirt 配置
kubectl -n kubevirt edit kubevirt kubevirt
添加以下内容到 spec.configuration 下:
yaml
spec:
configuration:
permittedHostDevices:
pciHostDevices:
- pciVendorSelector: "10DE:15F7"
resourceName: "nvidia.com/P100"
保存退出后,KubeVirt 会重新加载配置。
6.5 标记节点 GPU 资源
bash
# 手动打补丁
kubectl patch node k8s-gpu-teacher --type='json' -p='[{"op": "add", "path": "/status/capacity/nvidia.com/P100", "value": "1"}]'
6.6 创建带 GPU 的虚拟机示例
yaml
# gpu-vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: gpu-vm
spec:
running: true
template:
spec:
domain:
devices:
hostDevices:
- name: gpu
deviceName: nvidia.com/P100
resources:
requests:
memory: 8Gi
cpu: 2
volumes:
- name: containerdisk
containerDisk:
image: quay.io/containerdisks/ubuntu:22.04
- name: cloudinit
cloudInitNoCloud:
userData: |
#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
应用:
bash
kubectl apply -f gpu-vm.yaml
virtctl start gpu-vm
virtctl console gpu-vm
7. 总结原理(简洁版)
| 组件 | 作用 |
|---|---|
kubeadm init |
生成 PKI 证书、kubeconfig,启动控制平面容器(apiserver、scheduler、etcd 等) |
admin.conf |
集群管理员凭证,kubectl 用它连接 API Server |
| Calico | 实现 CNI 网络,分配 Pod IP、设置路由规则 |
| 移除污点 | 允许单节点调度 Pod,否则 Node 会一直 NotReady |
| GPU 直通 | 通过 vfio-pci 将物理显卡透传给虚拟机,无需修改驱动 |
8. 快速验证脚本(可选)
bash
#!/bin/bash
echo "== 1. 节点状态"
kubectl get nodes
echo "== 2. 系统 Pod"
kubectl get pods -n kube-system
echo "== 3. Calico Pod"
kubectl get pods -n calico-system
echo "== 4. 测试 Deployment"
kubectl create deployment hello --image=nginx --replicas=2
sleep 5
kubectl get pods -l app=hello
kubectl delete deployment hello
附录:搞定yaml和后续的镜像问题
一、先复制镜像到 k8s.io 命名空间
bash
# 1. 复制 Calico 镜像
for img in quay.io/calico/node:v3.29.1 quay.io/calico/cni:v3.29.1 quay.io/calico/kube-controllers:v3.29.1 quay.io/calico/typha:v3.29.1; do
ctr image tag $img k8s.io/$img
done
# 2. 复制 KubeVirt 镜像
for img in quay.io/kubevirt/virt-operator:v1.7.0 quay.io/kubevirt/virt-api:v1.7.0 quay.io/kubevirt/virt-controller:v1.7.0 quay.io/kubevirt/virt-handler:v1.7.0 quay.io/kubevirt/virt-launcher:v1.7.0; do
ctr image tag $img k8s.io/$img
done
# 3. 复制 CDI 镜像
for img in quay.io/kubevirt/cdi-operator:v1.60.0 quay.io/kubevirt/cdi-controller:v1.60.0 quay.io/kubevirt/cdi-importer:v1.60.0 quay.io/kubevirt/cdi-cloner:v1.60.0 quay.io/kubevirt/cdi-apiserver:v1.60.0 quay.io/kubevirt/cdi-uploadproxy:v1.60.0 quay.io/kubevirt/cdi-uploadserver:v1.60.0; do
ctr image tag $img k8s.io/$img
done
# 4. 验证复制成功
ctr -n k8s.io image ls | grep -E "kubevirt|calico|cdi"
二、下载 YAML 文件
找一台能访问 GitHub 的机器执行:
bash
# 创建目录
mkdir -p ~/k8s-yaml && cd ~/k8s-yaml
# 下载 Calico
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/tigera-operator.yaml
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/custom-resources.yaml
# 下载 KubeVirt
curl -LO https://github.com/kubevirt/kubevirt/releases/download/v1.7.0/kubevirt-operator.yaml
curl -LO https://github.com/kubevirt/kubevirt/releases/download/v1.7.0/kubevirt-cr.yaml
# 下载 CDI
curl -LO https://github.com/kubevirt/containerized-data-importer/releases/download/v1.60.0/cdi-operator.yaml
curl -LO https://github.com/kubevirt/containerized-data-importer/releases/download/v1.60.0/cdi-cr.yaml
把这些 YAML 文件传到你的服务器 (比如用 scp 或 U 盘),然后放在 /root/k8s-yaml/ 目录下。
三、修改 YAML 镜像地址(关键)
由于你的镜像就是原始 quay.io/xxx 地址,不需要改镜像名,但需要确保 containerd 能拉到本地已存在的镜像。执行以下命令直接部署:
bash
# 进入 YAML 目录
cd /root/k8s-yaml
# 1. 部署 Calico
kubectl create -f tigera-operator.yaml
# 修改 custom-resources.yaml 中的 pod CIDR 为 10.233.0.0/16
sed -i 's/192.168.0.0\/16/10.233.0.0\/16/g' custom-resources.yaml
kubectl create -f custom-resources.yaml
# 2. 等待 Calico Pod 启动
watch kubectl get pods -n calico-system
# 按 Ctrl+C 退出
# 3. 部署 KubeVirt
kubectl create -f kubevirt-operator.yaml
kubectl create -f kubevirt-cr.yaml
kubectl create -f cdi-operator.yaml
kubectl create -f cdi-cr.yaml
# 4. 等待 KubeVirt Pod 启动
watch kubectl get pods -n kubevirt
四、如果 YAML 下载不了,我给你核心内容
由于我无法直接提供文件内容,给你两个选择:
选项 A:使用镜像代理加速 GitHub
bash
# 在服务器上直接下载(通过代理)
export https_proxy=http://你的代理IP:端口
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.29/manifests/tigera-operator.yaml
# 下载完成后取消代理
unset https_proxy
选项 B:使用 gitee 镜像(如果有)
bash
# 尝试使用 gitee 上的镜像(需要你自己找)
# 例如:git clone https://gitee.com/mirrors/calico.git
五、完整一键部署脚本(前提:YAML 已准备好)
bash
#!/bin/bash
set -e
echo "=== 开始部署 Calico + KubeVirt ==="
# 1. 确保镜像在 k8s.io 命名空间
ctr image tag quay.io/calico/node:v3.29.1 k8s.io/quay.io/calico/node:v3.29.1 || true
# ... (按上面复制命令执行)
# 2. 部署 Calico
kubectl apply -f /root/k8s-yaml/tigera-operator.yaml
sed -i 's/192.168.0.0\/16/10.233.0.0\/16/g' /root/k8s-yaml/custom-resources.yaml
kubectl apply -f /root/k8s-yaml/custom-resources.yaml
# 3. 等待 Calico 就绪
echo "等待 Calico 就绪..."
sleep 60
kubectl wait --for=condition=available --timeout=180s deployment -n calico-system calico-kube-controllers || true
# 4. 部署 KubeVirt
kubectl apply -f /root/k8s-yaml/kubevirt-operator.yaml
sleep 10
kubectl apply -f /root/k8s-yaml/kubevirt-cr.yaml
kubectl apply -f /root/k8s-yaml/cdi-operator.yaml
kubectl apply -f /root/k8s-yaml/cdi-cr.yaml
echo "=== 部署完成 ==="
kubectl get pods -n calico-system
kubectl get pods -n kubevirt
总结:calico is ok
好的,我明白了。您希望我总结一下这次 Calico 部署过程中遇到的"镜像命名空间"陷阱,以及后续部署 KubeVirt 时如何避免类似问题。
📌 核心教训:containerd 命名空间隔离
现象 :镜像明明已经 ctr image ls 看到了,Pod 却一直 ImagePullBackOff,报错 dial tcp i/o timeout(去 docker.io 拉取)。
根本原因:
ctr命令默认操作default命名空间- Kubelet 只从
k8s.io命名空间读取镜像 - 您的所有镜像都在
default命名空间,Kubelet 根本看不见
验证方法:
bash
# 查看 default 命名空间(您手动拉取的镜像)
ctr image ls | grep calico
# 查看 k8s.io 命名空间(Kubelet 实际能看到的)
ctr -n k8s.io image ls | grep calico
解决方法 :将镜像导出再导入到 k8s.io 命名空间
bash
ctr image export /tmp/calico-node.tar docker.io/calico/node:v3.29.1
ctr -n k8s.io image import /tmp/calico-node.tar
📦 Calico v3.29.1 需要的全部镜像(共8个)
| 镜像 | 用途 |
|---|---|
quay.io/tigera/operator:v1.36.2 |
Tigera Operator |
docker.io/calico/node:v3.29.1 |
Calico 主进程 |
docker.io/calico/typha:v3.29.1 |
Typha 代理 |
docker.io/calico/cni:v3.29.1 |
CNI 插件 |
docker.io/calico/kube-controllers:v3.29.1 |
K8s 控制器 |
docker.io/calico/pod2daemon-flexvol:v3.29.1 |
FlexVolume 驱动 |
docker.io/calico/csi:v3.29.1 |
CSI 存储驱动 |
docker.io/calico/node-driver-registrar:v3.29.1 |
CSI 注册器 |
这8个镜像都必须同时存在于 default 和 k8s.io 两个命名空间,Kubelet 才能正常拉取。
🚀 后续部署 KubeVirt 的预防措施
KubeVirt 的镜像也在 quay.io/kubevirt/,同样会面临命名空间问题。
建议在部署 KubeVirt 前,一次性将所有 KubeVirt 镜像也导入到 k8s.io 命名空间:
bash
# 1. 拉取 KubeVirt 镜像(如果您已经有,跳过拉取)
for img in virt-operator virt-api virt-controller virt-handler virt-launcher; do
ctr image pull quay.io/kubevirt/$img:v1.7.0
done
# 2. 批量导入到 k8s.io
for img in virt-operator virt-api virt-controller virt-handler virt-launcher; do
ctr image export /tmp/$img.tar quay.io/kubevirt/$img:v1.7.0
ctr -n k8s.io image import /tmp/$img.tar
rm /tmp/$img.tar
done
# 3. 验证
ctr -n k8s.io image ls | grep kubevirt
CDI 镜像同理。
✅ 验证 Calico 最终状态
bash
# 节点状态应为 Ready
kubectl get nodes
# 所有 Pod Running
kubectl get pods -n calico-system
您刚才的输出显示全部正常,Calico 已经成功了。
🧠 记忆口诀
ctr不加-n是default,Kubelet 只看k8s.io。
镜像导出再导入,两个空间都要有。
接下来部署 KubeVirt 时,先检查 ctr -n k8s.io image ls | grep kubevirt,如果为空,提前导入。