背景介绍
在AWS上搭建Kubernetes(简称K8S)集群环境,推荐使用托管服务EKS。
无论是使用托管还是自建K8S集群,在有些场景下,需要让Pod间的通信管理可以像EC2的网络地址和通信一样的灵活,从而实现在同一个K8S集群内:Pod间通信可以跨子网,跨VPC,主机与Pod分属不同子网和安全组的灵活配置。
通过Amazon VPC CNI插件的使用,Pod可以分配到在 VPC 网络上的 IP 地址。用户可以实现同一个K8S集群部署在:
一个VPC内,主机与Pod使用相同子网及安全组
一个VPC内,主机与Pod使用不同子网及安全组
多个VPC内,主机与Pod使用相同子网及安全组
多个VPC内,主机与Pod使用不同子网及安全组
在集群内,每台主机都可以使用单独的子网网段,同样每台主机内的Pod也可以使用各自独立的子网网段。
EKS目前不支持同个集群的worker节点部署在多VPC内。尽管通过CNI可以实现自建K8S集群的多VPC部署方案,仍然推荐同个集群单VPC的部署方式来降低复杂度和维护成本。
本文使用的示例环境基于CentOS7自建K8S集群部署CNI的默认及自定义网络配置。
1. 什么是CNI
AWS上建议使用EKS 搭建K8S集群环境,同时可以使用Amazon VPC CNI插件管理Pod的网络地址和通信。
使用了AWS VPC CNI插件允许Pod在Pod 内具有与其在 VPC 网络上相同的 IP 地址。此 CNI 插件是一个在 GitHub 上进行维护的开源项目。
2. CNI部署选项
针对EKS集群CNI的部署,可参考GitHub项目说明。
针对自建K8S集群CNI的部署,官方用户指南是只针对EKS,使用了EKS的AMI镜像,在步骤上会与自建的有些差异。
CNI的配置变量提供了很多部署选项。默认情况下,在为 Pod 分配新的网络接口时,ipamD 将使用工作线程节点的主弹性网络接口的安全组和子网。但是,在一些使用案例中,Pod 网络接口将在控制层面安全组所在的 VPC 中使用不同的安全组或子网。详细信息可参考CNI自定义网络。
3. 如何安装K8S及CNI插件
3.1 启动EC2
使用EKS托管服务推荐使用EKS节点的镜像,而自建则取决于系统要求,这里选用CentOS 7。
在EC2控制面板里启动实例,选用CentOS 7镜像。
在选择实例大小时,要注意每个实例类型的每个网络接口的 IP 地址是不一样的,会直接决定K8S所能分配给Pod的IP数量,所以一定要根据每个节点的Pod数量要求来选择实例大小。
为EC2创建好单独角色及配上所需策略。
3.2 配置EC2网络
根据是否要启用CNI自定义网络配置的业务场景,请参照不同步骤。
3.2.1 使用默认网络配置
1) 为主机创建子网和安全组,主机内Pod也会应用上与主机相同的子网和安全组。在这里要选好子网大小,Pod节点数目受限于子网大小。
2) 将EC2创建到该子网和安全组内。
网络接口数量及所分配IP数受实例大小限制,也取决于集群Pod数量要求。可根据需要添加更多数量的网络接口。
在默认网络配置模式下,主机的主网络接口将被分配到子网内多个IP,只有一个IP供主机使用。附加的其它网络接口也将被分配到同一子网内多个IP,除一个主机IP外,剩下IP都会分配给Pod使用。
3.2.2 使用自定义网络配置
1) 为主机创建子网和安全组,并为Pod单独创建子网和安全组。
K8S集群节点