<p>I have a problem about running Spring Boot Microservices on Kubernetes. After I installed minikube, I started it and open its dashboard.</p>
<p>Here is the commands to open dashboards.</p>
<pre><code>1 ) minikube start
2 ) minikube dashboard 
</code></pre>
<p>Next, I run all services through this command.</p>
<pre><code>kubectl apply -f k8s
</code></pre>
<p>After waiting for a certain amount of time, I got this issue shown below.</p>
<pre><code>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 &quot;http://config-server-svc:9296/ORDER-SERVICE/default&quot;: 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.&lt;init&gt;(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
</code></pre>
<p>Here is my deployment.yaml file shown below.</p>
<pre><code>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
</code></pre>
<p>Here is the configmap yaml file shown below</p>
<pre><code>apiVersion: v1
kind: ConfigMap
metadata:
  name: config-cm
data:
  config_url: &quot;config-server-svc&quot;

---

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

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  hostname: &quot;mysql-0.mysql&quot;
</code></pre>
<p>Here is the config server yaml file shown below</p>
<pre><code>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: 10
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 9296
            initialDelaySeconds: 30
            timeoutSeconds: 2
            periodSeconds: 8
            failureThreshold: 10
          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
</code></pre>
<p>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.</p>
<p><strong>Editted</strong></p>
<p>I added this code snippets shown below in cloud_gateway_deployment.yaml file but it didn't work.</p>
<pre><code>  initContainers:
    - name: init-configserver
      image: noyandocker/configserver
      command: [ 'sh', '-c', &quot;until nslookup config-server-svc.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for config server; sleep 2; done&quot; ]
   
</code></pre>
<p>How can I do that?</p>
<p>Here is my repo : <a href="https://github.com/Rapter1990/springbootmicroservicedailybuffer" rel="nofollow noreferrer">Link</a></p>
<p>Here is my docker hub : <a href="https://hub.docker.com/search?q=noyandocker" rel="nofollow noreferrer">Link</a></p>
<p>Here is git backend system : <a href="https://github.com/Rapter1990/springappconfig" rel="nofollow noreferrer">Link</a></p>

qwercan
<p>If you have a dependency you need other services to wait on, I'd suggest implementing an init container, which will allow you to program the k8s deployment to wait for some dependency to exist or finish starting up. We've done something similar for a database, since many of our spring boot services in k8s need a database to be up.
<a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" rel="nofollow noreferrer">https://kubernetes.io/docs/concepts/workloads/pods/init-containers/</a></p>
<p>Also, make sure you familiarize yourself with the way the k8s network routing works, and DNS for other pods, which uses their name.
<a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/" rel="nofollow noreferrer">https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/</a></p>
