EKS部署中Laravel应用通过Secrets和ConfigMap连接RDS失败
Laravel on EKS 无法连接同VPC内的RDS实例:连接被拒绝
错误信息
Illuminate\Database\QueryException: SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select count(*) as aggregate from 'users' where 'email' = jhon@gmail.com) in file /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 829 #0 /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php(983): Illuminate\Database\Connection->runQueryCallback('select count(*)...', Array, Object
相关配置文件
deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: ecom-deployment namespace: ecom-eks spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: ecom template: metadata: labels: app.kubernetes.io/name: ecom spec: containers: - name: ecom image: public.ecr.aws/v9v3b4i5/ecom-api:latest imagePullPolicy: Always ports: - containerPort: 8010 envFrom: - configMapRef: name: ecom-configmap env: - name: DB_USERNAME valueFrom: secretKeyRef: name: ecom-secret key: db_username - name: DB_PASSWORD valueFrom: secretKeyRef: name: ecom-secret key: db_password
secret.yml
apiVersion: v1 kind: Secret metadata: name: ecom-secret namespace: ecom-eks type: Opaque data: db_username: rds_username db_password: rds_password
configmap.yml
apiVersion: v1 kind: ConfigMap metadata: name: ecom-configmap namespace: ecom-eks data: APP_NAME: Laravel APP_ENV: local APP_KEY: 'base64:BPCsfQr+Wk46OcItjF0tXeHI8088jJA1Dr218vfL7is=' APP_DEBUG: 'true' APP_URL: http://localhost LOG_CHANNEL: stack LOG_DEPRECATIONS_CHANNEL: null LOG_LEVEL: debug DB_CONNECTION: mysql DB_HOST: ecom.c7ebhqk.us-east-1.rds.amazonaws.com DB_PORT: '3306' DB_DATABASE: ecom BROADCAST_DRIVER: log CACHE_DRIVER: file FILESYSTEM_DISK: local QUEUE_CONNECTION: sync SESSION_DRIVER: file SESSION_LIFETIME: '120' MEMCACHED_HOST: 127.0.0.1 REDIS_HOST: 127.0.0.1 REDIS_PASSWORD: null REDIS_PORT: '6379' MAIL_MAILER: smtp MAIL_HOST: mailpit MAIL_PORT: '1025' MAIL_USERNAME: null MAIL_PASSWORD: null MAIL_ENCRYPTION: null MAIL_FROM_ADDRESS: 'hello@example.com' MAIL_FROM_NAME: "${APP_NAME}" PUSHER_APP_ID: '' PUSHER_APP_KEY: '' PUSHER_APP_SECRET: '' PUSHER_HOST: '' PUSHER_PORT: '443' PUSHER_SCHEME: https PUSHER_APP_CLUSTER: mt1 VITE_PUSHER_APP_KEY: "${PUSHER_APP_KEY}" VITE_PUSHER_HOST: "${PUSHER_HOST}" VITE_PUSHER_PORT: "${PUSHER_PORT}" VITE_PUSHER_SCHEME: "${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER: "${PUSHER_APP_CLUSTER}"
已完成的验证步骤
- 进入Pod打印环境变量,确认ConfigMap和Secrets的配置值已正确注入
- 通过命令
mysql -h ecom.c7ebhqk.us-east-1.rds.amazonaws.com -u admin -p xxxxx成功连接RDS数据库
排查与解决建议
1. 修复Secret的base64编码问题
Kubernetes Secret的data字段要求值必须是base64编码后的字符串,当前secret.yml中直接填写了明文的rds_username和rds_password,会导致Laravel获取到错误的用户名/密码,触发连接拒绝。
修复方法:
对实际的RDS用户名和密码进行base64编码:
echo -n "你的RDS实际用户名" | base64 echo -n "你的RDS实际密码" | base64
将输出的编码字符串替换到secret.yml的对应字段中,重新应用Secret:
kubectl apply -f secret.yml -n ecom-eks
2. 确认Laravel是否正确读取环境变量
虽然Pod的环境变量已正确注入,但需要验证Laravel是否真正加载了这些值:
进入Pod执行:
php artisan tinker
在tinker中执行以下命令验证配置:
env('DB_HOST'); env('DB_USERNAME'); env('DB_PASSWORD');
确认这些值与预期一致,尤其是用户名和密码是否正确解码。
3. 检查RDS安全组的入站规则
确保RDS实例的安全组配置了允许EKS节点/ Pod访问3306端口的入站规则:
- 如果使用EKS托管节点组:允许节点组所在的安全组访问RDS的3306端口
- 如果使用Fargate:允许Fargate Pod所在的安全组访问RDS的3306端口
4. 清除Laravel配置缓存
Laravel可能缓存了旧的数据库配置,导致没有读取最新的环境变量:
进入Pod执行:
php artisan config:clear
然后重启Pod或者重新部署,确保配置生效。
5. 在Pod内直接测试RDS连接
在Laravel Pod内安装mysql客户端(如果镜像没有预装),用Pod内的环境变量直接测试连接:
apt-get update && apt-get install -y mysql-client mysql -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_DATABASE}
如果此连接失败,说明环境变量传递或网络存在问题;如果成功,则需要排查Laravel的数据库配置逻辑。
内容的提问来源于stack exchange,提问作者Spiral
相关产品推荐
相关产品推荐

