我使用kubesphere部署微服務的時候,發現有很多次,我修改了配置文件,但是部署完才發現部署的是舊版本。
然后我查看了該微服務部署在哪個節點上:
kubectl get pods --all-namespaces -o wide
例如 gulimall-gateway 這個服務:可以看到它被分配在了 k8snode2 節點上
于是我登錄 k8snode2 節點上查看該鏡像:
使用 docker inspect 命令查看該鏡像詳細信息:
# 查看鏡像信息
docker inspect 鏡像ID
再進去阿里云的容器鏡像服務查看該鏡像的SHA256哈希值, 發現使用的還是最舊的鏡像:
于是我再去 k8snode3 節點上查看該鏡像是否有拉取到最新的鏡像:
發現 k8snode3 節點使用的是最新的鏡像:
所以當該服務分配到了 k8snode3 的時候就可以獲取到最新修改的內容的鏡像,被分配到 k8snode2 節點的時候就使用的是舊的鏡像。
在Kubernetes集群中,每個節點都有自己的容器運行時(如Docker),它們各自維護著本地的鏡像緩存。當一個Pod被調度到某個節點上時,該節點會嘗試從本地鏡像緩存中加載對應的鏡像。如果本地鏡像緩存中沒有所需的鏡像或版本,節點會嘗試從鏡像倉庫中拉取鏡像。
解決辦法:
-
在 k8snode2 節點上手動執行 docker pull 命令來拉取最新的鏡像,然后重新部署相關的Pod。
-
在部署Pod時,使用 imagePullPolicy: Always 來強制每次都從鏡像倉庫拉取最新的鏡像。