连接到不同命名空间中的 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.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 name/connection 字符串.,?
我们是否应该在这里使用 kubernetes 部署而不是 statefulsets?
这是进入 mongo-0 pod
的方法
kubectl --kubeconfig=configfile.yaml exec -ti mongo-0 sh
我想你正在找这个 DNS for Services and Pods。
的完全限定域名 (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
谁能指出如何使用 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.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 name/connection 字符串.,?
我们是否应该在这里使用 kubernetes 部署而不是 statefulsets?
这是进入 mongo-0 pod
的方法kubectl --kubeconfig=configfile.yaml exec -ti mongo-0 sh
我想你正在找这个 DNS for Services and Pods。
的完全限定域名 (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 nohostname
but withsubdomain
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 unlesspublishNotReadyAddresses=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