在application.yaml中拼接K8s环境变量配置JDBC连接失败排查
问题解决:Spring应用在Kubernetes中无法通过环境变量连接MySQL
问题场景
在minikube运行的Kubernetes集群中:
- MySQL Pod通过ClusterIP类型的
sql-service对外提供服务 - Spring后端Pod通过LoadBalancer类型的
backend-service对外提供服务 - Spring应用中能正常获取到Kubernetes自动生成的
SQL_SERVICE_SERVICE_HOST环境变量值,但application.yaml中的JDBC URL配置始终无法生效,此前两个Pod共享同一个LoadBalancer Service时用localhost可正常连接,最初怀疑是环境变量拼接方式错误。
问题根因
并非环境变量拼接错误,后端Deployment未定义MYSQL_ROOT_PASSWORD环境变量——该变量仅在MySQL容器的Deployment中配置,导致Spring应用无法正确获取数据库密码,从而连接失败。
解决方案
在后端Deployment的容器配置中添加MYSQL_ROOT_PASSWORD环境变量,值与MySQL容器中的配置保持一致。
修正后的后端Deployment配置
apiVersion: apps/v1 kind: Deployment metadata: name: backend-deployment spec: replicas: 1 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend image: <imagelink redacted> ports: - containerPort: 8080 env: - name: MYSQL_ROOT_PASSWORD value: "mysecret" # 与MySQL容器中的密码一致
原application.yaml配置无需修改
spring: jpa: hibernate: ddl-auto: update show-sql: true datasource: url: "jdbc:mysql://${SQL_SERVICE_SERVICE_HOST}:3306/peopledb?createDatabaseIfNotExist=true" username: root password: "${MYSQL_ROOT_PASSWORD}" driver-class-name: com.mysql.cj.jdbc.Driver
添加环境变量后,Spring应用即可正确读取数据库密码,通过Kubernetes Service自动生成的环境变量连接到MySQL服务。
内容的提问来源于stack exchange,提问作者LowlyCoder
相关产品推荐
相关产品推荐

