Какова правильная строка подключения для MongoDB, работающего внутри кубернетов? - PullRequest
0 голосов
/ 17 июня 2020

Я начал создавать экземпляр MongoDB, работающий в кластере Kubernetes. Для этого я создал класс хранилища, утверждение тома постоянства и том постоянства и создал службу для подключения других модулей к этой базе данных.

Это yaml-файл, который я использую для развертывания:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: mongo-env
  name: mongo-env
data:
  MONGODB_DBNAME: mymongodb
  MONGODB_PASSWORD: password 
  MONGODB_ROLE: readWrite
  MONGODB_ROOT_PASSWORD: password
  MONGODB_ROOT_ROLE: root
  MONGODB_ROOT_USERNAME: dbadmin
  MONGODB_USERNAME: webrole

---

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /tmp/data/db
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - docker-desktop

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongo-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: Service
metadata:
  name: mongo
spec:
  selector:
    app: mongo
  ports:
  - port: 27017
    targetPort: 27017

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: mongo
  name: mongo
spec:
  serviceName: mongo
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
        - image: mongo
          name: mongo
          ports:
          - containerPort: 27017
          command:
          - mongod
          - "--auth"
          resources: {}        
          volumeMounts:
          - name: mongo-volume
            mountPath: /data/db
          env:
            - name: MONGODB_DBNAME
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_DBNAME
                  name: mongo-env
            - name: MONGODB_PASSWORD
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_PASSWORD
                  name: mongo-env
            - name: MONGODB_ROLE
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_ROLE
                  name: mongo-env
            - name: MONGODB_ROOT_PASSWORD
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_ROOT_PASSWORD
                  name: mongo-env
            - name: MONGODB_ROOT_ROLE
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_ROOT_ROLE
                  name: mongo-env
            - name: MONGODB_ROOT_USERNAME
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_ROOT_USERNAME
                  name: mongo-env
            - name: MONGODB_USERNAME
              valueFrom:
                configMapKeyRef:
                  key: MONGODB_USERNAME
                  name: mongo-env
      volumes:
      - name: mongo-volume
        persistentVolumeClaim:
          claimName: mongo-pvc

Эта база данных позже доступна из модуля, в котором работает приложение java. Итак, приложение java (основанное на фреймворке Quarkus) также работает в модуле и должно подключаться к модулю, в котором работает база данных.

Я следил за этим руководством: https://github.com/DanWahlin/DockerAndKubernetesCourseCode/tree/master/samples/volumes/pv-pvc-sc-cm и изменил мою строку подключения, как описано здесь: # https://kubernetes.io/blog/2017/01/running-mongodb-on-kubernetes-with-statefulsets/

Я использую строку подключения:

mongodb://mongo-0.mongo:27017/mymongodb\_?

, как описано здесь : https://kubernetes.io/blog/2017/01/running-mongodb-on-kubernetes-with-statefulsets/

Доступны следующие услуги:

NAME           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP      10.96.0.1        <none>        443/TCP        20d
mongo          ClusterIP      10.107.252.254   <none>        27017/TCP      28m
quarkus-demo   LoadBalancer   10.97.81.214     localhost     85:31571/TCP   22m

mon go - это сервис для подключения к базе данных.

Модули, которые работают в моем кластере (это docker кластер кубернетов рабочего стола):

NAME                           READY   STATUS             RESTARTS   AGE
mongo-0                        1/1     Running            0          30m
quarkus-demo-d94546556-cn4kk   0/1     CrashLoopBackOff   11         23m
quarkus-demo-d94546556-j84sr   0/1     CrashLoopBackOff   11         23m

Модули приложения вылетают из-за неправильного подключения к базе данных:

2020-06-17 12:44:25,027 INFO  [org.mon.dri.cluster] (vert.x-worker-thread-1) Cluster created with settings {hosts=[mongo-0.mongo:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
2020-06-17 12:44:25,054 INFO  [org.mon.dri.cluster] (cluster-ClusterId{value='5eea1029077d6a3e0f6934f7', description='null'}-mongo-0.mongo:27017) Exception in monitor thread while connecting to server mongo-0.mongo:27017: com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70)
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.ConnectException: Connection refused (Connection refused)   

Я уже пробовал несколько возможностей, но ни одна из них не сработала. Буду признателен за любую помощь в этом. Спасибо!

...