Не удалось создать набор реплик Kubernetes MongoDB

Что я намеревался сделать:

  1. Настройте Kubernetes в Digital Ocean
  2. Настроить набор реплик MongoDB в кубернетах

ИЗМЕНИТЬ: шаги, которые я использовал для настройки Kubernetes

Шаги по настройке главного узла:

Настройка Docker с использованием: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

$ sudo apt-get install -y kubelet kubeadm kubectl
$ kubeadm init —pod-network-cidr=192.168.0.0/16 —apiserver-advertise-address=<MASTER_IP>
$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

Версия Kubernetes: v1.18.3 Версия Docker: 19.03.8, сборка afacb8b7f0

Настройка узлов:

Настройка Docker с использованием: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

$ sudo apt-get install -y kubelet kubeadm kubectl
$ kubeadm join <PUBLIC_IP>:6443 --token <token> \
    --discovery-token-ca-cert-hash <hash>

Я успешно выполнил шаг 1, но не могу настроить набор репликов. Команда rs.initiate () завершается ошибкой «В новой конфигурации 1 для набора реплик rs0 не указан хост».

$kubectl get all
NAME                                         READY   STATUS    RESTARTS   AGE
pod/mongo-0                                  1/1     Running   0          16m
pod/mongo-1                                  1/1     Running   0          16m
pod/mongo-2                                  1/1     Running   0          16m
pod/nfs-client-provisioner-5d7cbcd58-qs8r6   1/1     Running   0          43h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP     2d21h
service/mongo        ClusterIP   None         <none>        27017/TCP   16m

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-client-provisioner   1/1     1            1           43h

NAME                                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nfs-client-provisioner-5d7cbcd58   1         1         1       43h

NAME                     READY   AGE
statefulset.apps/mongo   3/3     16m

Команда ниже не работает:

