amazon-web-services - 多个 vpc 上的 Kubernetes

标签 amazon-web-services amazon-ec2 kubernetes amazon-vpc

2 个 VPC:

主 VPC: 10.111.0.0/22

主 VPC 子网包含 4 个子网:

10.111.0.0/25
10.111.0.128/25
10.111.1.0/25
10.111.1.128/25

辅助 VPC: Kubernetes Minion VPC (172.16.0.0/20)

补充笔记:
主要 VPC && 次要 VPC 使用 VPC 对等来启用 2 个 VPC 之间的通信

问题:是否可以在自己的 VPC 中分离 minion 实例/节点/pod 等,以节省主 VPC 中的网络空间。如果可能的话,我希望主节点和服务端点在主 vpc 下运行,这样它们就可以直接路由而无需通过公共(public)互联网,并且将节点/pod 等放在自己的空间中,而不会弄乱我们已经很小的 IP 空间.

PS:主要VPC地址空间由于与主要公司网络的ip重叠限制,只有一个/22。

最佳答案

一旦你定义了一个可以从你的 k8s 集群外部访问的服务端点(无论你是否使用 NodePort LoadBalancer 选项),k8s 就会在集群中的每个节点上打开一个服务端口(也在主节点上) )。
集群中的每个节点都运行一个 kube-proxy,它负责将服务端口上的任何请求路由到正在运行的 Pod,即使该 Pod 在另一个 VPC 中完全不同的节点中运行(假设该节点可以通过当然是凝视)。
此外,Pod 在与节点的物理网络无关的虚拟网络中运行 - 所以 Pod 不会耗尽网络的 IP 空间 ,但您的 VPC/网络中的节点数确实如此。
所以,我认为你应该限制你的 VPC 中 IP 空间有限的节点数量(你可以按照你想要的方式放置主节点)并将工作节点放在另一个 VPC 中。

关于 Pod 的节点亲和性:您可以将 Pod 分配给特定的工作节点(参见 here)。
例如,您可以将所有 Pod 分配给单个 VPC 中的工作节点,并将任何公共(public)流量路由到另一个 VPC 中的节点,然后将流量代理到正在运行的 Pod,但这根本不能解决您的 IP 空间问题.

更新:

关于服务端点:当您配置可从 k8s 集群外部访问的服务时,主节点首先分配一个端口,该端口从那时起为该服务保留。然后在集群中的每个节点(主节点和工作节点)上打开该端口。该端口由 kube-proxy 操作,当然它也驻留在每个节点上。然后 kube-proxy 负责其余的工作,并将来自该端口的传入流量代理到相应服务的运行 pod,即使该 pod 运行在完全不同的节点上(在内部,k8s 使用一些 iptables 魔法实现了这一点)。这意味着您可以将您的请求发送到集群中任何节点上的该端口(我们现在称之为 <service-port>)。您的服务端点基本上是 <proto>://<any-worker-or-master-node-ip>:<service-port> .有了这个,您还可以轻松设置 ELB 并将所有节点添加为实例,这样您就有了一个面向 Internet 的公共(public)端点。所有这些都得到了更详细的解释here .

关于amazon-web-services - 多个 vpc 上的 Kubernetes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41839129/

相关文章:

amazon-web-services - docker 错误 - "jq: error: Cannot iterate over null"

amazon-web-services - 如何使用 AWS CLI 获取最近启动的 EC2 实例?

amazon-ec2 - 如何通过 ansible playbook 获取 ec2 实例公共(public) DNS 名称

docker - 使用 Helm 安装时, “poddisruptionbudgets.policy ” zk-pdb“已经存在”是什么意思?

ssl - 从 Kubernetes Nginx Ingress 中的 ssl 重定向中排除特定主机

amazon-web-services - 如何使用cloudformation创建私有(private)AWS Api网关?

java - 使用 Java 查找我所有 EC2 实例的公共(public) IP?

mysql - 如果数据库子网组同时包含公共(public)/私有(private)子网,则 RDS 实例部署在哪个 AZ

linux - 为什么受密码保护的根账户是 Amazon EC2 中的安全问题?

docker - 将持久卷声明添加到容器中的现有文件