У меня есть кластерный хостинг mongodb на атласе в GCP https://cloud.mongodb.com
Я могу подключиться к нему, когда я запускаю свой докер-контейнер на локальном компьютере, подключившись к основному сегменту myapp-shard-00-01-vki7g.gcp.mongodb.net:27017
через мое java-приложение, настроив его таким образом без проблем.
java -Dlog4j.configurationFile=resources/log4j2.properties \
-Dmyapp.myapp.userDatabases=mydb \
-Dmyapp.myapp.port=27018 \
-Dmyapp.mongo.host=myapp-shard-00-01-vki7g.gcp.mongodb.net \
-Dmyapp.mongo.port=27017 \
-Dmyapp.mongo.sslEnabled=true \
-Dmyapp.mongo.authenticationMechanism=SCRAM-SHA-1 \
-Xms1G \
-Xmx3G \
-XX:+UseParallelGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=logs/java_pid.hprof \
-XX:+UseGCOverheadLimit \
-server \
-XX:+UseStringDeduplication \
-jar myapp.jar
export ENV_MYAPP_MONGO_USER=myusername
export ENV_MYAPP_MONGO_PWD=mypassword
export ENV_MYAPP_MONGO_AUTH_SOURCE=admin
Однако, когда я настраиваю тот же контейнер в Kubernetes и выполняю ту же команду вместе с настройкой переменных среды, я получаю следующую ошибку
com.mongodb.MongoCommandException: Command failed with error 40413 (Location40413): 'BSON field 'OperationSessionInfo.$clusterTime' is a duplicate field' on server m8yapp-staging-shard-00-01-vki7g.gcp.mongodb.net:27017. The full response is { "operationTime" : { "$timestamp" : { "t" : 1541424794, "i" : 3 } }, "ok" : 0.0, "errmsg" : "BSON field 'OperationSessionInfo.$clusterTime' is a duplicate field", "code" : 40413, "codeName" : "Location40413", "$clusterTime" : { "clusterTime" : { "$timestamp" : { "t" : 1541424794, "i" : 3 } }, "signature" : { "hash" : { "$binary" : "Lo375z7JMqIYZKjRhlXvJwQzoNE=", "$type" : "00" }, "keyId" : { "$numberLong" : "6592814596526964737" } } } }
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179) ~[mongodb-driver-core-3.8.2.jar!/:?]
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:293) ~[mongodb-driver-core-3.8.2.jar!/:?]
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) [mongodb-driver-core-3.8.2.jar!/:?]
at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99) [mongodb-driver-core-3.8.2.jar!/:?]
at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:444) [mongodb-driver-core-3.8.2.jar!/:?]
Я попытался настроить следующий выход следующим образом:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mongodb-staging
spec:
hosts:
- myapp-shard-00-01-vki7g.gcp.mongodb.net
- myapp-shard-00-00-vki7g.gcp.mongodb.net
- myapp-shard-00-02-vki7g.gcp.mongodb.net
ports:
- number: 27017
name: mongo
protocol: MONGO
resolution: DNS
Я также пытаюсь установить протокол TCP
и разрешение NONE
.
Я могу подключиться к этому mongodb из локальной сети, а также из kubernetes, используя следующую команду:
mongo --host myapp-shard-00-01-vki7g.gcp.mongodb.net --port 27017 --username <myusername> --password <mypassword> --ssl --authenticationDatabase admin
Я не могу опубликовать свой Java-код здесь, но я не совсем уверен, почему Docker-контейнер проходит, когда я запускаю на своем локальном компьютере, когда он выдает вышеуказанную ошибку в Kubernetes.
EDIT
Я пытался добавить это
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mongodb-staging
spec:
hosts:
- myapp-shard-00-01-vki7g.gcp.mongodb.net
ports:
- number: 27017
name: tls-mongo
protocol: tls
resolution: DNS
location: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mongodb
spec:
hosts:
- myapp-shard-00-01-vki7g.gcp.mongodb.net
tls:
- match:
- port: 27017
sni_hosts:
- myapp-shard-00-01-vki7g.gcp.mongodb.net
route:
- destination:
host: myapp-shard-00-01-vki7g.gcp.mongodb.net #primary
port:
number: 27017
weight: 100
Я добавил это, и я все еще получаю ту же ошибку.