在不同的命名空间中连接到Kubernetes mongo db

时间:2019-05-28 04:23:35

标签: mongodb kubernetes kubernetes-statefulset

谁能指出如何使用mongo客户端(使用命令行客户端)或具有连接字符串的.net核心程序连接到mongo数据库实例?

我们已经在digitalocean中创建了一个带有名称空间的示例集群,比如 mongodatabase

我们安装了具有3个副本的mongo statefulset。我们能够使用以下命令成功连接  kubectl --kubeconfig = configfile.yaml -n mongodatabase exec -ti mongo-0 mongo 但是,当我们从其他名称空间或默认名称空间以以下格式的Pod名称进行连接时,它将无法正常工作。

error[E0191]: the value of the associated type `artifacts` (from the trait `Artifact::Artifact`) must be specified
 --> src/Artifact.rs:4:30
  |
4 |     type artifacts = Vec<Box<dyn Artifact>>;
  |     -------------------------^^^^^^^^^^^^---
  |     |                        |
  |     |                        associated type `artifacts` must be specified
  |     `artifacts` defined here

其中 mongo-0.mongo.mongodatabase.cluster.svc.local 位于 pod-0.service_name.namespace.cluster.svc.local 中(也尝试过pod -0.statfulset_name.namespace.cluster.svc.local和pod-0.service_name.statefulsetname.namespace.cluster.svc.local)等,

在通过命令行与mongo客户端连接以及从java / .net core等程序连接时,可以使用正确的dns名称/连接字符串的任何人吗?

我们还应该在这里使用kubernetes部署而不是statefulsets吗?

4 个答案:

答案 0 :(得分:1)

您需要按命名空间dns引用mongo服务。因此,如果您的mongo服务是mymongoapp且已部署在mymongonamespace中,则您应该能够将其作为mymongoapp.mymongonamespace进行访问。

为了测试,我使用了bitnami / mongodb泊坞窗客户端。如下:

在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 :(得分:0)

这就是进入mongo-0吊舱的方法

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

答案 2 :(得分:0)

我认为您正在寻找这个DNS for Services and Pods

您可以为ServicesPod拥有完全限定的域名(FQDN)。

也请看看这个kubernetes: Service located in another namespace,因为我认为它将为您提供有关如何从不同名称空间访问它的答案。

示例如下:

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
  

如果在与Pod相同的名称空间中存在无头服务,并且与子域具有相同的名称,则群集的KubeDNS服务器还将为Pod的全限定主机名返回A记录。例如,给定一个Pod,该Pod的主机名设置为“ busybox-1”,子域设置为“ default-subdomain”,并且在同一名称空间中使用名为“ default-subdomain”的无头服务,该Pod将其自己的FQDN视为“ busybox-1.default-subdomain.my-namespace.svc.cluster.local”。 DNS以该名称提供A记录,指向Pod的IP。 “ busybox1”和“ busybox2”两个窗格可以有各自不同的A记录。

     

Endpoints对象可以为任何端点地址及其IP指定hostname

     

注意:由于未为Pod名称创建A记录,因此创建Pod的A记录需要hostname。没有hostname但带有subdomain的Pod只会创建无头服务(default-subdomain.my-namespace.svc.cluster.local)的A记录,指向Pod的IP地址。另外,除非在服务上设置了publishNotReadyAddresses=True,否则Pod需要准备好进行记录。

答案 3 :(得分:0)

关于部署vs状态集的问题应该是一个不同的问题。但是答案是,当您需要“稳定的持久性存储” kubernetes.io时使用StatefulSet。

在同一页面上,“稳定是Pod(重新)计划的持久性的同义词”。因此,基本上,您的mongo实例由PeristentVolume支持,并且您希望在重新安排Pod之后重新附加卷。