前言
本篇紀錄 K8S kubeadm 建立 Deployment 不撈取遠端鏡像儲存庫遇到的問題
k8stest = 自建專案的 image
環境
Linux 機器: ubuntu-1804-lts
問題
機器上已有 docker image (k8stest),但建立 Pod 時,仍抓不到 image,顯示ErrImagePull
透過 deployment 設定 imagePullPolicy = Never 仍然也顯示 ErrImageNeverPull
# 建立 Pod
kubectl run k8stest --image=k8stest:latest --port=8080
# 查看 Pod => 發現狀態異常
kubectl get pod
NAME                                   READY   STATUS              RESTARTS   AGE
k8stest                                0/1     ErrImagePull        0          2s
# kubectl describe pod k8stest
...略
Events:
  Type     Reason     Age                 From               Message
  ----     ------     ----                ----               -------
  Normal   Scheduled  116s                default-scheduler  Successfully assigned default/k8stest to worker-2
  Normal   Pulling    27s (x4 over 116s)  kubelet            Pulling image "k8stest:latest"
  Warning  Failed     26s (x4 over 114s)  kubelet            Failed to pull image "k8stest:latest": failed to pull and unpack image "docker.io/library/k8stest:latest": failed to resolve reference "docker.io/library/k8stest:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
  Warning  Failed     26s (x4 over 114s)  kubelet            Error: ErrImagePull
  Normal   BackOff    0s (x6 over 114s)   kubelet            Back-off pulling image "k8stest:latest"
  Warning  Failed     0s (x6 over 114s)   kubelet            Error: ImagePullBackOff
解決方法
# 建立 image 檔案
docker save k8stest -o k8stest.tar
# 匯入
ctr -n=k8s.io images import k8stest.tar
# 查看
crictl images
IMAGE                                     TAG                 IMAGE ID            SIZE
docker.io/calico/cni                      v3.25.0             d70a5947d57e5       88MB
docker.io/calico/kube-controllers         v3.25.0             5e785d005ccc1       31.3MB
docker.io/calico/node                     v3.25.0             08616d26b8e74       87.2MB
docker.io/library/k8stest                 latest              5d39204f52f81       224MB
registry.k8s.io/coredns/coredns           v1.10.1             ead0a4a53df89       16.2MB
registry.k8s.io/etcd                      3.5.12-0            3861cfcd7c04c       57.2MB
registry.k8s.io/kube-apiserver            v1.28.9             69947457eaa42       34.7MB
registry.k8s.io/kube-controller-manager   v1.28.9             8981bddce6670       33.5MB
registry.k8s.io/kube-proxy                v1.28.9             09c5e1abe5922       28.1MB
registry.k8s.io/kube-scheduler            v1.28.9             f264907bfc5be       18.7MB
registry.k8s.io/pause                     3.8                 4873874c08efc       311kB
registry.k8s.io/pause                     3.9                 e6f1816883972       322kB
備註
crictl images
若出現異常
ERRO[0000] validate service connection: validate CRI v1 image API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/dockershim.sock: connect: no such file or directory"
執行
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
參考:
https://github.com/kubernetes-sigs/cri-tools/issues/153
缺點
若是K8S機器叢集,需要每個節點都匯入一次 Image
建議還是存放在 Docker Registry 較方便管理、使用
Sample deployment.yaml
- imagePullPolicy
 
| Value | 說明 | 
|---|---|
| Never | 不拉取遠端Image | 
| IfNotPresent | 若本地沒有Image,則拉取遠端Image | 
| Always | 拉取遠端Image | 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-test-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: k8s-test-pod
  template:
    metadata:
      labels:
        app: k8s-test-pod
    spec:
      containers:
      - name: web
        image: k8stest:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthcheck
            port: 8080
參考資料
- How to fix “Failed to pull image” on microk8s
 - How to use local docker images in kubernetes deployments (NOT minikube)
 
轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