AWS EKS中Moodle与RDS数据库连接失败问题求助
使用Terraform部署AWS EKS、RDS及Kubernetes环境,采用bitnami/moodle:latest镜像运行Moodle。EKS与RDS处于同一VPC且部署正常,但Moodle Pod无法连接RDS数据库,状态为CrashLoopBackOff,日志明确显示“无法连接到数据库”。
Kubectl命令输出
Pod状态
root@master:~/moodle_deploy# kubectl get pod NAME READY STATUS RESTARTS AGE moodle-54f477b7f8-nh98h 0/1 CrashLoopBackOff 15 70m moodle-54f477b7f8-rhzzj 0/1 CrashLoopBackOff 15 70m
Pod日志
root@master:~/moodle_deploy# kubectl logs moodle-54f477b7f8-rhzzj moodle 06:33:12.43 moodle 06:33:12.43 Welcome to the Bitnami moodle container moodle 06:33:12.43 Subscribe to project updates by watching https://github.com/bitnami/containers moodle 06:33:12.43 Submit issues and feature requests at https://github.com/bitnami/containers/issuesmoodle 06:33:12.43 moodle 06:33:12.44 INFO ==> ** Starting Moodle setup ** realpath: /bitnami/apache/conf: No such file or directory moodle 06:33:12.46 INFO ==> Configuring Apache ServerTokens directive moodle 06:33:12.49 INFO ==> Configuring PHP options moodle 06:33:12.49 INFO ==> Setting PHP expose_php option moodle 06:33:12.51 INFO ==> Validating settings in MYSQL_CLIENT_* env vars moodle 06:33:12.53 INFO ==> Validating settings in POSTGRESQL_CLIENT_* env vars moodle 06:33:12.69 INFO ==> Ensuring Moodle directories exist moodle 06:33:12.78 INFO ==> Trying to connect to the database server moodle 06:34:12.90 ERROR ==> Could not connect to the database
PVC和PV状态
root@master:~/moodle_deploy# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE moodle-pv-claim Bound pvc-eefbb1d9-a6fd-4cf5-b044-159145798114 1Gi RWO gp2 59m root@master:~/moodle_deploy# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-eefbb1d9-a6fd-4cf5-b044-159145798114 1Gi RWO Delete Bound default/moodle-pv-claim gp2 59m
Terraform配置代码
RDS相关配置
//SECURITY GROUP resource "aws_security_group" "secgrp-rds" { name = "secgrp-rdis" description = "Allow MySQL Port" vpc_id = module.vpc.vpc_id ingress { description = "Allowing Connection for mysql" from_port = 3306 to_port = 3306 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { description = "Allowing Connection for SSH" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_db_subnet_group" "sub_ids" { name = "main" subnet_ids = module.vpc.private_subnets tags = { Name = "DB subnet group" } } //RDS INSTANCE resource "aws_db_instance" "rds" { depends_on=[aws_security_group.secgrp-rds] engine = "mysql" engine_version = "5.7" instance_class = "db.t2.micro" allocated_storage = 20 storage_type = "gp2" name = "moodledb" identifier = "moodledb" username = "root" password = "test12345" parameter_group_name = "default.mysql5.7" #publicly_accessible = true skip_final_snapshot = true apply_immediately = true iam_database_authentication_enabled = true db_subnet_group_name = aws_db_subnet_group.sub_ids.id vpc_security_group_ids = [aws_security_group.secgrp-rds.id] }
Kubernetes部署配置
//CREATE DEPLOYMENT - provide rds environment variables resource "kubernetes_deployment" "moodle" { depends_on = [aws_db_instance.rds] metadata { name = "moodle" labels = { App = "moodle" } } spec { replicas = 2 selector { match_labels = { App = "moodle" } } template { metadata { labels = { App = "moodle" } } spec { container { image = "bitnami/moodle:latest" name = "moodle" env{ name = "MOODLE_DATABASE_TYPE" value = "mysqli" } env{ name = "MOODLE_DATABASE_HOST" value = aws_db_instance.rds.endpoint } env{ name = "MOODLE_DATABASE_USER" value = aws_db_instance.rds.username } env{ name = "MOODLE_DATABASE_PASSWORD" value = aws_db_instance.rds.password } env{ name = "MOODLE_DATABASE_NAME" value = aws_db_instance.rds.db_name } port { container_port = 8080 } volume_mount { name = "moodle-ps" mount_path = "/opt/bitnami/apache2/htdocs/" } resources { limits= { cpu = "0.5" memory = "512Mi" } requests= { cpu = "250m" memory = "50Mi" } } } volume { name = "moodle-ps" persistent_volume_claim { claim_name = "moodle-pv-claim" } } } } } } resource "kubernetes_service" "moodle" { depends_on = [kubernetes_deployment.moodle] metadata { name = "moodle" } spec { port { port = 80 target_port = 8080 } type = "LoadBalancer" } } resource "kubernetes_storage_class" "kubeSC" { metadata { name = "kubese" } storage_provisioner = "kubernetes.io/aws-ebs" reclaim_policy = "Retain" parameters = { type = "gp2" } } resource "kubernetes_persistent_volume_claim" "pvc" { depends_on=[kubernetes_storage_class.kubeSC] metadata { name = "moodle-pv-claim" labels = { "app" = "moodle" } } spec { access_modes = ["ReadWriteOnce"] resources { requests = { storage = "1Gi" } } } }
故障排查分析
1. RDS认证方式冲突
RDS启用了iam_database_authentication_enabled = true(IAM数据库认证),但Moodle配置使用的是常规用户名/密码认证。此时RDS会拒绝常规密码登录,导致连接失败。
2. 环境变量配置错误
Moodle Deployment中MOODLE_DATABASE_PASSWORD的value字段存在缩进错误,可能导致环境变量未正确传递给容器,密码配置失效。
3. 容器挂载路径问题
日志显示/bitnami/apache/conf: No such file or directory,原因是PVC挂载路径/opt/bitnami/apache2/htdocs/覆盖了镜像原有目录结构,破坏了Moodle初始化所需的配置文件,间接影响数据库连接流程。
4. 数据库存在性验证
虽然Terraform指定了name = "moodledb",但需要确认RDS实例是否实际创建了该数据库(MySQL默认不会自动初始化数据库,需额外验证)。
修复建议
禁用RDS IAM认证
修改RDS Terraform配置,关闭IAM数据库认证:iam_database_authentication_enabled = false修正环境变量缩进
调整Moodle Deployment中的密码环境变量,确保缩进正确:env{ name = "MOODLE_DATABASE_PASSWORD" value = aws_db_instance.rds.password }调整PVC挂载路径
使用Bitnami Moodle镜像的默认数据目录,避免覆盖系统目录:volume_mount { name = "moodle-ps" mount_path = "/bitnami/moodle" }验证数据库存在性
手动连接RDS实例,确认moodledb数据库已创建。若未创建,可通过MySQL客户端执行CREATE DATABASE moodledb;完成初始化。测试网络连通性
在EKS Pod中执行nc -zv <RDS_ENDPOINT> 3306,验证是否能连通RDS端口。若不通,检查EKS节点安全组的出站规则,确保允许访问3306端口。
内容的提问来源于stack exchange,提问作者kyungwon

