将Kubernetes Secret注入PostgreSQL环境导致应用Pod崩溃
问题描述
将Kubernetes Secret的值注入Pod环境变量后,后端应用无法连接PostgreSQL,抛出包含Prohibited character的异常。相关配置及排查信息如下:
Secret配置(pg-secrets.yml)
apiVersion: v1 kind: Secret metadata: name: pg-secrets type: Opaque data: POSTGRES_USER: cG9zdGdyZXMK POSTGRES_PASSWORD: cGFzc3dvcmQK # postgres & password
Deployment环境变量注入(application-deployment.yml)
apiVersion: apps/v1 kind: Deployment ... spec: containers: - name: realo image: abialiauski/realo imagePullPolicy: Always ports: - containerPort: 8080 env: - name: PG_USERNAME valueFrom: configMapKeyRef: name: realo-configmap key: PG_USERNAME - name: PG_PASSWORD valueFrom: secretKeyRef: name: pg-secrets key: POSTGRES_PASSWORD - name: PG_HOST value: postgres
Spring配置(application.yml)
spring: application: name: realo datasource: username: ${PG_USERNAME} password: ${PG_PASSWORD} url: jdbc:postgresql://${PG_HOST}:5432/postgres driver-class-name: org.postgresql.Driver
异常信息
Caused by: org.postgresql.util.PSQLException: Something unusual has occurred to cause the driver to fail. Please report this exception. at org.postgresql.Driver.connect(Driver.java:282) ~[postgresql-42.3.8.jar:42.3.8] ... Caused by: java.lang.IllegalArgumentException: Prohibited character at org.postgresql.shaded.com.ongres.saslprep.SaslPrep.saslPrep(SaslPrep.java:105) ~[postgresql-42.3.8.jar:42.3.8] ...
环境变量检查结果
执行命令:
kubectl exec -i -t pod/realo-66856b59b4-bp27r -- /bin/sh -c 'echo "username: $PG_USERNAME\npassword: $PG_PASSWORD\n"'
输出:
username: postgres\npassword: password
解决方案
问题根源是Secret中POSTGRES_PASSWORD的base64编码包含隐藏的换行符(\n),导致传入PostgreSQL驱动的密码带有非法字符,触发SaslPrep校验失败。
解决步骤:
重新生成不带换行的base64编码:
使用echo -n避免默认添加换行符,执行命令:echo -n "password" | base64得到正确的编码值:
cGFzc3dvcmQ=(原编码cGFzc3dvcmQK末尾的K对应换行符)更新Secret配置:
修改pg-secrets.yml中的POSTGRES_PASSWORD值为新生成的编码:POSTGRES_PASSWORD: cGFzc3dvcmQ=重新应用Secret:
kubectl apply -f pg-secrets.yml重启Deployment使配置生效:
kubectl rollout restart deployment/realo
完成后,应用将使用无换行符的正确密码连接PostgreSQL,异常会消失。
内容的提问来源于stack exchange,提问作者h1alexbel
相关产品推荐
相关产品推荐

