不使用kubectl,如何通过Pod的IP地址获取pod_name/container_id?
不依赖kubectl的容器匹配方法
除了你当前使用的逐个进入容器查询IP的方式,还有几种更高效的不依赖kubectl的实现方法:
使用docker inspect直接过滤(推荐)
无需进入容器执行命令,直接通过docker inspect的格式化输出提取容器IP,再匹配目标地址,效率更高:target="1.1.1.1" docker inspect --format '{{.Id}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q) | grep "$target" | awk '{print $1}'如果容器只使用默认的bridge网络,也可以指定网络名称精准提取:
target="1.1.1.1" docker inspect --format '{{.Id}} {{.NetworkSettings.Networks.bridge.IPAddress}}' $(docker ps -q) | grep "$target" | awk '{print $1}'通过宿主机网络命名空间查询
容器的网络命名空间会挂载在/var/run/netns目录下(部分环境需确保proc文件系统已挂载),直接操作网络命名空间获取IP后匹配容器:target="1.1.1.1" for ns in $(ls /var/run/netns); do ip=$(ip netns exec $ns ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | xargs) if [[ $ip = "$target" ]]; then docker ps -q --filter "network=$ns" fi done注:该方法需要root权限,部分环境中网络命名空间名称与容器ID直接关联,可通过
ls -l /var/run/netns查看对应关系。解析容器配置文件
Docker容器的网络配置存储在容器目录的config.v2.json文件中,可通过JSON解析工具提取IP:target="1.1.1.1" docker_root=$(docker info | grep -oP '(?<=Docker Root Dir: ).*') for container in $(docker ps -q); do ip=$(jq -r '.NetworkSettings.Networks.bridge.IPAddress' "${docker_root}/containers/${container}/config.v2.json") if [[ $ip = "$target" ]]; then echo $container fi done注:需要提前安装
jq工具,Docker根目录可通过docker info命令确认。
内容的提问来源于stack exchange,提问作者HALF9000
相关产品推荐
相关产品推荐

