首页 > 解决方案 > 列出使用 docker 本地卷的 Kubernetes 容器

问题描述

部署VOLUME在 Dockerfile 中具有 的工作负载时,该卷可能不会映射到 Kubernetes 中的持久卷 (PV/PVC)。

实际上,除非将 Kubernetes 卷附加到该工作负载,否则 docker 守护程序容器将在启动容器时临时创建一个 docker-volume(驱动程序类型:) local。Kubernetes 不会意识到这一点。请参阅:Dockerfile 中的 VOLUME 是否持久存在于 kubernetes 中。当 pod 被移除或重新部署时,这个 docker 卷将被销毁。

使用 kubernetes 卷,甚至是临时卷(或通用临时卷......在 1.19 中仍处于 alpha 版本)当然是一种好习惯

问:如何列出使用此类本地卷的 pod/容器?

这非常重要,因为重新启动工作负载/部署/有状态集会导致中断(丢失临时卷)。

标签: dockerkubernetesdocker-volumekubernetes-statefulset

解决方案


这是一个可以在 Kubernetes 节点上运行的小脚本(用于使用 Docker 守护程序的安装)。

for d in $(docker volume ls -q --filter driver=local ) ; do
  echo "=== volume $d "
  CID=$(docker ps -q -a --filter volume=$d)
  docker container inspect  -f '  Namespace : {{ index .Config.Labels "io.kubernetes.pod.namespace"}}{{ printf "\n" }}  contnr ID : {{.ID}}{{ printf "\n" }}  Name      : {{.Name}}{{ printf "\n" }}{{ range .Mounts }}{{if eq .Driver "local" }}  Mountpoint: {{ .Destination }}  (RW:{{.RW}}){{end}}{{ end }}'  $CID
  du -ms /var/lib/docker/volumes/$d/_data | sed -e 's/^\([0-9]\+\).*/  Size      : \1 MiB/';
  echo
  echo
done

例子:

=== volume c975149a17753393c543e25e4391af849d14d6d0cf2db4f4e873901ff05fea96
  Namespace :
  contnr ID : 01457a869b5a849952710a1bb023b10cf1f2dbf5779326d9c39a409b127a1437
  Name      : /nginx-proxy
  Mountpoint: /opt/rke-tools  (RW:true)
  Size      : 25 MiB


=== volume f8dbc7f9f06e82253ee882e19b72cbef5b30ba134230543aa34605cafcb6b082
  Namespace : foo
  contnr ID : 71758f3de8ab04b8547554eaf43e9ff54410feef597c55e628b8a3bb19c50e12
  Name      : /k8s_pgadmin4_foo-bar-001-pgadmin4-6d867f44d8-t566l_foo-bar_36715dd4-b858-4e8e-bc1c-c65cd7004e41_0
  Mountpoint: /var/lib/pgadmin  (RW:true)
  Size      : 1 MiB

请注意,某些系统 pod/容器没有命名空间。

此脚本应在您要审核的每个节点上运行。

使用 ssh 从中央服务器扫描多个主机的一种简单方法是将上面的脚本复制到文件local_volumes.sh中,然后执行类似的命令cat local_volumes.sh | ssh node001 sudo bash -

对于牧场主用户,此代码段审核所有封锁节点: for s in $(rancher nodes ls | grep cordoned | cut -d " " -f 1 ); do cat local_volumes.sh | rancher ssh $s sudo bash - ;done


推荐阅读