连接到不同命名空间中的 Kubernetes mongo 数据库

Connect to Kubernetes mongo db in different namespace

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

我们在 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 客户端以及 java/.net core 等程序连接时使用正确的 dns name/connection 字符串.,?

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

这是进入 mongo-0 pod

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

我想你正在找这个 DNS for Services and Pods

您可以拥有 Services or for a Pod.

的完全限定域名 (FQDN)

另请查看此 ,因为我认为它将为您提供有关如何从不同命名空间访问它的答案。

示例如下所示:

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

If there exists a headless service in the same namespace as the pod and with the same name as the subdomain, the cluster’s KubeDNS Server also returns an A record for the Pod’s fully qualified hostname. For example, given a Pod with the hostname set to “busybox-1” and the subdomain set to “default-subdomain”, and a headless Service named “default-subdomain” in the same namespace, the pod will see its own FQDN as “busybox-1.default-subdomain.my-namespace.svc.cluster.local”. DNS serves an A record at that name, pointing to the Pod’s IP. Both pods “busybox1” and “busybox2” can have their distinct A records.

The Endpoints object can specify the hostname for any endpoint addresses, along with its IP.

Note: Because A records are not created for Pod names, hostname is required for the Pod’s A record to be created. A Pod with no hostname but with subdomain will only create the A record for the headless service (default-subdomain.my-namespace.svc.cluster.local), pointing to the Pod’s IP address. Also, Pod needs to become ready in order to have a record unless publishNotReadyAddresses=True is set on the Service.

您关于 Deployments 与 StatefulSets 的问题应该是不同的问题。但是答案是StatefulSet是你想"Stable Persistent Storage"kubernetes.io的时候用的。

也来自同一页面"stable is synonymous with persistence across Pod (re)scheduling"。所以基本上您的 mongo 实例由 PeristentVolume 支持,并且您希望在重新安排 pod 后重新附加该卷。

您需要通过命名空间 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