Kubernetes集群使用Terway网络的IPvlan或Pod独占弹性网卡模式出现网络问题

更新时间:

问题描述

当前环境使用Terway网络的IPvlan或Pod独占弹性网卡模式时,出现如下问题:

  • 现象一:Pod内的程序无法解析域名。
  • 现象二:ECS可以访问公网但是Pod无法访问公网。
  • 现象三:无法获取集群内的监控数据。
  • 现象四:Pod内程序无法访问RDS实例。

集群设置Terway网络的IPvlan或Pod独占弹性网卡模式的示例图如下所示:

  • IPvlan
  • Pod独占弹性网卡

问题原因

与Flannel插件不同,Terway插件不存在Pod网络CIDR(地址段)的概念,Terway插件使用VPC虚拟交换机作为Pod虚拟交换机,详情请参见Kubernetes集群网络规划。Pod使用的私网IP是ECS辅助弹性网卡(ENI)的私网IP,Pod出网流量均通过ENI网卡,而不会在SNAT后经过Pod所在ECS的IP地址。问题现象对应的问题原因如下所示。

问题现象 问题原因

现象一:Pod内的程序无法解析域名。

Pod内域名解析要求有跨主机Pod通信的能力,故Pod的ENI与ECS必须处于同个安全组。

现象二:ECS可以访问公网但是Pod无法访问公网。

Pod无法访问公网,是由于Pod绑定的ENI所在的交换机配置异常,即该交换机未创建对应该ENI的SNAT条目。

现象三:无法获取集群内的监控数据。

集群监控需要通过API Server访问kubelet,故要求API Server的ENI、Pod的ENI与ECS处于同个安全组。

说明:创建集群时会创建一个默认的安全组,如果是托管版集群,API Server绑定的ENI也在这个默认的安全组中。

现象四:Pod内程序无法访问RDS实例。

RDS白名单配置错误,应该配置Pod所在的交换机网段,而不是ECS网段。

解决方案

问题现象 解决方法
现象一:Pod内的程序无法解析域名。

参考以下文档,修改Pod的ENI与ECS的安全组,确保两者处于同个安全组。

现象二:ECS可以访问公网但是Pod无法访问公网。

参考以下文档,在交换机创建对应该ENI的SNAT条目。

现象三:无法获取集群内的监控数据。

参考以下文档,修改ENI与ECS的安全组,确保API Server的ENI、Pod的ENI与ECS处于同个安全组。

现象四:Pod内程序无法访问RDS实例。

参考以下文档,Pod所在交换机的网段添加至RDS白名单中。

更多信息

请参考以下步骤,查看并修改ENI对应的安全组与辅助私网IP:

  1. 登录容器服务控制台,单击目标集群名称,单击容器组,找到目标Pod并记录Pod IP。
  2. 使用kubectl连接Kubernetes集群的Master节点,详情请参见通过kubectl连接Kubernetes集群
  3. 执行以下命令,查看集群内Pod所属的地域和交换机。
    kubectl get cm eni-config -n kube-system -o yaml
    系统返回类似如下。
  4. 在ECS控制台的弹性网卡列表页面,通过Pod所属的地域、交换机和第一步获得的IP地址,找到对应的网卡,单击右侧的修改
  5. 在弹出的窗口,确认该网卡对应的安全组是否正确,如果不正常修改即可。
  6. 弹性网卡列表页面,找到对应的网卡,单击右侧的管理辅助私网IP
  7. 在弹出的窗口,可查看并管理辅助私网IP。

适用于

  • 容器服务Kubernetes专有版
  • 容器服务Kubernetes托管版

说明:适用于使用了Terway网络的IPvlan或Pod独占弹性网卡模式的环境。