从托管在 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 pods 和 dig 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'?
我有启用了 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 pods 和 dig 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'?