Estoy trabajando en Springboot y Kubernetes y tengo una aplicación realmente simple que se conecta a la base de datos de Postgres. Quiero obtener el valor de la fuente de datos del mapa de configuración y la contraseña de los secretos como archivo de montaje.
Archivo de mapa de configuración:
apiVersion: v1 kind: ConfigMap metadata: name: customer-config data: application.properties: | server.forward-headers-strategy=framework spring.datasource.url=jdbc:postgresql://test/customer spring.datasource.username=postgresArchivo secretos:
apiVersion: v1 kind: Secret metadata: name: secret-demo data: spring.datasource.password: cG9zdGdyZXM=archivo de implementación:
spec: containers: - name: customerc image: localhost:8080/customer imagePullPolicy: IfNotPresent ports: - containerPort: 8282 volumeMounts: - mountPath: /workspace/config/default name: config-volume - mountPath: /workspace/secret/default name: secret-volume volumes: - name: config-volume configMap: name: customer-config - name: secret-volume secret: secretName: secret-demo items: - key: spring.datasource.password path: passwordSi muevo spring.datasource.password prop de secreto a configmap, entonces funciona bien o si completo su valor como variable env, entonces también funciona bien. Pero como sabemos que ninguno de los dos es una forma segura de hacerlo, ¿alguien puede decirme qué hay de malo con el montaje de archivos para secretos?
Spring Boot 2.4 agregó soporte para importar un árbol de configuración . Este soporte se puede utilizar para consumir la configuración de un volumen montado por Kubernetes.
Como ejemplo, imaginemos que Kubernetes ha montado el siguiente volumen:
etc/ config/ myapp/ username passwordEl contenido del archivo de nombre de usuario sería un valor de configuración y el contenido de la contraseña sería un secreto.
Para importar estas propiedades, puede agregar lo siguiente a su archivo application.properties:
spring.config.import=optional:configtree:/etc/config/ Esto dará como resultado que se establezcan las propiedades myapp.username y myapp.password . Sus valores serán los contenidos de /etc/config/myapp/username y /etc/config/myapp/password respectivamente.
De manera predeterminada, el consumo de secretos a través de la API no está habilitado por razones de seguridad. Spring Cloud Kubernetes requiere acceso a la API de Kubernetes para poder recuperar una lista de direcciones de pods que se ejecutan para un solo servicio. La forma más sencilla de hacerlo cuando se usa Minikube es crear un ClusterRoleBinding predeterminado con privilegios de administrador de clúster.
Ejemplo de cómo crear uno: -
$ kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=predeterminado:predeterminado
Debe proporcionar un tipo de secreto en el archivo de manifiesto. Espero que funcione.
apiVersion: v1 kind: Secret metadata: name: secret-demo type: Opaque data: spring.datasource.password: cG9zdGdyZXM