【问题标题】:Accessing Mongo replicas in kubernetes cluster from AWS lambdas从 AWS lambdas 访问 Kubernetes 集群中的 Mongo 副本
【发布时间】:2017-10-08 04:02:18
【问题描述】:

我的一些数据位于 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 超时] \"}

我应该怎么做才能成功启用此访问权限?

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

如果你们中的任何人对此场景有解决方案,请分享。我浏览了许多显示为类似问题或在搜索结果中的线程,但都没有针对这种情况的解决方案。

【问题讨论】:

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


    【解决方案1】:

    这是与 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,...

    【讨论】:

    • 这还能让我保持 mongo 部署的私密性吗?我不希望它面向互联网。
    • 没有看到您的 AWS 设置以确保我不知道。 :(
    【解决方案2】:

    Coreyphobrien 的回答是正确的。随后,您询问如何将曝光保密。为此,我想补充一些信息:

    您需要使 Lambda 成为您的集群所在的 VPC 的一部分。为此,您在创建 lambda 或更新时使用 --vpc-config 参数。这将在 VPC 中创建一个允许 Lambda 访问的虚拟网络接口。详情见this

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

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

    【讨论】:

    • 好的,将按照 Coreypobrien 的建议尝试一下。
    猜你喜欢
    • 2020-10-15
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2023-03-09
    相关资源
    最近更新 更多