一、介绍
- 需求:如何查找Rancher创建的容器网络信息(端口映射信息)、如何解决Rancher创建的容器无法通过netstat查询监听端口的问题
- 内容:Rancher网络机制、使用iptable查询监听端口
- 环境:Linux+centos
- 问题:
Rancher创建的容器,查不到端口映射,容器跑起来了,但是在浏览器中使用ip+port无法访问到容器内部的服务。没办法确定是宿主机/容器端口映射出问题,还是容器内部服务没启动
- 排查过程 :
docker logs <containerID>
(查看日志,发现没有重要信息)netstat -apn|grep 10086
(10086为宿主机开放的端口,该命令没返回信息)iptables-save |grep 10086
或者iptables-save |grep 10.42.*
(查看端口映射情况,发现10086->80)docker exec -it <containerID> bash
andps aux
(进入容器看下相关服务是否启动)docker top <容器ID>
(比4更加快捷的查看容器内部的进程运行情况的方式)
二、Rancher网络
Rancher实现了一个CNI框架,用户可以在Rancher中选择不同的网络驱动。在默认的环境模版中,IPSec驱动是默认启用的,它是一种简单且有足够安全性的隧道网络模型。当你一个网络驱动在环境中运行时,它会自动创建一个默认网络,任何使用托管网络的服务其实就是在使用这个默认网络。这些服务运行着内部DNS服务器并且负责管理路由来暴露主机端口(通过iptable实现)。
-
版本区别
- 在1.2版本前的IPsec网络中,容器使用托管网络将会被分配两个IP,分别是Docker网桥IP(172.17.0.0/16)和Rancher托管IP(10.42.0.0/16)。之后的版本中,则集成了CNI网络框架的标准,容器只会被分配Rancher托管IP(10.42.0.0/16)。
-
使用CNI的影响
- Rancher托管IP不会显示在Docker元数据中,这意味着通过docker inspect无法查到IP。因为Rancher使用IPtables来管理端口映射, 任何端口映射也无法通过docker ps显示出来。
-
容器间连通性
- 默认情况下,同一环境下的托管网络之间的容器是可达的。如果你想要控制这个行为,你可以部署网络策略服务。
如果你在跨主机容器通信中碰到问题,可以移步常见的故障排查与修复方法。
- 默认情况下,同一环境下的托管网络之间的容器是可达的。如果你想要控制这个行为,你可以部署网络策略服务。
-
网络类型
- 在UI上创建服务时,切换到“网络”页签上可以选择网络类型,但是UI上默认不提供“Container”网络类型,如果要使用“Container”类型,则需要通过Rancher CLI/Rancher Compose/Docker CLI来创建。
-
托管网络
- 默认情况下,通过UI创建容器会使用托管网络,在容器中使用ip addr或者ifconfig可以看到eth0和lo设备,eth0的IP从属于Rancher托管子网中,默认的子网是10.42.0.0/16,当然你也可以修改这个子网。
注意:如果在基础设施服务中删除了网络驱动服务,那么容器的网络设置将会失效。
- 默认情况下,通过UI创建容器会使用托管网络,在容器中使用ip addr或者ifconfig可以看到eth0和lo设备,eth0的IP从属于Rancher托管子网中,默认的子网是10.42.0.0/16,当然你也可以修改这个子网。
三、解决问题
-
使用Rancher UI查看容器信息
容器的详细配置都在此文件中 -
docker ps/docker inspect 无法查询docker网络信息的问题
- 在文章Rancher的快速使用及问题分析(一)之快速使用中使用Rancher开启一个nginx容器端口映射为
10086->80
iptables-save |grep 10086
(查看端口的监听信息,确认宿主机是否已监听10086端口)
iptables-save |grep 10.42.*
(查看所有的Rancher创建的容器信息)- 查看具体容器的IP、其他网络信息及容器内部服务是否启动
cat /etc/hosts``docker exec -it <containerID> bash
(进入容器)cat /etc/hosts
(查看容器IP)
docker top <容器id>
- 在文章Rancher的快速使用及问题分析(一)之快速使用中使用Rancher开启一个nginx容器端口映射为
-
如果我们想通过CLI创建一个Docker容器,但仍希望它使用Rancher托管网络的IP地址,该怎么做呢?
- 我们只需要在命令中添加一个标签(io.rancher.container.network=true),让Rancher知道你希望此容器成为托管网络的一部分。
docker run -l io.rancher.container.network=true -itd ubuntu bash
(使用该命令即可)
四、总结
本文主要介绍Rancher网络默认驱动IPsec对docker的影响,解决docker ps
、docker inspetc
查询不到docker容器相关网络信息的问题。希望给同是Rancher初学者的博友们占个坑,少走一些弯路。本人旨在分享技术,文章写的不好或者不多的地方请多多指正,将不胜感激。本文属于原创,若有引用请注明出处。若有疑问或错误,欢迎各位指出,可以评论或者跟本人联系。