2

谁能指出如何使用命令行客户端或带有连接字符串的.net核心程序使用mongo客户端连接到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-0.mongo.mongodatabase.cluster.svc.localpod-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 客户端连接时使用正确的 dns 名称/连接字符串,也可以从 java/.net core 等程序中使用吗?

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

4

4 回答 4

3

您需要通过命名空间的 dns 引用 mongo 服务。因此,如果您的 mongo 服务是mymongoapp并且它部署在 中mymongonamespace,您应该能够以mymongoapp.mymongonamespace.

为了测试,我使用了bitnami/mongodbdocker 客户端。如下:

从内部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
于 2019-05-29T14:46:37.760 回答
0

这就是你如何进入 mongo-0 pod

kubectl --kubeconfig=configfile.yaml  exec -ti mongo-0 sh
于 2019-05-28T06:59:51.283 回答
0

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

Services您可以拥有 a或a 的完全限定域名 (FQDN) Pod

另外请看一下这个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 Server 也会返回 Pod 的完全限定主机名的 A 记录。例如,给定一个 Pod,其主机名设置为“<code>busybox-1”,子域设置为“<code>default-subdomain”,并且在同一个命名空间中有一个名为“<code>default-subdomain”的无头服务,该 pod 会将其自己的 FQDN 视为“<code>busybox-1.default-subdomain.my-namespace.svc.cluster.local”。DNS 以该名称提供一条 A 记录,指向 Pod 的 IP。“<code>busybox1”和“<code>busybox2”两个 pod 都可以有各自不同的 A 记录。

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

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

于 2019-05-29T12:28:55.403 回答
0

您关于 Deployments 与 StatefulSets 的问题应该是另一个问题。但答案是当你想要“稳定的持久存储” kubernetes.io时使用 StatefulSet 。

同样来自同一页面“稳定是 Pod(重新)调度的持久性的代名词”。因此,基本上您的 mongo 实例由 PeristentVolume 支持,并且您希望在重新安排 pod 后重新附加卷。

于 2019-05-29T13:49:21.740 回答