在 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`=defaultDeployment 配置片段引用 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)动态注入。
第四步:部署应用并配置环境变量。
在 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/