You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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校验失败。

解决步骤:

  1. 重新生成不带换行的base64编码:
    使用echo -n避免默认添加换行符,执行命令:

    echo -n "password" | base64
    

    得到正确的编码值:cGFzc3dvcmQ=(原编码cGFzc3dvcmQK末尾的K对应换行符)

  2. 更新Secret配置:
    修改pg-secrets.yml中的POSTGRES_PASSWORD值为新生成的编码:

    POSTGRES_PASSWORD: cGFzc3dvcmQ=
    
  3. 重新应用Secret:

    kubectl apply -f pg-secrets.yml
    
  4. 重启Deployment使配置生效:

    kubectl rollout restart deployment/realo
    

完成后,应用将使用无换行符的正确密码连接PostgreSQL,异常会消失。

内容的提问来源于stack exchange,提问作者h1alexbel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:25:22