如何在Kubernetes ConfigMap中添加协议前缀



在我的Kubernetes集群中,我有一个ConfigMap对象,其中包含我的Postgres pod的地址。它是用以下YAML:创建的

apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-configmap
data:
database_url: postgres-service

现在,我在部署的一个配置中引用了这个值:

env:
- name: DB_ADDRESS
valueFrom:
configMapKeyRef:
name: postgres-configmap
key: database_url

此部署是一个Spring Boot应用程序,旨在与数据库通信。因此,它从DB_ADDRESS环境变量中读取数据库的URL。(忽略默认值,这些值仅在开发过程中使用(

datasource:
url: ${DB_ADDRESS:jdbc:postgresql://localhost:5432/users}
username:  ${POSTGRES_USER:postgres}
password:  ${POSTGRES_PASSWORD:mysecretpassword}

因此,根据日志,问题是地址必须具有jdbc:postgresql://前缀。在ConfigMap的YAML或application.yml中,我需要将前缀协议字符串与变量连接起来。你知道如何用yml或其他变通方法吗?

Kubernetes环境变量声明可以嵌入其他环境变量的值。这是Kubernetes唯一支持的字符串操作,而且它几乎只适用于env:块。

对于此设置,一旦从ConfigMap中检索到数据库主机名,就可以将其嵌入到更完整的SPRING_DATASOURCE_URL环境变量中:

env:
- name: DB_ADDRESS
valueFrom:
configMapKeyRef:
name: postgres-configmap
key: database_url
- name: SPRING_DATASOURCE_URL
value: 'jdbc:postgresql://$(DB_ADDRESS):5432/users'

您可以类似地参数化端口(尽管它几乎总是标准端口5432(和数据库名称。避免将这些设置放在Spring概要文件YAML文件中,如果任何部署时设置发生更改,则必须在该文件中重新构建应用程序。

如果您创建了一个服务,它将为您提供一个主机名(服务的名称(,然后您可以在ConfigMap中使用该主机名。例如,如果您创建了一个名为postgres的服务,那么您的ConfigMap将看起来像:

apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-configmap
data:
database_url: jdbc:postgresql://postgres:5432/users

最新更新