kubernetes 如何从minikube中删除已下载的docker镜像

bqucvtff  于 2023-04-05  发布在  Kubernetes
关注(0)|答案(4)|浏览(282)

我正在将几个服务部署到本地群集(minikube)使用DevSpace tool。一旦有人对其中一个服务进行更改并将图像推送到我们的私有存储库,我需要这些更改在我的本地可用。我现在要做的是完全删除minikube集群并启动一个新的集群。在这种情况下,所有具有相同标签的图像都将更新为最新版本,而不是缓存的
但是我相信有一些更优雅的方法来克服这个问题。所以,在重新部署服务之前,我需要从我的本地集群中清理/删除/删除过时的镜像。
有人能指出它们存储在哪里,我如何审查和删除它们?谢谢。

jjhzyzn0

jjhzyzn01#

DevSpace维护者在这里。你需要的是两件事:
1.每次运行devspace dev时强制重新创建pod的东西。因此,如果您使用的是Deployment或StatefulSet,则可以添加标签之类的东西,例如包含DevSpace内置的timestamp变量作为pod模板的值。

  1. pod规范中的imagePullPolicy: Always,以确保Kubernetes总是为每个新创建的pod拉取最新的镜像。否则Kubernetes将使用已经缓存的镜像。
    devspace.yaml文件中,这可能看起来像这样(如果您使用的是组件图部署):
deployments:
- name: my-component
  helm:
    componentChart: true
    values:
      labels:
        timestamp: $!{DEVSPACE_TIMESTAMP}  # here is 1.
      containers:
      - image: "YOUR_IMAGE:latest"         # specify any tag here that you want
        imagePullPolicy: Always            # here is 2.

$!{DEVSPACE_TIMESTAMP} = $!{}强制将此var的值放置为字符串(因为k8s只允许标签使用字符串值),而DEVSPACE_TIMESTAMP是DevSpace中预定义变量的名称。更多详细信息请参见:https://devspace.sh/cli/docs/configuration/variables/basics#predefined-variables

bwitn5fc

bwitn5fc2#

您可以尝试以下命令

移除未标记的图片

docker image rm $(docker images | grep "^<none>" | awk "{print $3}")

移除所有停止的容器

docker container rm $(docker ps -a -q)

(或)
您需要停止并禁用localkube服务:

systemctl disable localkube.service
systemctl stop localkube.service

之后,您可以停止并删除容器。

docker system prune -a

会移除所有图像

yks3o0rb

yks3o0rb3#

您可以执行滚动更新,而不是删除所有映像并重新创建群集(这是假设您正在使用部署,您应该这样做)。

kubectl set image deployments/<deployment-name>=<repository-name>/<image-name>:<image-tag>

这也是假设,您正在使用正确的版本控制标签。
或者,如果您使用带有latest标签的图像,您可以将ImagePullPolicy更改为Always,然后使用

kubectl delete pod <pod-name> <pod2-name> ...

创建新pod时,将提取较新的映像。
如果你仍然想删除未使用的docker镜像,你可以使用

docker image prune -a

这将删除所有没有至少一个容器与之关联的图像。

rnmwe5a2

rnmwe5a24#

阻塞/命令式方式

下面是我在构建脚本中使用的另一种方法。
主要优点是该命令是同步的,因此您可以将其包含在构建脚本之类的东西中,而不需要您的集群每次都下载映像,以便在重建期间偶尔进行更新。

一些设置

# an example of building a new image and uploading it for reload in k8s
# in the question, this is already done

docker build -t jamesandariese/my-cool-image:latest .
docker push jamesandariese/my-cool-image:latest

魔法在这里发生

# reload image in k8s, ignoring cached image

kubectl run \
    --image=jamesandariese/my-cool-image:latest \
    --image-pull-policy=Always \
    --restart=Never \
    --rm=true \
    -i download-image --command -- true

if [ $? -eq 0 ];then
    1>&2 echo "all pods launched with this image tag will now use the updated image"
else
    1>&2 echo "FAILED TO REFRESH IMAGE.  See error from kubectl"
fi

这种方法基于以下几个事实:

  • minikube运行在单个k8s节点上(也可以运行在其他单节点集群上,如k3 s)
  • 使用要更新的映像和映像拉取策略运行新pod时,总是会导致下载新映像
  • 将命令重写为true并附加(通过-i),我们将获得一个退出代码,该代码与我们是否成功更新了图像相匹配

一旦kubectl成功退出,minikube中的镜像就会更新。
注意事项:这可以通过DaemonSetkubectl wait跨整个集群完成,但当您拥有完整的集群时,你的SDLC应该少关注如何写一个脚本来完成这个任务,多关注如何正确地标记东西,这样它们就不总是:latest:prod了。这种转变对于允许可预测的回滚和在集群中同时运行多个版本非常重要。

相关问题