从托管在 AKS 中的节点服务器连接到 Azure CosmosDB(MongoDB API)失败

Connecting to Azure CosmosDB (MongoDB APIs) from Node Server hosted inside AKS fails

我有启用了 MongoDB API 的 Azure CosmosDB 帐户,我正在尝试从在 Azure Kubernetes 中部署了 3 个副本(3 Pods)的节点服务器进行连接。

只有一个 POD 成功连接到 CosmosDB,另一个 Pods 失败,错误持续存在,CosmosDB 中没有任何配置导致此问题。

请注意,另一个 Java 应用程序也出现了同样的问题,因此我认为这不是节点服务器。

NodeJS尝试连接时的异常:

MongoServerSelectionError: getaddrinfo EAI_AGAIN abc.mongo.cosmos.azure.com
    at Timeout._onTimeout (/app/node_modules/mongodb/lib/sdam/topology.js:312:38)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7) {
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map {
      'abc.mongo.cosmos.azure.com:10255' => [ServerDescription]
    },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'globaldb',
    logicalSessionTimeoutMinutes: undefined
  }
}

代码:

export const connectToDB = async () => {
  const connectionString: string = process.env.CONNECTION_STRING;

  try {
    const mongoClient = new MongoClient(connectionString);
    mongoClient
      .connect()
      .then(() => {
        console.log("Connected successfully to server");
        return Promise.resolve();
      })
      .catch((error: any) => {
        console.log("failed to connect to mongodb!");
        console.log(error);
      });
  } catch (error: any) {
    console.log(error);
  }
};

错误EAI_AGAIN表示这是一个与DNS相关的超时。

您可以 bash into one of the podsdig abc.mongo.cosmos.azure.com 检查它是否具有有效的 DNS 配置。

Kubernetes 中的 DNS 可能有点容易出错,this guide has an excellent walkthrough how they investigated it and they ended up using NodeLocal DNSCache

同时重新启动代码 DNS Pods 有时会有所帮助,并使您的整个集群处于良好状态。

另请参阅: What's the cause of the error 'getaddrinfo EAI_AGAIN'?