Access Elasticsearch from minikube/kubernetes

8/8/2019

I have a spring boot application which is deployed in Kubernetes on local windows machine using minikube. I also have Elasticsearch running on my local machine (http://localhost:9200). I want to call Elasticsearch REST endpoints from this spring boot app. I tried solving this by creating a service without selector but not sure what am i missing.

When accessing the spring boot app using http://#minikube_ip#:#Node_Port#, i get an error "No route to host".

i tried doing minikube ssh and executing curl command, from there also i get the same error. Clearly I am missing something here.

application.yaml

elasticsearch:
 hosts:
  - http://my-es:80
 connectTimeout: 10000
 connectionRequestTimeout: 10000
 socketTimeout: 10000
 maxRetryTimeoutMillis: 60000

deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-es-app
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      run: kube-es-app
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: kube-es-app
    spec:
      containers:
        - image: elastic-search-app:latest
          imagePullPolicy: Never
          name: kube-es-app
          ports:
            - containerPort: 8080
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
  name: my-es
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9200
---
kind: Endpoints
apiVersion: v1
metadata:
  name: my-es
subsets:
  - addresses:
      - ip: <MY_LOCAL_MACHINE_IP>
    ports:
      - port: 9200

Commands I executed

docker build -t elastic-search-app .

kubectl create -f deployment.yaml

kubectl expose deployment/kube-es-app --type="NodePort" --port 8080

Can anyone help please? I am stuck

-- SCoder
elasticsearch
kubernetes
minikube
spring
spring-boot

1 Answer

8/14/2019

If I've got the description right, the Windows machine should have vbox network adapter connected to the Host-only-network the Minikube VM is connected to.

Minikube can access the host machine directly because both are in the same network.

The Minikube is in charge of NAT-ting packages from Pods outside. What you need is to allow Elasticsearch to listen to the vbox- or all interfaces, and enable its port in the Windows firewall. Then the Elasticsearch should be available via IP address of Windows in the Host-only-network.

Apart from that, you might create a service (if you need go by name instead of IP) as discussed here:

Connect to local database from inside minikube cluster,

Minikube:Exposing mysql as a service on localhost.

-- mebius99
Source: StackOverflow