更新时间:2024-11-12 GMT+08:00

从Pod访问同一VPC网络的云服务

集群的容器网络模型不同,集群内的从Pod访问同一VPC网络的云服务的方式也不同,请参见表1 从Pod访问云服务的方式(同一VPC)

表1 从Pod访问云服务的方式(同一VPC)

容器网络模型

方式

容器隧道网络

容器隧道网络在节点网络基础上通过隧道封装网络数据包。当从容器访问同一VPC下的其他资源时,节点访问权限的有效性决定了容器访问的通畅性。因此,如果出现访问不通的情况,需要检查与确认被访问服务的安全组配置是否允许容器所在节点的访问。

VPC网络

在VPC网络中,使用VPC路由功能来转发容器的流量。容器网段与节点所在VPC的网段不同,无法与VPC内的其他地址直接通信。在同VPC下,若需要从Pod访问集群外的其他服务,则需要对被访问服务的安全组进行配置。

云原生网络 2.0

在云原生网络2.0模型下,容器直接从VPC网段内分配IP地址,容器网段属于节点所在VPC的子网,因此容器与VPC内的其他地址能够天然互通。如果出现访问不通的情况,需要检查并确认被访问服务的安全组配置是否允许来自容器网段的访问。

与CCE进行通信的云服务有:ECS、ELB、RDS、DCS、Kafka、RabbitMQ、ModelArts、DDS等。进行通信时,除了关注相关的网络配置外,还需要关注所访问的云服务是否允许外部访问如DCS的Redis实例,需要添加白名单才允许访问(如果无法直接在对应服务界面添加白名单,可在对应服务中创建工单寻求帮助)。下面分别介绍从Pod访问ECS和从Pod访问RDS for MySQL实例的相关操作和注意事项。

前提条件

接下来以VPC网络的容器网络模型为例,详细说明在同一VPC内如何设置安全组规则保证访问ECS成功。假设集群节点网段为192.168.0.0/24,容器网段为172.16.0.0/16。

  1. 购买ECS,具体请参见购买Linux系统弹性云服务器。该ECS与集群处于同一区域和同一VPC内,且ECS的IP地址为192.168.0.28。
  2. 登录Pod,具体请参见登录容器实例,尝试从Pod访问ECS。

    ping 192.168.0.28

    • Pod有ping命令,回显内容如下,说明从Pod访问ECS失败。
      PING 192.168.0.28 (192.168.0.28): 56 data bytes
      --- 192.168.0.28 ping statistics ---
      104 packets transmitted, 0 packets received, 100% packet loss
    • Pod没有ping命令,需要添加ping命令,回显内容如下。
      ping: command not found

      下面以容器Nginx:latest为例介绍如何添加ping命令,若已有ping命令可跳过。

      1. 确保从Pod能够访问公网,请参见从Pod访问公网
      2. 更新本地的软件包索引

        apt-get update

      3. 安装iputils-ping软件包,该软件包提供了ping命令。

        apt-get install iputils-ping

      4. 重新尝试访问ECS。

        ping 192.168.0.28

        若回显内容如下,则说明ping命令添加成功。

        PING 192.168.0.28 (192.168.0.28): 56 data bytes
        --- 192.168.0.28 ping statistics ---
        104 packets transmitted, 0 packets received, 100% packet loss

  3. 将集群的容器网段添加到ECS安全组的入方向规则中,使在集群内的Pod中都能访问到该ECS。若只希望从集群中的某个Pod访问该ECS,您可以只将该Pod的IP地址添加到ECS安全组的入方向规则中。

    1. 进入控制台首页,单击左上角的,在展开的列表中单击“计算 > 弹性云服务器 ECS”,单击相应的弹性云服务器名称。
    2. 界面上方单击“安全组”,界面左方单击“配置规则”。可以发现在“入方向规则”中源地址有网段192.168.0.0/18,该网段已经包含了集群节点网段192.168.0.0/24,但源地址中不包含集群容器网段172.16.0.0/16。换言之,当集群的容器网络模型为VPC网络时,集群外服务安全组规则需要放通节点网段和容器网段,才能从Pod中访问该ECS。对于其他容器网络模型,集群外服务安全组规则只需要放通集群节点网段即可实现从Pod中访问该ECS。
      图1 原入方向规则

    3. 单击左上方“添加规则”,将172.16.0.0/16填入源地址,具体参数配置请参见图2
      图2 添加规则

  4. 检验在Pod中能否成功访问同VPC不同集群的ECS。在Pod的CloudShell界面再次输入以下代码。

    ping 192.168.0.28

    若回显内容如下,则说明在Pod中访问该ECS成功。

    PING 192.168.0.28 (192.168.0.28): 56 data bytes
    64 bytes from 192.168.0.28: seq=0 ttl=64 time=1.412 ms
    64 bytes from 192.168.0.28: seq=1 ttl=64 time=1.400 ms
    64 bytes from 192.168.0.28: seq=2 ttl=64 time=1.299 ms
    64 bytes from 192.168.0.28: seq=3 ttl=64 time=1.283 ms
    --- 192.168.0.28 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss

