Может подключаться к модулям elasticsearch с использованием IP-адреса, но без имени модуля

Я добился успеха, прежде чем указывать хосты в моем файле elasticsearch.yaml по IP (адрес жесткого кодирования: порт), но мне сказали, что это плохая практика. Я пытаюсь переключиться на использование только имен модулей для моего кластера ES, и теперь модули не обнаруживаются / не используются в качестве основных. У меня есть configMap elasticsearch.yml для всех трех модулей, которые я монтирую, со следующими характеристиками:

cluster.name: elasticsearch-logs
    node.name: ${HOSTNAME}
    node.master: true
    node.data: true
    network.host: _local_
    transport.tcp.port: 9300
    http.port: 9200 
    bootstrap.memory_lock: false
    xpack.security.enabled: false
    discovery.zen.minimum_master_nodes: 2
    discovery.zen.ping.unicast.hosts: ["es-0:9300", "es-1:9300", "es-2:9300"]

Наряду с этим у меня есть 2 услуги. Один из них - это безголовый сервис, а другой - ClusterIP.

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-svc
  labels:
    component: elasticsearch
    role: master
spec:
  selector:
    component: elasticsearch
    role: master
  ports:
  - name: transport
    port: 9300
    targetPort: 9300
  clusterIP: None


apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-discovery
  labels:
    component: elasticsearch
    role: master
spec:
  selector:
    component: elasticsearch
    role: master
  ports:
  - name: transport
    port: 9300
    protocol: TCP

И в основном файле StatefulSet, который создает модули ES, у меня есть спецификации порта:

ports:
        - containerPort: 9200
          name: db
          protocol: TCP
        - containerPort: 9300
          name: transport
          protocol: TCP

Я пытаюсь заставить все 3 модуля действовать как мастер (и данные / клиент). Когда я смотрю один из журналов модуля (здесь es-0) после создания своих сервисов / наборов состояний, я вижу следующие повторяющиеся ошибки:

[2017-10-16T15:31:29,078][WARN ][o.e.d.z.UnicastZenPing   ] [es-0] timed out after [5s] resolving host [es-1:9300]
[2017-10-16T15:31:29,079][WARN ][o.e.d.z.UnicastZenPing   ] [es-0] timed out after [5s] resolving host [es-2:9300]
[2017-10-16T15:31:32,080][WARN ][o.e.d.z.ZenDiscovery     ] [es-0] not enough master nodes discovered during pinging (found [[Candidate{node={es-0}{TUE-h8SNR6q7WbWUl2Pm-A}{XrTrBg3ATqSvlB3hTlezpg}{172.17.0.3}{172.17.0.3:9300}{ml.max_open_jobs=10, ml.enabled=true}, clusterStateVersion=-1}]], but needed [2]), pinging again
[2017-10-16T15:31:36,111][WARN ][o.e.d.z.UnicastZenPing   ] [es-0] failed to resolve host [es-1:9300]
java.net.UnknownHostException: es-1
    at java.net.InetAddress.getAllByName0(InetAddress.java:1280) ~[?:1.8.0_141]
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[?:1.8.0_141]
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[?:1.8.0_141]
    at org.elasticsearch.transport.TcpTransport.parse(TcpTransport.java:908) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.transport.TcpTransport.addressesFromString(TcpTransport.java:863) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.transport.TransportService.addressesFromString(TransportService.java:691) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.discovery.zen.UnicastZenPing.lambda$null$0(UnicastZenPing.java:212) ~[elasticsearch-5.6.3.jar:5.6.3]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_141]
    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569) [elasticsearch-5.6.3.jar:5.6.3]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]
[2017-10-16T15:31:36,116][WARN ][o.e.d.z.UnicastZenPing   ] [es-0] failed to resolve host [es-2:9300]
java.net.UnknownHostException: es-2
    at java.net.InetAddress.getAllByName0(InetAddress.java:1280) ~[?:1.8.0_141]
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[?:1.8.0_141]
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[?:1.8.0_141]
    at org.elasticsearch.transport.TcpTransport.parse(TcpTransport.java:908) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.transport.TcpTransport.addressesFromString(TcpTransport.java:863) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.transport.TransportService.addressesFromString(TransportService.java:691) ~[elasticsearch-5.6.3.jar:5.6.3]
    at org.elasticsearch.discovery.zen.UnicastZenPing.lambda$null$0(UnicastZenPing.java:212) ~[elasticsearch-5.6.3.jar:5.6.3]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_141]
    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569) [elasticsearch-5.6.3.jar:5.6.3]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]