$kubectl exec -it mongo-0 -- mongo
MongoDB shell version v4.2.7
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("64863831-2775-488f-a80d-aabdeb84bad9") }
MongoDB server version: 4.2.7
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
Server has startup warnings: 
2020-05-31T09:46:16.537+0000 I  CONTROL  [initandlisten] 
2020-05-31T09:46:16.537+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-05-31T09:46:16.537+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-05-31T09:46:16.537+0000 I  CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2020-05-31T09:46:16.538+0000 I  CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> rs.initiate({_id: "rs0", version: 1, members: [
...   { _id: 0, host : "mongo-0.mongo:27017" },
...   { _id: 1, host : "mongo-1.mongo:27017" },
...   { _id: 2, host : "mongo-2.mongo:27017" }
... ]});
{
    "operationTime" : Timestamp(0, 0),
    "ok" : 0,
    "errmsg" : "No host described in new configuration 1 for replica set rs0 maps to this node",
    "code" : 93,
    "codeName" : "InvalidReplicaSetConfig",
    "$clusterTime" : {
        "clusterTime" : Timestamp(0, 0),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

Мои файлы yamls:

1. безголовый сервис:

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    app: mongo
spec:
  ports:
  - name: mongo
    port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    app: mongo
  1. набор реплик mongodb
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  selector:
    matchLabels:
       app:  mongo
  serviceName: "mongo"
  replicas: 3
  template:
    metadata:
      labels:
        app: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mongo
        image: mongo
        command:
        - mongod
        - "--replSet"
        - rs0
        - "--bind_ip_all"
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongo-volume
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongo-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

Проблема может быть связана с DNS. Я сделал следующее, чтобы исправить это безуспешно:

  1. Убедитесь, что 27017 открыт на главном и рабочем узлах
$ufw allow 27017
  1. В .yaml попытался установить "bind_ip" в файле .yaml на 127.0.0.1 и 0.0.0.0

Ничего не получилось.

Как исправить эту проблему?


person RajKrishnan    schedule 31.05.2020    source источник
comment
Вы пробовали работать с этим пакетом helm? github.com/helm/ диаграммы / дерево / мастер / стабильный / mongodb-replicaset   -  person Amit Baranes    schedule 31.05.2020
comment
@AmitBaranes, нет, не видел. Установили штурвал. Как вы думаете, поможет ли helm решить эту проблему?   -  person RajKrishnan    schedule 31.05.2020
comment
Это единственное решение, которое сработало для меня. Дайте мне знать, если вы хотите, чтобы я поделился дополнительной информацией   -  person Amit Baranes    schedule 31.05.2020
comment
@AmitBaranes, пожалуйста, поделитесь. Я не использовал helm для настройки MongoDB Replicaset.   -  person RajKrishnan    schedule 31.05.2020
comment
stackoverflow.com/questions/47571358/   -  person D. SM    schedule 31.05.2020
comment
@ D.SM, я уже использую порт 27017. Эта ссылка мне не помогла. Надеюсь, мне не хватает информации по этой ссылке.   -  person RajKrishnan    schedule 01.06.2020
comment
Что у вас внутри файла hosts /etc/hosts?   -  person PjoterS    schedule 01.06.2020
comment
@PjoterS 127.0.1.1 <hostname> <hostname> 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts   -  person RajKrishnan    schedule 02.06.2020


Ответы (1)


Я бы сказал, что у вас проблема с конфигурацией DNS (No host described in new configuration 1 for replica set rs0 maps to this node).

Не уверен, что могло вызвать это, поскольку вы не предоставили спецификацию своей среды, но вы можете устранить ее на основе в этой документации Kubernetes.

Я запускаю ваш YAMLS на моем GKE кластере (к сожалению, у меня нет доступа к Digital Ocean cloud), и он работает без проблем (с "--bind_ip_all").

> rs.initiate({_id: "rs0", version: 1, members: [
... ...   { _id: 0, host : "mongo-0.mongo:27017" },
... ...   { _id: 1, host : "mongo-1.mongo:27017" },
... ...   { _id: 2, host : "mongo-2.mongo:27017" }
... ... ]});
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1591791921, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1591791921, 1)

В каждом из моих модулей в /etc/hosts, помимо записей по умолчанию, у меня есть:

NAME      READY   STATUS    RESTARTS   AGE    IP          NODE                                     
mongo-0   1/1     Running   0          122m   10.52.1.6   gke-cluster-1-default-pool-6f885e04-9mdt
mongo-1   1/1     Running   0          121m   10.52.0.3   gke-cluster-1-default-pool-6f885e04-klkb
mongo-2   1/1     Running   0          120m   10.52.1.7   gke-cluster-1-default-pool-6f885e04-9mdt

mongo-0 pod
10.52.1.6       mongo-0.mongo.default.svc.cluster.local mongo-0

mongo-1 pod
10.52.0.3       mongo-1.mongo.default.svc.cluster.local mongo-1

mongo-2 pod
10.52.1.7       mongo-2.mongo.default.svc.cluster.local mongo-2

Согласно документации Kubernetes, DNS для служб и модулей, особенно часть, касающаяся подов, внутри вашего хост-файла. должна быть запись вроде:

hostname.default-subdomain.my-namespace.svc.cluster-domain.example

В качестве быстрой проверки вы можете вручную добавить эту запись DNS в свой /etc/host файл в модулях и проверить.

Другой обходной путь - Псевдонимы хоста.

Сообщите мне эту помощь. Если нет, предоставьте содержимое /etc/hosts и /etc/resolv.conf файлов из ваших модулей и версии Kubernetes.

Также проверьте, есть ли проблемы с модулями kubectl get pods -A.

person PjoterS    schedule 10.06.2020
comment
По-прежнему не повезло. Вот мой файл / etc / hosts. $kubectl get pods -o wide. Я получил IP-адреса от этой команды и обновил свой файл hosts на всех трех узлах. Вот мое содержимое файла / etc / hosts. 192.168.106.29 mongo-0.mongo.default.svc.cluster.local mongo-0 192.168.240.126 mongo-1.mongo.default.svc.cluster.local mongo-1 192.168.106.30 mongo-2.mongo-default.svc.cluster.local mongo-2 - person RajKrishnan; 11.06.2020
comment
а /etc/resolv.conf - nameserver 127.0.0.53 options edns0. Kubelet выдает ошибку failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd". Связано ли это с этой проблемой. - person RajKrishnan; 11.06.2020
comment
Не могли бы вы добавить информацию к основному вопросу, как вы создали кластер и какая у вас версия Kubernetes и Docker? - person PjoterS; 17.06.2020
comment
Эта проблема (почти в вашем случае у kubelet есть драйвер cgroupfs, а у докера systemd драйвер) упоминалась в Руководство по устранению неполадок Kubernetes Самый простой способ - сменить драйвер cgroup для docker на cgroupfs. В установке Docker шаг 5 (# Настройка демона Docker) вместо exec-opts: [native.cgroupdriver = systemd] используйте exec-opts: [native.cgroupdriver = cgroupfs], - person PjoterS; 24.06.2020