**国内阿里云环境**ubuntu22安装k8s1.32

国内阿里云环境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个镜像都必须同时存在于 defaultk8s.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 不加 -ndefault,Kubelet 只看 k8s.io
镜像导出再导入,两个空间都要有。

接下来部署 KubeVirt 时,先检查 ctr -n k8s.io image ls | grep kubevirt,如果为空,提前导入。

相关推荐
精益数智小屋12 小时前
项目管理看板如何拆解任务进度?项目管理看板解决跨部门协作难题
大数据·人工智能·数据分析·云计算·软件工程
蘋天纬地14 小时前
k8s的控制平面是什么,有什么作用
容器·kubernetes
tiancaijiben16 小时前
阿里云服务器部署WordPress全程指南(2026最新)
云计算
无级程序员16 小时前
clklog地域分析中的地名中英文对照问题解决
kubernetes
tiancaijiben17 小时前
阿里云Dataphin(智能数据建设与治理)对接配置流程
云计算
tiancaijiben18 小时前
阿里云云防火墙配置全流程指南:从开通到精细化防护
云计算
BAGAE19 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
tiancaijiben20 小时前
K8s集群高可用:阿里云ACK节点池管理与自动伸缩组件HPA/VPA配置
云计算
yyuuuzz21 小时前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache