首页 > 解决方案 > Kubernetes - 从 minikube 中的 springboot 应用程序连接弹性搜索

问题描述

我正在尝试使用 minikube 在本地更近地运行 kubernetes。这是我第一次尝试 Kubernetes。因此,我并不熟悉它的所有方面。我正在尝试部署一个连接到弹性搜索服务器的 spring boot 应用程序。

springboot 部署.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

弹性搜索服务器 部署.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

暴露弹性搜索服务如下

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 服务连接到弹性搜索服务。

当 springbbot 和弹性搜索在同一台机器上正常部署时(不在 kubernetes 中),我使用 as 连接

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

从 kubernetes 中的 springboot 连接到弹性搜索的最佳方法是什么?

将elasticsearch服务的ip保存在环境变量中,在springboot中使用还是使用elasticsearch服务的服务名?

请指教

标签: spring-bootelasticsearchkubernetes

解决方案


您应该能够使用以下方法从集群中访问该服务:

http://servicename.servicenamespace:serviceport

集群内部的 Kubernetes dns 会将服务名称解析为主机名。如果它们在同一个命名空间中,您可能不需要服务命名空间

鉴于上面的 yaml,并且如果您对 elasticsearch 和 myapp 都使用了默认命名空间,那么 myapp 进程可以通过以下方式连接:

http://elasticsearch:9200

推荐阅读