Micronaut app fails to access values from Kubernetes config map

455 views Asked by At

I'm using Micronaut 3.2.3 with the Kubernetes integration to inject configuration values from config maps and secrets.

Dependencies:

    implementation("io.micronaut.kubernetes:micronaut-kubernetes-client")
    implementation("io.micronaut.kubernetes:micronaut-kubernetes-discovery-client")

bootstrap.yml

micronaut:
  application:
    name: ingestor
  config-client:
    enabled: true

kubernetes:
  client:
    config-maps:
      enabled: true
      includes:
        - application
        - ingestor
    secrets:
      enabled: true
      includes:
        - application
        - ingestor

As you can see the application config map includes the kafka.brokers value:

kubectl get configmaps application -o yaml   
  
apiVersion: v1
data:
  application.yml: |
    kafka.brokers: xxx

kubectl get configmaps ingestor -o yaml   
  
apiVersion: v1
data:
  application.yml: |
    prop1: value1

I've added a simple singleton class the check whether the projerty can be injected:

@Singleton
class SomeConfiguration(@Value("\${kafka.brokers}") private val kafkaBrokers: String) {

    init {
        println(kafkaBrokers)
    }

}

Log traces seem to indicate that those config maps are correctly accessed:

15:59:24.206 [OkHttp https://10.222.0.1/...] -  -   DEBUG i.m.k.c.KubernetesConfigurationClient - Adding config map with name application
15:59:24.218 [OkHttp https://10.222.0.1/...] -  -   DEBUG i.m.k.c.KubernetesConfigurationClient - Adding config map with name ingestor

However the application crashes because it couln'd find it:

fun main(args: Array<String>) {
    build()
        .args(*args)
        .eagerInitSingletons(true)
15:59:25.484 [main] -  -   ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [xxx.SomeConfiguration] could not be loaded: Failed to inject value for parameter [kafkaBrokers] of class: xxx.configuration.SomeConfiguration

Message: Failed to inject value for parameter [kafkaBrokers] of class: xxx.configuration.SomeConfiguration

Message: Error resolving property value [${kafka.brokers}]. Property doesn't exist

1

There are 1 answers

0
codependent On BEST ANSWER

This problem was kind of tricky. The key was the name of the yml file used in the config maps, both application and ingestor config maps defined it as application.yml:

apiVersion: v1
data:
  application.yml: |

They can't overlap, so I changed the ingestor configmap to be:

kubectl get configmaps ingestor -o yaml   
  
apiVersion: v1
data:
  ingestor.yml: |
    prop1: value1

And now the kafka.brokers value is found and injected.