minikube
)。一旦有人对其中一个服务进行更改并将镜像推送到我们的私有仓库,我需要这些更改在我的本地上可用。现在我所做的是完全删除minikube
集群并启动一个新的集群。在这种情况下,所有具有相同标签的图像都会被更新为最新版本,而不是缓存的版本。
但我相信有一种更优雅的方法来解决这个问题。因此,在重新部署服务之前,我需要以某种方式清理/删除本地集群中过时的镜像。
有人能指出它们存储在哪里,我如何查看和删除它们吗?谢谢。
minikube
)。一旦有人对其中一个服务进行更改并将镜像推送到我们的私有仓库,我需要这些更改在我的本地上可用。现在我所做的是完全删除minikube
集群并启动一个新的集群。在这种情况下,所有具有相同标签的图像都会被更新为最新版本,而不是缓存的版本。
但我相信有一种更优雅的方法来解决这个问题。因此,在重新部署服务之前,我需要以某种方式清理/删除本地集群中过时的镜像。
有人能指出它们存储在哪里,我如何查看和删除它们吗?谢谢。
作为DevSpace维护者,您需要做两件事:
devspace dev
时重新创建你的pod。 因此,如果您正在使用Deployment或StatefulSet,则可以向您的Pod模板添加一个标签,例如包含DevSpace内置时间戳变量作为值。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}
= $!{}
被强制转换为字符串形式,因为k8s只允许标签使用字符串值,并且DEVSPACE_TIMESTAMP
是DevSpace中一个预定义的变量名称。更多详情请参阅:https://devspace.sh/cli/docs/configuration/variables/basics#predefined-variables
不要删除所有的图像并重新创建集群,你可以执行滚动更新(假设你正在使用部署,因为你应该这样做)。
kubectl set image deployments/<deployment-name>=<repository-name>/<image-name>:<image-tag>
这也假设您正在使用带有标签的适当版本控制。
或者,如果您正在使用带有“latest”标签的图像,则可以将ImagePullPolicy
更改为Always
,然后使用以下命令删除必要的Pod:
kubectl delete pod <pod-name> <pod2-name> ...
随着新的Pod被创建,较新的镜像将被拉取。
docker image prune -a
这将删除所有没有至少一个相关容器的图像。
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
这会删除所有图片
docker images
命令时,我根本看不到任何部署在minikube上的镜像。 - vitali_li这里是我在一个构建脚本中使用的另一种方法。
其主要优点是该命令是同步的,因此您可以将其包含在诸如构建脚本之类的内容中,并且不需要每次重建时都让您的集群下载镜像以便偶尔进行更新。
# 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节点上运行(也适用于其他单节点集群,如k3s)
使用图像更新并将图像拉取策略设置为always运行新的pod会导致下载新图像
通过将命令覆盖为true并附加(通过-i),我们获得与成功更新图像匹配的退出代码
一旦kubectl
成功退出,图像就会在minikube中更新。
注意:可以通过DaemonSet
和kubectl wait
在整个集群中执行此操作,但是当您拥有完整的集群时,您的SDLC应该专注于如何正确标记事物,以便它们不总是:latest
或:prod
。 这种转变对于允许可预测的回滚和在集群中同时运行多个版本非常重要。