在VPC网络集群中访问集群外地址时使用Pod IP作为客户端源IP
在使用VPC网络的CCE集群中,Pod与集群外部通信时,系统默认会将源Pod的IP地址转换为节点的IP地址,使Pod以节点IP的形式与外部进行通信。这一过程被称为“Pod IP伪装”,技术上也称为源网络地址转换(Source Network Address Translation, SNAT)。
CCE提供nonMasqueradeCIDRs参数设置集群私有网段。在Pod中发起访问请求时,如果Pod访问的目的地址在集群私有网段范围内,则节点不会将Pod IP进行网络地址转换,可以借由VPC路由表直接将报文送达至目的地址,即直接使用Pod IP与集群私有网络地址进行通信。
前提条件
您需要拥有一个VPC网络模型的集群,且版本为v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上。
CCE集群默认设置的非伪装网段说明
CCE集群默认会将以下三个知名私有网段作为非伪装网段(nonMasqueradeCIDRs):
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
此外,如果CCE集群使用了扩展网段VPC,创建、重置节点也会将扩展网段添加到非伪装网段中。
这意味着,Pod在与外部资源通信时,访问这些地址网段,其数据包的源IP地址将保持不变,不会被替换成节点的IP地址。
默认非伪装网段无法满足需求的场景
尽管CCE中默认的非伪装网段设置适用于常见情况,但在某些特定场景下,默认配置可能无法满足用户的需求。以下是两个典型的例子:
- 跨节点访问Pod
在Kubernetes集群中,当一个节点需要访问位于其他节点上的Pod时,通常情况下,Pod的响应数据包会被自动执行SNAT,此时源地址会从Pod的IP地址变更为节点的IP地址。这种自动的IP地址转换可能会导致通信异常,从而使得跨节点的访问变得不可行。
为了确保节点能够正常访问位于其他节点上的Pod,需要将节点所在子网的网段添加到nonMasqueradeCIDRs参数中,以免进行SNAT,从而保留Pod的原始IP地址。
- 从VPC内其他资源访问Pod
在一些场景下,可能需要从同一个VPC内的其他资源(例如ECS实例)直接访问位于不同节点的Pod的原始IP地址。由于默认情况下启用了SNAT,数据包的源IP地址在经过节点时会被替换为节点的IP地址,这会阻碍从这些资源到Pod的直接访问。
要确保VPC内的其他资源能够直接访问Pod,需要将这些资源所在子网的网段也添加到nonMasqueradeCIDRs参数中,从而避免源地址转换,保持数据包的源IP地址为原始Pod地址。
配置非伪装网段的注意事项
如果云服务配置了安全组或ACL,而这些配置仅允许Pod所在节点的IP进行访问,那么在这种场景下就需要进行SNAT,将Pod IP转换成节点IP进行访问,因而服务端所在的子网网段就不能加入到nonMasqueradeCIDRs配置中。
在大多数情况下,保持Pod IP伪装(SNAT)的默认行为即可满足需求。仅在特定场景中确有必要保留Pod原始IP地址时,才推荐配置nonMasqueradeCIDRs参数。
在配置该参数之前,请仔细评估您的使用场景,并深入了解不当配置可能引起的潜在风险。错误的配置可能会导致集群内部访问受阻。如果您对是否需要配置该参数感到不确定,建议暂时保留默认设置,待需求明确后再作调整。
配置非伪装网段的方法
为了让Pod访问目标网段时保留Pod的源IP地址,您可以通过设置nonMasqueradeCIDRs参数来指定无需伪装的网段。
- 登录CCE控制台,单击集群名称进入集群详情页。
- 在左侧导航栏中选择“配置中心”,单击“网络配置”页签。
- 修改“设置非伪装访问的网段范围”参数,表示当Pod访问这些指定网段时,将保留Pod的原始IP地址。在配置该参数时,请遵循以下原则:
- 修改完成后,单击“确认配置”。该配置修改后将在一分钟内生效。