如何在 Kubernetes 中部署连接阿里云 RDS 数据库应用

文章导读
在 Kubernetes 中部署连接阿里云 RDS 的应用,推荐将容器服务 ACK 集群与 RDS 实例部署在同一地域的同一 VPC 内,通过 RDS 私网地址连接。适用场景为生产环境或需要低延迟、高安全性的业务,风险边界在于需正确配置 RDS 白名单放行 K8s 节点 IP 段。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Kubernetes 中部署连接阿里云 RDS 的应用,推荐将容器服务 ACK 集群与 RDS 实例部署在同一地域的同一 VPC 内,通过 RDS 私网地址连接。适用场景为生产环境或需要低延迟、高安全性的业务,风险边界在于需正确配置 RDS 白名单放行 K8s 节点 IP 段。

先说结论:使用 ACK 集群私网访问 RDS 私网地址,配合 Kubernetes Secret 管理凭证,避免公网暴露和密码明文。

  • 适合:生产环境、对延迟敏感、需要内网隔离的业务
  • 先准备:获取 RDS 内网地址、规划 K8s 节点 CIDR、创建 Secret
  • 验收:在 Pod 内测试数据库端口连通性、验证应用日志无报错

命令速用版

创建存储数据库凭证的 Secret,并在部署时注入环境变量。

kubectl create secret generic db-credentials \
  `--from-literal`=username=myuser \
  `--from-literal`=password=mypassword \
  `--namespace`=default

Deployment 配置片段引用 Secret:

env:
  - name: DB_HOST
    value: "rm-xxxxx.mysql.rds.aliyuncs.com"
  - name: DB_USER
    valueFrom:
      secretKeyRef:
        name: db-credentials
        key: username
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-credentials
        key: password

为什么会这样

私网通信能避免数据库端口暴露在公网,降低被扫描攻击的风险,同时内网带宽通常比公网更稳定。

Kubernetes 集群中的 Pod IP 通常是动态变化的,直接放行单个 Pod IP 不现实。阿里云 RDS 白名单机制支持放行整个 VPC 网段或 K8s 节点所在的交换机网段。如果 K8s 集群与 RDS 不在同一 VPC,需要通过云企业网 CEN 或专线打通网络,否则无法通过私网连接。

分步处理

第一步:获取 RDS 内网连接地址。

登录阿里云 RDS 控制台,在实例详情页找到“内网地址”。确认该地址对应的 VPC 与 ACK 集群所在的 VPC 一致。如果不一致,需要调整网络架构或使用公网地址(不推荐)。

第二步:配置 RDS 白名单。

在 RDS 控制台“白名单设置”中,添加 ACK 集群节点所在的交换机网段。如果 ACK 集群使用了 NAT 网关访问外部,需放行 NAT 网关的 IP 地址。公开资料中没有看到可靠的量化数据表明白名单生效延迟,通常配置后秒级生效,但建议等待 1-2 分钟再测试。

第三步:创建 Kubernetes Secret。

使用 kubectl 命令创建 Secret,避免将密码明文写在 Deployment YAML 文件中。生产环境建议结合外部密钥管理服务(如阿里云 KMS)动态注入。

如何在 Kubernetes 中部署连接阿里云 RDS 数据库应用

第四步:部署应用并配置环境变量。

在 Deployment 的 spec.template.spec.containers.env 中引用 Secret。确保应用支持通过环境变量读取数据库连接信息。

怎么验证是否生效

进入运行中的 Pod 内部,使用 telnet 或 nc 命令测试数据库端口连通性。

kubectl exec -it <pod-name> -- bash
telnet rm-xxxxx.mysql.rds.aliyuncs.com 3306

如果 telnet 显示 Connected 或 nc 返回成功,说明网络层连通。接着检查应用日志,确认无“Connection refused”或“Access denied”错误。如果应用有健康检查接口,查看 Kubernetes 就绪探针状态是否为 True。

常见坑

1. 白名单未覆盖 NAT IP:如果 K8s 集群节点通过 NAT 网关访问 RDS,仅放行节点私网 IP 无效,必须放行 NAT 网关的公网 IP 或绑定 EIP。

2. 使用公网地址:公网地址会导致数据库暴露在互联网,且受公网带宽限制,延迟波动大,仅适合开发测试环境。

3. 密码明文泄露:避免将数据库密码硬编码在代码仓库或 YAML 文件中,一旦泄露难以轮换。

4. DNS 解析问题:部分基础镜像缺少 dnsutils 工具,导致 Pod 内无法解析 RDS 域名,需安装 bind-utils 或使用 IP 连接(不推荐,IP 可能变)。

常见问题

如何获取 RDS 内网地址?

登录阿里云 RDS 控制台,点击实例 ID,在“数据库连接”页面查看内网地址。

连接报错 Connection refused 怎么办?

检查 RDS 白名单是否包含 K8s 节点 IP 或 NAT 网关 IP,确认安全组规则允许 3306 端口 inbound。

如何在 K8s 中管理数据库密码轮换?

更新 Secret 后重启 Pod 可加载新密码,生产环境建议配合 Operator 或外部密钥管理工具实现自动轮换。

参考来源

  • 阿里云文档,容器服务 Kubernetes 版 ACK 产品页,https://help.aliyun.com/product/85210.html
  • 阿里云文档,云数据库 RDS 产品页,https://help.aliyun.com/product/26081.html
  • Kubernetes 官方文档,Secrets,https://kubernetes.io/docs/concepts/configuration/secret/