Kubernetes - Подключите поиск Elasti c из приложения springboot в minikube - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь запустить kubernetes ближе локально с помощью minikube. Это моя первая попытка с кубернетами. Поэтому я не знаком со всеми его аспектами. Я пытаюсь развернуть приложение весенней загрузки, которое подключается к поисковому серверу elasti c.

springboot deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp1:latest
          imagePullPolicy: Never

Elasti c поисковый сервер deployment.yaml

    apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
spec:
  selector:
    matchLabels:
      run: elasticsearch
  replicas: 1
  template:
    metadata:
      labels:
        run: elasticsearch
    spec:
      containers:
        - image: docker.elastic.co/elasticsearch/elasticsearch:6.6.1
          name: elasticsearch
          imagePullPolicy: IfNotPresent
          env:
            - name: discovery.type
              value: single-node
            - name: cluster.name
              value: elasticsearch
          ports:
          - containerPort: 9300
            name: nodes
          - containerPort: 9200
            name: client

Exposed elasti c служба поиска следующим образом

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    service: elasticsearch
spec:
  ports:
    - name: client
      port: 9200
      protocol: TCP
      targetPort: 9200
    - name: nodes
      port: 9300
      protocol: TCP
      targetPort: 9300
  type: NodePort

  selector:
    run: elasticsearch

Аналогично, Я также выставил сервис приложения springboot. Теперь мне интересно, как я могу подключиться из служб springboot к службе поиска elasti c.

Когда поиск springbbot и elasti c был нормальным развертыванием на одной машине (не в кубернетах), я подключился, используя как

RestClient.builder(new HttpHost("localhost", 9200))
                .build();

Как лучше всего подключиться к поиску elasti c из springboot в кубернетах?

Сохраните IP-адрес службы поиска elasti c в переменной среды и используйте его в Springboot или используйте имя службы службы поиска elasti c?

Пожалуйста, посоветуйте

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Вы должны иметь возможность получить доступ к службе из кластера, используя:

http://servicename.servicenamespace: serviceport

Kubernetes dns internal для кластера будет разрешить имя службы как имя хоста. Если они находятся в одном пространстве имен, вам, вероятно, не нужно пространство имен serivce

Учитывая приведенный выше yaml, и если вы использовали пространство имен по умолчанию как для elasticsearch, так и для myapp, то процесс myapp может подключаться через:

http://elasticsearch:9200
1 голос
/ 18 мая 2020

Теперь я могу подключиться к elasti c search из моего приложения springboot. Как-то springboot не может подключить его, используя http://elasticsearch: 9200 .

Вместо этого я передаю ip и порт открытого elasti c search service (эквивалент порта 9200 для minikube service elasticsearch --url ) (ip узла: открытый Nodeport 9200) на каждый запрос springboot, который подключается к elasti c search service и теперь я могу подключить его.

Я знаю, что это не идеальное решение, и не знаю, почему он не может разрешить servicename в ip . Но, по крайней мере, я могу продолжить.

Это будет полезно, если кто-то может предложить способы исправить / диагностировать проблему

******* ОБНОВЛЕНИЕ ******

Наконец-то springboot может подключаться к поиску elasti c, используя http://elasticsearch: 9200 . Я не знаю, какое из внесенных мной изменений исправило это. Я изменил свой elasticsearch с Deployment на Statefulset , как показано в следующем yaml, но это изменение не было сделано для устранения этой проблемы.

Еще одно изменение, которое я сделал, - в этикетке. Я изменил его с "run": "elasticsearch" на "app": "elastcisearch" , но я не знаю, помогло ли это в этом. (Я собираюсь прочитать другие изменения ярлыков и посмотреть, имеет ли это какой-либо эффект). Пожалуйста, посмотрите последний файл elasticsearch.yaml (более подробное описание файла можно увидеть на Minikube - Невозможно получить какие-либо результаты от поиска elasti c, если он использует существующие индексы )

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
spec:
  serviceName: "elasticsearch"
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      initContainers:
      - name: set-permissions
        image: registry.hub.docker.com/library/busybox:latest
        command: ['sh', '-c', 'mkdir -p /usr/share/elasticsearch/data && chown 1000:1000 /usr/share/elasticsearch/data' ]
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:6.6.1
        env:
        - name: discovery.type
          value: single-node
        ports:
        - containerPort: 9200
          name: client
        - containerPort: 9300
          name: nodes
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      volumes:
      - name: data
        hostPath:
          path: /indexdata
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    service: elasticsearch
spec:
  ports:
  - port: 9200
    name: client
  - port: 9300
    name: nodes
  type: NodePort  
  selector:
    app: elasticsearch
...