如何从EKS Pod读取RDS实例



目标

我的目标是从AWS EKS集群中运行的pod连接到RDS(Postgres(数据库。我使用Terraform进行配置,但不一定要寻找Terraform代码解决方案。

我尝试过的

我已经创建了数据库(减少了密码、用户名等设置(,比如:

resource "aws_db_instance" "rds-service" {
name                  = "serviceDB"
engine                = "postgres"
db_subnet_group_name  = aws_db_subnet_group.service_subnet_group.name
}

然后创建了一个安全组以允许流量

resource "aws_security_group" "db" {
name   = "service-rds-access"
vpc_id = module.vpc.vpc_id
ingress {
description = "Postgres from VPC"
from_port   = 5432
to_port     = 5432
protocol    = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}

它使用我创建的子网组(请注意,RDS仅部署在专用子网上,并且我使用的子网是我用于在EKS上部署服务的子网的子集(

resource "aws_db_subnet_group" "service_subnet_group" {
name       = "service-subnet-group"
subnet_ids = [module.vpc.subnet_a_private_id, module.vpc.subnet_b_private_id]
}

什么不起作用

在尝试从Pod连接时,我无法访问RDS。我还尝试过将shell放入pod,并尝试手动连接到RDS实例,如:

运行psql --version时,我得到了:psql (PostgreSQL) 11.9,然后当我尝试通过psql进行身份验证时,比如:

psql --host=$HOST_NAME --port=5432 --username=$USER_NAME --password --dbname=postgres

我得到(编辑是我的(:

psql: could not connect to server: Connection timed out
Is the server running on host "<hostname>.amazonaws.com" <IP> and accepting
TCP/IP connections on port 5432?

您可以使用以下选项来查找根本原因;

  1. 使用VPC可达性分析器:创建并分析路径,其中Source类型为Network Interfaces,Source为部署pod的ec2/节点的Network Interface Id。此外,选择Destination type作为Network Interfaces,Destination作为RDS DB实例的Network Interface Id。将目标端口设置为5432,将协议保持为TCP。然后执行路径分析。如果pod有多个ec2/节点,我假设这些ec2/节点有相同的设置

注意*:完成此路径分析需要几分钟时间。

  1. 如果您启用了VPC流量日志,那么您可以跟踪VPC流量日志来检查哪个aws资源拒绝了网络流量。有关VPC流量日志信息,请参阅AWS的此文档

此外,查看pod的EC2和RDS DB实例的AWS lambda网络接口的VPC流日志。

多亏了amitd的提示,我对调试问题有了更多的了解。我错过了将我创建的vpc_security_group_ids附加到RDS资源。所以添加vpc_security_group_ids = [aws_security_group.db.id]为我解决了这个问题。

最新更新