我正在尝试在裸机服务器(RHEL8)中使用 containerd 构建 kubernetes。
没有互联网连接,所以我手动下载了所需的图像(例如 k8s.gcr.io/kube-scheduler:v1.22.1)并使用“ctr image import”加载它们。
图像似乎已加载成功。
#ctr images ls -q
k8s.gcr.io/coredns/coredns:v1.8.4
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/pause:3.5
然后我执行了“kubeadm init”,但因 ImagePull 错误而失败。
#kubeadm init --kubernetes-version=1.22.1 --cri-socket=/run/containerd/containerd.sock
[init] Using Kubernetes version: v1.22.1
[preflight] Running pre-flight checks
[WARNING FileExisting-tc]: tc not found in system path
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
我如何让 kubeadm 使用本地镜像?或者可以忽略这些预检错误吗?
编辑:此过程(手动加载图像而不是执行 kubeadm config images pull)在使用 docker 和 CentOS7 时运行良好。
答案1
事实证明,我必须将图像加载到k8s.io
容器的命名空间中,以便 Kubernetes 能够识别它们。我将图像导入了错误的命名空间(默认)。
ctr -n k8s.io images import xxx.tar
...
加载完 Kubernetes 所需的所有镜像后,无需执行 kubeadm init 即可正常工作
kubeadm config images pull
。 Kubernetes 可以使用的镜像显示在
ctr -n k8s.io images ls
或中crictl images
。
# crictl images
IMAGE TAG IMAGE ID SIZE
k8s.gcr.io/coredns/coredns v1.8.4 8d147537fb7d1 47.7MB
k8s.gcr.io/etcd 3.5.0-0 0048118155842 296MB
k8s.gcr.io/kube-apiserver v1.22.1 f30469a2491a5 130MB
k8s.gcr.io/kube-controller-manager v1.22.1 6e002eb89a881 123MB
k8s.gcr.io/kube-proxy v1.22.1 36c4ebbc9d979 105MB
k8s.gcr.io/kube-scheduler v1.22.1 aca5ededae9c8 53.9MB
k8s.gcr.io/pause 3.5 ed210e3e4a5ba 686kB
答案2
要手动拉取图像,请执行以下操作:
kubeadm config images list
kubeadm config images pull
还有一个部分在没有互联网连接的情况下运行 kubeadm在 Kubernetes 文档中。