从AWS lambdas访问kubernetes集群中的Mongo副本

时间:2017-05-09 17:48:46

标签: node.js mongodb amazon-web-services kubernetes aws-lambda

我的一些数据是Mongo副本,它们托管在kubernetes集群中运行的docker容器中。我需要从运行在相同VPC和子网中的AWS lambda访问此数据(如使用mongo db的kubernetes minions)。 lambda以及kubernetes minions(托管mongo容器)在同一个安全组下运行。我正在尝试使用url" mongodb:// mongo-rs-1-svc,mongo-rs-2-svc,mongo-rs-3-svc / res?replicaSet = mongo_rs"其中mongo-rs-x-svc是三个kubernetes服务,可以访问相应的副本。当我尝试使用此URL连接时,它无法解析mongo副本URL(例如mongo-rs-2-svc)。相同的URL适用于在同一个kubernetes集群中自己的docker容器中运行的Web服务。

以下是我使用mongo客户端的错误... {\" name \":\" MongoError \",\" message \":\"无法连接到服务器[mongo- rs-1-svc:27017]在第一次连接时[MongoError:getaddrinfo ENOTFOUND mongo-rs-1-svc mongo-rs-1-svc:27017] \"}"。我尝试将mongo-rs-x-svc替换为url中的内部ip地址。在这种情况下,上面的名称解析错误消失但又出现了另一个错误 - {\" name \":\" MongoError \"," message \" :\"第一次连接时无法连接到服务器[10.0.170.237:27017] [MongoError:连接5到10.0.170.237:27017超时] \"}

我应该怎样做才能成功启用此功能?

据我所知,我可以使用webservice作为中介来访问这些数据,但由于我的lambda是在VPC中,我必须部署NAT网关,这会增加成本。有没有办法使用内部端点而不是公共URL访问Web服务?可能这是获取数据的另一种方式。

如果您有任何解决方案,请分享。我经历过许多线索,这些线程出现在类似的问题或搜索结果中,但都没有解决此案例。

2 个答案:

答案 0 :(得分:0)

这是与Kubernetes的常见混淆。 Kubernetes中的Service对象默认情况下只能从Kubernetes内部访问(即设置type: ClusterIP时)。如果您希望能够从群集外部访问它,则需要编辑该服务,使其为type: NodePorttype: LoadBalancer

我不完全确定,但听起来您的网络设置允许您在Kubernetes中使用type: NodePort Service。这将在群集中的每个节点上打开一个高编号端口(例如32XXX),以转发到Mongo Pod(s)。服务名称的DNS解析(例如mongo-rs-1-svc)仅适用于Kubernetes群集,但使用NodePort我认为您应该能够将其作为mongodb://ec2-instance-1-ip:32XXX,ec2-instance-2-ip:32XXX,...解决。

答案 1 :(得分:0)

Coreyphobrien的回答是正确的。随后你要求如何将曝光保密。为此,我想添加一些信息:

您需要将Lambda作为群集所在VPC的一部分。为此,在创建lambdas或更新时使用--vpc-config参数。这将在VPC中创建允许Lambda访问的虚拟网络接口。有关详细信息,请参阅this

之后,您应该能够为实例设置AWS安全组,以便只能从用于Lambdas网络接口的另一个安全组访问NodePort。

这个blog更详细地讨论了一个例子。