2

我正在minikube使用DevSpace 工具将多个服务部署到我的本地集群 () 。一旦有人对其中一项服务进行更改并将图像推送到我们的私人仓库,我需要这些更改在我的本地可用。我现在要做的是完全删除minikube集群并启动一个新集群。在这种情况下,所有具有相同标签的图像都只是更新为最新版本,而不是缓存的。

但我相信有一些更优雅的方法可以克服这个问题。因此,我需要以某种方式从本地集群中清理/删除/删除过时的图像,然后再在那里重新部署服务。

有人可以指出它们的存储位置,我如何查看和删除它们?谢谢。

4

3 回答 3

2

DevSpace 维护者在这里。你需要的是两件事:

  1. 每次运行时都会强制重新创建 pod 的东西devspace dev。因此,如果您使用的是 Deployment 或 StatefulSet,您可以添加标签之类的东西,例如,将 DevSpace 内置的时间戳变量作为值添加到您的 pod 模板中。
  2. 一个imagePullPolicy: Always在你的 pod 规范中,以确保 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

于 2021-08-11T17:16:59.927 回答
1

您可以尝试以下命令

删除未标记的图像

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

删除所有图像

于 2021-08-10T06:39:44.690 回答
0

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

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

这也是假设,您正在使用带有标签的正确版本控制。

或者,如果您使用带有latest标签的图像,您可以更改ImagePullPolicyAlways,然后删除必要的 pod

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

创建新的 pod 时,将拉取较新的映像。


如果您仍想删除未使用的 docker 映像,可以使用

docker image prune -a

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

于 2021-08-10T09:32:30.407 回答