[2017-10-16T15:31:39,120][WARN ][o.e.d.z.ZenDiscovery     ] [es-0] not enough master nodes discovered during pinging (found [[Candidate{node={es-0}{TUE-h8SNR6q7WbWUl2Pm-A}{XrTrBg3ATqSvlB3hTlezpg}{172.17.0.3}{172.17.0.3:9300}{ml.max_open_jobs=10, ml.enabled=true}, clusterStateVersion=-1}]], but needed [2]), pinging again

Я все еще могу получить доступ к elasticsearch через браузер на node-ip:node-port, но я получаю 503 ошибки, как только пытаюсь сделать /_cluster/state

Я считаю, что у меня есть ошибка на "сетевой" стороне портов, но я не уверен, где именно. На что я должен обратить внимание? Спасибо!

StatefulSet

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: es
  labels:
    component: elasticsearch
    role: master
spec:
  serviceName: elasticsearch
  replicas: 3
  template:
    metadata:
      labels:
        component: elasticsearch
        role: master
      annotations:
       pod.alpha.kubernetes.io/init-containers: '[
        {
          "name": "init-sysctl",
          "image": "alpine:3.4",
          "imagePullPolicy": "IfNotPresent",
          "command": ["sysctl", "-w", "vm.max_map_count=262144"],
          "securityContext": {
            "privileged": true
           }
         }
       ]'
    spec:
      subdomain: elasticsearch-svc
      containers:
      - name: es-master
        securityContext:
          privileged: true
          capabilities:
            add:
              - IPC_LOCK
        image: docker.elastic.co/elasticsearch/elasticsearch:5.6.3
        imagePullPolicy: Always
        env:
        - name: "ES_JAVA_OPTS"
          value: "-Xms512m -Xmx512m"
        ports:
        - containerPort: 9200
          name: http
          protocol: TCP
        - containerPort: 9300
          name: transport
          protocol: TCP
        volumeMounts:
        - name: storage
          mountPath: /data
        - name: config-volume
          mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
          subPath: elasticsearch.yml 
      volumes:
       - name: config-volume
         configMap:
          name: elasticsearch-config
  volumeClaimTemplates:
  - metadata:
      name: storage
      annotations:
        volume.beta.kubernetes.io/storage-class: standard
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 12Gi

person appdap1    schedule 16.10.2017    source источник


Ответы (1)


Вам нужно подключиться с полным именем DNS:

es-0.elasticsearch-internal:9300
person vascop    schedule 16.10.2017
comment
Я пробовал это, и это тоже не сработало :(. Будет ли кластер, являющийся кластером minikube, иметь какое-либо влияние, поскольку это будет означать, что это главный узел кластера с одним узлом? - person appdap1; 16.10.2017
comment
Вы установили serviceName и метки для своего объекта с отслеживанием состояния? - person vascop; 16.10.2017
comment
Да, у меня есть serviceName: elasticsearch, а также ярлыки компонентов / ролей. (Добавил спецификацию в свой пост) - person appdap1; 16.10.2017
comment
serviceName указывает на службу elasticsearch, поэтому в этом случае наборов состояний вы должны использовать одну службу и объединить все порты в ней. В противном случае набор состояний прикрепляется только к тому, который указан в servicename. - person vascop; 16.10.2017
comment
Возможно ли, чтобы он указывал на несколько сервисов? Не уверен, как объединить оба, поскольку один безголовый / NodePort, а другой - ClusterIP - person appdap1; 16.10.2017
comment
Я обновил свои две службы, так что теперь у меня есть ClusterIP и headless с одним и тем же портом. Также добавил спецификацию subdomain: elasticsearch-svc в мою конфигурацию набора состояний и изменил network.host на _local_. Изнутри модулей я смог проверить связь с другими модулями, используя их IP-адреса (172.17.0.X), но не смог использовать имена модулей или es-x.service: 9300. Единственным модулем, который я мог пропинговать, используя имя модуля, был модуль, которым я был сам по себе, и который возвращал что-то вроде PING es-0.elasticsearch-svc.default.svc.cluster.local (172.17.0.3) 56(84) bytes of data. - person appdap1; 17.10.2017