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

AWS EKS中Moodle与RDS数据库连接失败问题求助

问题:Moodle Pod无法连接RDS数据库,处于CrashLoopBackOff状态

使用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默认不会自动初始化数据库,需额外验证)。

修复建议

  1. 禁用RDS IAM认证
    修改RDS Terraform配置,关闭IAM数据库认证:

    iam_database_authentication_enabled = false
    
  2. 修正环境变量缩进
    调整Moodle Deployment中的密码环境变量,确保缩进正确:

    env{
      name = "MOODLE_DATABASE_PASSWORD"
      value = aws_db_instance.rds.password
    }
    
  3. 调整PVC挂载路径
    使用Bitnami Moodle镜像的默认数据目录,避免覆盖系统目录:

    volume_mount {
      name = "moodle-ps"
      mount_path = "/bitnami/moodle"
    }
    
  4. 验证数据库存在性
    手动连接RDS实例,确认moodledb数据库已创建。若未创建,可通过MySQL客户端执行CREATE DATABASE moodledb;完成初始化。

  5. 测试网络连通性
    在EKS Pod中执行nc -zv <RDS_ENDPOINT> 3306,验证是否能连通RDS端口。若不通,检查EKS节点安全组的出站规则,确保允许访问3306端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:25:17