云容器引擎 CCE云容器引擎 CCE

文档首页> 云容器引擎 CCE> 最佳实践> 网络> 同一VPC下的集群外节点访问集群内的PodIP
更新时间:2021/07/27 GMT+08:00
分享

同一VPC下的集群外节点访问集群内的PodIP

背景

CCE内部通过kubernetes的网络直接访问各个容器的PodIP是很方便的,但是如果涉及到了同VPC下一些集群外虚机VM去访问PodIP就显得十分不自然。

或许有人会说,一般PodIP只是集群内部的概念,涉及到了集群外部的话应该使用对外的Service,这种说法应该是比较正确的用法。

但是涉及到客户场景时,例如常用的服务注册consul,客户的Pod启动时会将自身的IP注册到consul,这样就会造成整个架构内部使用的均为PodIP,因此讨论该场景还是有必要的。

前提条件

集群外节点与该集群位于同一个VPC下。

场景一:VPC网络

操作步骤:

  1. 确认集群的网络模型为“VPC网络”

    登录CCE控制台,单击“资源管理 > 集群管理”,在集群列表页单击待操作集群的名称,在集群详情页查看集群的网络模型为“VPC网络”
    图1 查看网络模型-VPC网络

  2. 查看并记录Pod的IP和Pod所在节点IP。

    CCE控制台中,进入工作负载详情界面查看“实例列表”页签中的实例IP。
    图2 查看实例IP

  3. 添加ICMP协议。

    1. 单击“服务列表 > 网络 > 虚拟私有云 VPC”。
    2. 在左侧导航栏中选择“访问控制 > 安全组”。单击Pod所在节点的安全组名称,进入安全组详情页面。
    3. 在“入方向规则”页签,单击“添加规则”,协议端口选择ICMP。
      图3 添加入方向规则

  4. 登录同VPC下的集群外节点,访问容器IP,验证测试。

场景二:容器隧道网络(建议非生产环境使用)

一般而言,同VPC下到虚机VM的网络是打通的,因此自然的想法就是添加路由。即在需要访问PodIP的机器上配置目的地址为容器网段的路由信息,将该报文直接发送到指定节点上。

操作步骤:

  1. 确认集群的网络模型为“容器隧道网络”

    登录CCE控制台,单击“资源管理 > 集群管理”,在集群列表页单击待操作集群的名称,在集群详情页查看集群的网络模型为“容器隧道网络”,容器网段为172.16.0.0/16,如图4

    图4 查看网络模型-容器隧道网络

  2. 查看并记录Pod的IP和Pod所在节点IP。

    CCE控制台中,进入工作负载详情界面查看“实例列表”页签中的实例IP。

    图5 查看实例IP

  3. 路由添加。

    首先在集群内选择一个节点作为网关,比如pod所在节点IP,如上图5中的节点IP地址为192.168.0.121。

    其次,添加路由信息,路由添加有两种方式:

    • 同一VPC同一子网:在需访问Pod的linux虚拟机上使用原生的route命令,如下:
      route add -net 172.16.0.0/16 gw 192.168.0.121

      即让目的IP为172.18.0.0/16网段的报文发送到网关192.168.0.121上去。该方式可以针对特定节点自定义操作,但是在添加同VPC不同子网时,会报如下错误,即不适用于同VPC不同子网下的机器。

    • 同一VPC不同子网:不能在linux虚拟机上使用原生的route命令,需在华为云VPC中添加路由表规则。
      1. 选择“服务列表 > 网络 > 虚拟私有云 VPC”。
      2. 单击虚拟私有云列表中的VPC名称。
      3. 在右侧“网络互通概览”下单击“路由表”后的数字,在打开的路由表页面中,单击路由表名称,在路由表详情页面中单击“添加路由”
      4. 在弹出的添加路由窗口中,在“目的地址”中输入:172.16.0.0/16,在“下一跳类型”中选择服务器实例,在“下一跳”中选择:**-**-***(192.168.0.121)。
        图6 添加路由信息

        如上图所示,该规则适用范围为VPC下所有节点,相比而言没有route add命令那么细颗粒度。

        请检查添加的路由是否与已有路由存在冲突,路由冲突可能导致部分网络访问不通。

  4. 防火墙规则

    添加完路由后,华为云的云服务器还有自带的防火墙-安全组规则。因此需要放通相应的安全组规则。

    具体需要放通的安全组规则要视情况而定,这里我们需要的是http的80端口,因此在CCE节点的入规则列表将80端口放通即可。

    1. 选择“服务列表 > 网络 > 虚拟私有云 VPC”。
    2. 在左侧导航栏中选择“访问控制 > 安全组”。单击Pod所在节点的安全组名称,进入安全组详情页面。
    3. 在“入方向规则”页签,单击“添加规则”,协议端口选择“自定义TCP”,下方的端口填写80。
    图7 查看实例IP

    为了安全起见,远端的范围可以缩小到VPC网段。

  5. ECS网卡关闭源地址校验。

    这一步也是最容易被忽视的,ECS的网卡本身对源地址会有一个校验,CCE的节点回的报文源地址为PodIP,因此会被拦截,需要在CCE的节点上关闭该功能。

    选择“服务列表 > 计算 > 弹性云服务器 ECS ”,单击集群节点名称,进入节点对应的详情页面。在“网卡”页签,关闭本端和对端服务器的“源/目的检查”。

    图8 关闭“源/目的检查”开关

  6. 验证测试。

    对于在节点192.168.0.121上的nginx容器,在设置了上述步骤的情况下,可以从集群外的节点上直接访问到PodIP。

    图9 访问容器IP成功

思考:

  • 规划好内部的网段,使用该方式需要注意内部没有虚拟网段冲突。
  • 总的来说,该场景下还是应用VPC网络模式的集群更好一些。
分享:

    相关文档

    相关产品