接下来以VPC网络的容器网络模型为例,详细说明在同一VPC内如何通过设置安全组规则确保访问畅通。假设集群节点网段为192.168.0.0/24,集群的容器网段为172.16.0.0/16。

  1. 购买RDS for MySQL实例,具体请参见购买RDS for MySQL实例。该实例与集群处于同一区域和同一VPC内,且IP地址为192.168.10.10。
  2. 登录Pod,具体请参见登录容器实例,尝试从Pod访问RDS for MySQL实例。

    ping 192.168.10.10

    • Pod有ping命令,回显内容如下,说明访问RDS for MySQL实例失败。
      PING 192.168.10.10 (192.168.10.10): 56 data bytes
      --- 192.168.10.10 ping statistics ---
      104 packets transmitted, 0 packets received, 100% packet loss
    • Pod没有ping命令,需要添加ping命令,回显内容如下。
      ping: command not found

      下面以容器Nginx:latest为例介绍如何添加ping命令,若已有ping命令可跳过。

      1. 确保在Pod中能够访问公网,请参见从Pod访问公网
      2. 更新本地的软件包索引

        apt-get update

      3. 安装iputils-ping软件包,该软件包提供了ping命令。

        apt-get install iputils-ping

      4. 重新尝试访问RDS for MySQL实例。

        ping 192.168.10.10

        若回显内容如下,则说明ping命令添加成功。

        PING 192.168.10.10 (192.168.10.10): 56 data bytes
        --- 192.168.10.10 ping statistics ---
        104 packets transmitted, 0 packets received, 100% packet loss

  3. 将集群的容器网段添加到安全组的入方向规则中,使在集群内的Pod中都能访问该RDS for MySQL实例。若只希望从集群中的某个Pod访问该RDS for MySQL实例,您可以将该Pod的IP地址添加到RDS for MySQL实例安全组的入方向规则中。

    1. 进入控制台首页,单击左上角的,在展开的列表中单击“数据库 > 云数据库 RDS”,单击右侧“实例管理”,单击相应的RDS for MySQL实例名称。
    2. 界面左侧单击“连接管理”“安全组规则”模块单击安全组名称。可以发现在“入方向规则”中源地址有网段192.168.0.0/18,该网段已经包含了集群节点网段192.168.0.0/24,但源地址中不包含集群容器网段172.16.0.0/16。换言之,当集群的容器网络模型为VPC网络时,集群外服务安全组规则需要放通节点网段和容器网段,才能从Pod中访问该RDS for MySQL实例。对于其他容器网络模型,集群外服务安全组规则只需要放通集群节点网段即可实现从Pod访问该RDS for MySQL实例。
      图3 原入方向规则

    3. 单击左上方添加规则,将172.16.0.0/16填入源地址,具体参数配置请参见图4
      图4 添加规则

  4. 检验在Pod中能否成功访问该RDS for MySQL实例。在Pod的CloudShell界面再次输入以下代码。

    ping 192.168.10.10

    若回显内容如下,则说明从Pod中访问该RDS for MySQL成功。

    PING 192.168.10.10 (192.168.10.10): 56 data bytes
    64 bytes from 192.168.10.10: seq=0 ttl=64 time=1.412 ms
    64 bytes from 192.168.10.10: seq=1 ttl=64 time=1.400 ms
    64 bytes from 192.168.10.10: seq=2 ttl=64 time=1.299 ms
    64 bytes from 192.168.10.10: seq=3 ttl=64 time=1.283 ms
    --- 192.168.10.10 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss

在Pod中访问不通的排查思路

若在Pod中出现访问网络不通的情况,可以参考表2 在Pod中访问不通具体排查思路进行排查。如果以下思路均不能解决您的问题,请提交工单联系华为云客服为您解答

表2 在Pod中访问不通具体排查思路

排查路径

问题

解决方案

被访问的服务安全组规则

在该部分可能存在以下问题:

  • 安全组规则的入方向规则未允许节点网段或容器网段访问。
  • 入方向规则允许节点网段和容器网段访问,协议未配置正确。
    须知:

    ping命令使用ICMP协议进行网络连通性测试。换言之,安全组规则至少需要开通相应的ICMP协议端口,ping命令才能访问成功。

白名单

如果被访问服务设置白名单,白名单未添加节点网段或容器网段。

对于此类问题,您需要添加容器和节点网段到白名单。具体白名单的设置步骤,请在对应服务的帮助文档中查找。

域名解析

当访问外部域名时,Pod先使用集群的域名解析功能解析被访问目标的地址,后经过Pod侧的网络策略再进行访问,此时可能出现域名无法解析的情况,常见的报错有:

  • Name or service not known
  • Temporary failure in name resolution
  • Unable to resolve hostname
  • DNS resolution failed。
  • Could not resolve MYHOST (nodename nor servname known)这里的MYHOST是无法解析的域名。

您需要排查DNS异常原因,可参考CCE提供的DNS概述文档进行排查

网络策略(仅适用于容器隧道网络

如果您在容器隧道网络类型的集群中配置了网络策略并且Pod所在的命名空间也设置了网络策略,则该网络策略可能会限制Pod中访问的目标地址。

如果该网络策略限制Pod中的访问,则需要修改网络策略,具体可参考配置网络策略限制Pod访问的对象