Rancher的快速使用及问题分析(二)之网络驱动分析与问题解决

一、介绍

  • 需求:如何查找Rancher创建的容器网络信息(端口映射信息)、如何解决Rancher创建的容器无法通过netstat查询监听端口的问题
  • 内容:Rancher网络机制、使用iptable查询监听端口
  • 环境:Linux+centos
  • 问题:Rancher创建的容器,查不到端口映射,容器跑起来了,但是在浏览器中使用ip+port无法访问到容器内部的服务。没办法确定是宿主机/容器端口映射出问题,还是容器内部服务没启动
  • 排查过程 :
    1. docker logs <containerID>(查看日志,发现没有重要信息)
    2. netstat -apn|grep 10086(10086为宿主机开放的端口,该命令没返回信息)
    3. iptables-save |grep 10086 或者 iptables-save |grep 10.42.*(查看端口映射情况,发现10086->80)
    4. docker exec -it <containerID> bash and ps aux(进入容器看下相关服务是否启动)
    5. docker top <容器ID>(比4更加快捷的查看容器内部的进程运行情况的方式)

二、Rancher网络

Rancher实现了一个CNI框架,用户可以在Rancher中选择不同的网络驱动。在默认的环境模版中,IPSec驱动是默认启用的,它是一种简单且有足够安全性的隧道网络模型。当你一个网络驱动在环境中运行时,它会自动创建一个默认网络,任何使用托管网络的服务其实就是在使用这个默认网络。这些服务运行着内部DNS服务器并且负责管理路由来暴露主机端口(通过iptable实现)。

  1. 版本区别

    • 在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)。
  2. 使用CNI的影响

    • Rancher托管IP不会显示在Docker元数据中,这意味着通过docker inspect无法查到IP。因为Rancher使用IPtables来管理端口映射, 任何端口映射也无法通过docker ps显示出来。
  3. 容器间连通性

    • 默认情况下,同一环境下的托管网络之间的容器是可达的。如果你想要控制这个行为,你可以部署网络策略服务。
      如果你在跨主机容器通信中碰到问题,可以移步常见的故障排查与修复方法。
  4. 网络类型

    • 在UI上创建服务时,切换到“网络”页签上可以选择网络类型,但是UI上默认不提供“Container”网络类型,如果要使用“Container”类型,则需要通过Rancher CLI/Rancher Compose/Docker CLI来创建。
  5. 托管网络

    • 默认情况下,通过UI创建容器会使用托管网络,在容器中使用ip addr或者ifconfig可以看到eth0和lo设备,eth0的IP从属于Rancher托管子网中,默认的子网是10.42.0.0/16,当然你也可以修改这个子网。
      注意:如果在基础设施服务中删除了网络驱动服务,那么容器的网络设置将会失效。

三、解决问题

  1. 使用Rancher UI查看容器信息
    在这里插入图片描述
    在这里插入图片描述
    容器的详细配置都在此文件中

  2. 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>
      在这里插入图片描述
  3. 如果我们想通过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 psdocker inspetc查询不到docker容器相关网络信息的问题。希望给同是Rancher初学者的博友们占个坑,少走一些弯路。本人旨在分享技术,文章写的不好或者不多的地方请多多指正,将不胜感激。本文属于原创,若有引用请注明出处。若有疑问或错误,欢迎各位指出,可以评论或者跟本人联系。

猜你喜欢

转载自blog.csdn.net/Urms_handsomeyu/article/details/86532929
今日推荐