## 为什么K8S会删除没有在用的镜像

Kubernetes(简称K8S)是一个开源的、用于自动化部署、扩展和管理容器化应用程序的平台。在K8S中,镜像是容器运行的基础,每个Pod都会引用一个或多个镜像来运行容器。当一个镜像在K8S中没有被任何Pod使用时,K8S会将其删除,以释放存储空间和减少不必要的资源占用。

### 流程概要

下面是K8S删除没有在用的镜像的一般流程:

| 步骤 | 操作 |
| --- | --- |
| 1 | 找到未使用的镜像 |
| 2 | 删除未使用的镜像 |

### 详细步骤及代码示例

#### 步骤一:找到未使用的镜像

1. 使用以下命令列出当前K8S集群中所有的Pod,获取镜像列表:
```shell
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' | sort | uniq
```
该命令会列出所有Pod中使用的镜像,并去重排序,以便找到哪些镜像没有被使用。

2. 使用以下命令列出当前K8S集群中所有的镜像:
```shell
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' | sort | uniq >> used_images.txt
```
将镜像列表导出到文件used_images.txt中,以备后续对比使用。

#### 步骤二:删除未使用的镜像

1. 使用以下脚本对比已使用和未使用的镜像,并删除未使用的镜像:
```shell
#!/bin/bash

USED_IMAGES=$(cat used_images.txt)
ALL_IMAGES=$(docker images --format '{{.Repository}}:{{.Tag}}')

for image in $ALL_IMAGES; do
if [[ ! $USED_IMAGES =~ "$image" ]]; then
docker rmi $image
fi
done
```
该脚本会遍历所有镜像,对比已使用的镜像列表,若发现镜像不在已使用列表中,则执行docker rmi命令删除该镜像。

#### 注意事项

- 执行删除镜像操作前,请确保未使用的镜像列表已经正确生成,并且确认删除操作无误。
- 脚本中的docker rmi命令会永久删除镜像,操作需谨慎。

通过以上步骤,我们可以实现K8S自动删除未使用的镜像,以保持集群的清洁和资源的有效利用。

总结:K8S会删除没有在用的镜像是为了减少不必要的资源占用和释放存储空间。通过找到未使用的镜像,并删除这些镜像,可以保持集群的整洁和高效运行。希望上述内容能够帮助你理解K8S删除未使用镜像的原理和操作流程。