0

I have a problem about running Spring Boot Microservices on Kubernetes. After I installed minikube, I started it and open its dashboard.

Here is the commands to open dashboards.

1 ) minikube start
2 ) minikube dashboard 

Next, I run all services through this command.

kubectl apply -f k8s

After waiting for a certain amount of time, I got this issue shown below.

15:22:37.395 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.cloud.config.client.ConfigClientFailFastException: Could not locate PropertySource and the resource is not optional, failing
 at org.springframework.cloud.config.client.ConfigServerConfigDataLoader.doLoad(ConfigServerConfigDataLoader.java:197)
 at org.springframework.cloud.config.client.ConfigServerConfigDataLoader.load(ConfigServerConfigDataLoader.java:102)
 at org.springframework.cloud.config.client.ConfigServerConfigDataLoader.load(ConfigServerConfigDataLoader.java:61)
 at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:107)
 at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:128)
 at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86)
 at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
 at org.springframework.boot.context.config.ConfigDataEnvironment.processWithProfiles(ConfigDataEnvironment.java:311)
 at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:232)
 at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
 at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
 at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
 at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
 at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
 at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
 at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
 at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
 at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
 at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
 at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
 at com.microservice.orderservice.OrderServiceApplication.main(OrderServiceApplication.java:15)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
 at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
 at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
 at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
 at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://config-server-svc:9296/ORDER-SERVICE/default": connect timed out; nested exception is java.net.SocketTimeoutException: connect timed out
 at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785)
 at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
 at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:602)
 at org.springframework.cloud.config.client.ConfigServerConfigDataLoader.getRemoteEnvironment(ConfigServerConfigDataLoader.java:303)
 at org.springframework.cloud.config.client.ConfigServerConfigDataLoader.doLoad(ConfigServerConfigDataLoader.java:118)
 ... 35 common frames omitted
Caused by: java.net.SocketTimeoutException: connect timed out
 at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
 at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
 at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
 at java.base/java.net.Socket.connect(Socket.java:609)
 at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177)
 at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:508)
 at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:603)
 at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:276)
 at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:375)
 at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:396)
 at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1253)
 at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1187)
 at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081)
 at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1015)
 at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76)
 at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
 at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66)
 at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:776)
 ... 39 common frames omitted

Here is my deployment.yaml file shown below.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-service-app
spec:
  selector:
    matchLabels:
      app: auth-service-app
  template:
    metadata:
      labels:
        app: auth-service-app
    spec:
      containers:
        - name: auth-service-app
          image: noyandocker/authservice
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 7777
          env:
            - name: CONFIG_SERVER_URL
              valueFrom:
                configMapKeyRef:
                  name: config-cm
                  key: config_url
            - name: EUREKA_SERVER_ADDRESS
              valueFrom:
                configMapKeyRef:
                  name: eureka-cm
                  key: eureka_service_address
            - name: DB_HOST
              valueFrom:
                configMapKeyRef:
                  name: mysql-cm
                  key: hostname

---

apiVersion: v1
kind: Service
metadata:
  name: auth-service-svc
spec:
  selector:
    app: auth-service-app
  ports:
    - port: 80
      targetPort: 7777

Here is the config map yaml file

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-cm
data:
  config_url: "config-server-svc"

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: eureka-cm
data:
  eureka_service_address: "http://eureka-0.eureka:8761/eureka"

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  hostname: "mysql-0.mysql"

Here is the config-server-deployment.yaml file

apiVersion: apps/v1
kind: Deployment
metadata:
  name: config-server-app
spec:
  selector:
    matchLabels:
      app: config-server-app
  template:
    metadata:
      labels:
        app: config-server-app
    spec:
      containers:
        - name: config-server-app
          image: noyandocker/configserver
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9296
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 9296
            initialDelaySeconds: 20
            timeoutSeconds: 10
            periodSeconds: 3
            failureThreshold: 2
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 9296
            initialDelaySeconds: 30
            timeoutSeconds: 2
            periodSeconds: 8
            failureThreshold: 1
          env:
            - name: EUREKA_SERVER_ADDRESS
              valueFrom:
                configMapKeyRef:
                  name: eureka-cm
                  key: eureka_service_address

---

apiVersion: v1
kind: Service
metadata:
  name: config-server-svc
spec:
  selector:
    app: config-server-app
  ports:
    - port: 80
      targetPort: 9296

I thought all the services will start simultaneously. Config Server is the Dependent Service for all other Serivces like auth service and this Auth service should not start until Config Server service is up and running.

How can I do that?

Here is my repo : Link

Here is my docker hub : Link

Here is git backend system : Link

1 Answer 1

1

Reading the config-server-deployment.yaml you deploy a service under the name config-server-svc. config-server-svc maps port 80 to 9296 of pods port with label config-server-app.
K8s documentation for svc definition
Your error states:

GET request for "http://config-server-svc:9296/ORDER-SERVICE/default

Your svc serves to port 80 and not to port 9296 which is the pod's port.
Change the port you perform the request. At github spring app you pass an environment variable called CONFIG_SERVER_URL.
If it's empty, you use the localhost:9296. It seems that you pass CONFIG_SERVER_URL environmental variable that spring app will read with wrong port.
When provide a value to CONFIG_SERVER_URL you have to override also the port. Try to add port 80 at config-maps.yaml so the line config_url: "config-server-svc" will become config_url: "config-server-svc:80"

12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.