问题描述
当前环境使用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:
- 登录容器服务控制台,单击目标集群名称,单击容器组,找到目标Pod并记录Pod IP。
- 使用kubectl连接Kubernetes集群的Master节点,详情请参见通过kubectl连接Kubernetes集群。
- 执行以下命令,查看集群内Pod所属的地域和交换机。
kubectl get cm eni-config -n kube-system -o yaml
系统返回类似如下。 - 在ECS控制台的弹性网卡列表页面,通过Pod所属的地域、交换机和第一步获得的IP地址,找到对应的网卡,单击右侧的修改。
- 在弹出的窗口,确认该网卡对应的安全组是否正确,如果不正常修改即可。
- 弹性网卡列表页面,找到对应的网卡,单击右侧的管理辅助私网IP。
- 在弹出的窗口,可查看并管理辅助私网IP。
适用于
- 容器服务Kubernetes专有版
- 容器服务Kubernetes托管版
说明:适用于使用了Terway网络的IPvlan或Pod独占弹性网卡模式的环境。