在不同命名空间中连接Kubernetes的Mongo数据库。

3
你可以使用命令行或者从 .net core 程序中使用连接字符串来连接 mongo db 实例,能否指导一下如何实现呢?
我们在 DigitalOcean 上创建了一个示例集群,命名空间为 mongodatabase
我们安装了 3 个副本的 mongo statefulset,并且成功地使用以下命令进行连接: kubectl --kubeconfig=configfile.yaml -n mongodatabase exec -ti mongo-0 mongo 但是,当我们按照以下格式使用不同的命名空间或默认命名空间中的 pod 名称进行连接时,连接失败。
 kubectl --kubeconfig=configfile.yaml  exec -ti mongo-0.mongo.mongodatabase.cluster.svc.local mongo

在连接Mongo客户端的命令行和程序(如Java/.NET Core等)时,需要使用正确的DNS名称/连接字符串,其中mongo-0.mongo.mongodatabase.cluster.svc.local位于pod-0.service_name.namespace.cluster.svc.local(也尝试过pod-0.statfulset_name.namespace.cluster.svc.localpod-0.service_name.statefulsetname.namespace.cluster.svc.local)等中。

此外,我们应该在这里使用Kubernetes部署而不是有状态集吗?


我可以知道为什么这个被投票关闭了吗? - Muthu
你根本不需要使用 kubectl exec 进行常规连接。你所拥有的主机名看起来很适合普通的Mongo客户端。 - David Maze
4个回答

5
您需要通过命名空间 DNS 引用 mongo 服务。因此,如果您的 mongo 服务是 mymongoapp,并且它部署在 mymongonamespace 中,您应该能够将其访问为 mymongoapp.mymongonamespace
为了测试,我使用了 bitnami/mongodb docker 客户端,具体如下:
mymongonamespace 中,可以使用以下命令:
$ kubectl config set-context --current --namespace=mymongonamespace
$ kubectl run mongodbclient --rm --tty -i --image bitnami/mongodb --command -- mongo --host mymongoapp

但是当我切换到默认命名空间时它并没有起作用。
$ kubectl config set-context --current --namespace=default
$ kubectl run mongodbclient --rm --tty -i --image bitnami/mongodb --command -- mongo --host mymongoapp

在命名空间中限定主机名,然后就可以工作了。

$ kubectl run mongodbclient --rm --tty -i --image bitnami/mongodb --command -- mongo --host mymongoapp.mymongonamespace

1
这是一个很棒的答案@frankd。非常感谢你。我一直在与执行容器内命令的exec命令作斗争,而我必须使用run生成客户端容器。最终,以下命令解决了问题。kubectl run mongodbclient --rm --tty -i --image mongo --restart=Never --command -- mongo --host mongo-0.mongo.default.svc.cluster.local以上命令可以从任何其他命名空间访问mongo。 - Muthu

0

以下是如何进入mongo-0 pod的方法

kubectl --kubeconfig=configfile.yaml  exec -ti mongo-0 sh

如果StatefulSet是在同一命名空间中创建的,那么返回true,这是有效的。但如果它在不同的命名空间中,我该如何访问它? - Muthu

0

关于部署(Deployments)和有状态副本集(StatefulSets)的问题,你应该提出一个不同的问题。但是答案是当你想要“稳定的持久存储”时,就会使用StatefulSet kubernetes.io

同样来自同一页,“稳定”与Pod(重新)调度过程中的持久性同义。因此,基本上您的Mongo实例由PeristentVolume支持,并且您希望在重新调度Pod后重新连接卷。


0

我想你可能需要这个服务和Pod的DNS

你可以为一个服务或一个Pod设置完全合格的域名(FQDN)。

此外,请查看一下kubernetes:位于另一个命名空间中的服务,因为我认为它将告诉你如何从不同的命名空间访问它。

一个示例可能是这样的:

apiVersion: v1
kind: Service
metadata:
  name: default-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # Actually, no port is needed.
    port: 1234
    targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

如果在同一命名空间中存在一个无头服务,并且其名称与子域相同,则集群的KubeDNS服务器还会为Pod的完全限定主机名返回A记录。例如,假设将主机名设置为“busybox-1”,子域设置为“default-subdomain”,并且在同一命名空间中有一个名为“default-subdomain” 的无头服务,则Pod将其自己的FQDN视为“busybox-1.default-subdomain.my-namespace.svc.cluster.local”。 DNS在该名称下提供A记录,指向Pod的IP。两个Pod“busybox1”和“busybox2”可以具有其各自不同的A记录。
Endpoints对象可以指定任何端点地址的hostname,以及其IP。
注意:由于不为Pod名称创建A记录,因此需要为Pod的A记录创建hostname。没有hostname但有subdomain的Pod仅会为无头服务(default-subdomain.my-namespace.svc.cluster.local)创建A记录,指向Pod的IP地址。此外,除非在服务上设置了publishNotReadyAddresses=True,否则Pod需要变为就绪状态才能拥有记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接