1、K8s 下一个Pod安装多个应用容器
1.1、什么时候一个 Pod 会有多个容器?
多个容器需要协作完成某个功能,且必须共享:
-
网络命名空间(如监听同一个端口)
-
存储卷(如写入同一日志目录)
-
生命周期(一起启动、一起关闭)
1.1、生产环境中常见的场景
场景 | 主容器 | Sidecar 容器用途 |
---|---|---|
web应用+日志收集 | 一个 Spring Boot应用或Node.js或go接口服务 | fluent-bit,把日志发送到集中的日志监控系统 |
TLS 自动刷新证书 | Nginx / Envoy | cert-manager 插件定期刷新证书 |
数据库连接代理 | App | Istio sidecar / Envoy 代理流量 |
自动配置加载 | App | 容器 A 写入 config 容器 B 读取 |
容器运行所需环境初始化 | 主容器 | init 容器设置密钥、文件、权限 |
2、日志收集 sidecar 容器
🌍 场景:Web 应用 + 日志收集
在很多生产环境中,你的主容器会写日志到本地磁盘 /var/log/app.log,然后希望这些日志能被统一收集起来,比如发到 ELK、Loki、Fluentd。
💡 Pod 中的两个容器:
1️⃣ 主容器:web-app
-
一个 Spring Boot 或 Node.js 应用
-
把运行日志输出到 /var/log/app.log
2️⃣ sidecar 容器:fluent-bit
-
持续监控 /var/log/app.log 文件
-
把日志实时转发到集中式日志系统,比如 Loki、ES
3、TLS 自动刷新证书:给服务自动续签 HTTPS 证书
📌 场景:
你有一个网站,外部用户用 Example Domain 访问,为了安全你用了 Let’s Encrypt 的免费 TLS 证书。但是这些证书每 90 天就会过期一次。
🧩 多容器怎么协作?
-
主容器:Nginx / Envoy / Web 应用
- 提供服务,使用 HTTPS 加密
-
Sidecar 容器:cert-manager 或 ACME 客户端
-
定期去 Let’s Encrypt 拉取最新证书
-
把新证书写入共享目录,主容器自动 reload
-
✅ 价值:
无需人工操作,自动完成 TLS 证书的获取和续签,保障线上服务安全不中断。
4、数据库连接代理:访问数据库时自动加密/鉴权
📌 场景:
某些数据库只允许通过“内部安全代理”连接,比如:
-
Google Cloud SQL / AWS RDS
-
或者你启用了数据库的 mTLS 或基于 IAM 的鉴权
🧩 多容器怎么协作?
-
主容器:Java 应用 / Node.js 服务
- 它以为自己连接的是 localhost:3306
-
Sidecar 容器:Cloud SQL Proxy / RDS Auth Proxy
-
实际去连接远程数据库 + 做加密 + 权限校验
-
主容器只需“以为”数据库就在本地
-
✅ 价值:
业务代码不需要知道数据库的真实地址、安全细节;安全逻辑由 sidecar 代理完成,透明又安全。
4、自动配置加载:读取不断变化的配置数据
📌 场景:
你的服务需要读取某个配置(如访问第三方 API 的密钥),但这个密钥每天轮换,比如放在:
-
K8s Secret
-
外部配置系统(如 Consul、Vault)
🧩 多容器怎么协作?
-
主容器:业务应用
- 定期或启动时读取 /config/api-token.json
-
Sidecar 容器:配置同步器(如 Vault Agent)
- 每隔 10 分钟从 Vault 拉配置,写入共享 volume 中
✅ 价值:
你的应用不需要关心配置从哪来,只关心读文件即可。配置变化由 sidecar 保证。
5、容器运行所需环境初始化:Pod 启动前做准备工作
📌 场景:
你的应用在启动前,需要先做一些准备工作,比如:
-
初始化数据库结构
-
拉取基础数据
-
准备依赖目录或文件
🧩 多容器怎么协作?
-
Init 容器(特殊的 Sidecar):
-
运行一次,在主容器启动前执行
-
例如 python init.py 把数据库 schema 初始化好
-
-
主容器:应用本体
- init 容器执行完才启动
6、数据代理详细说明
✅生产环境中最常用和推荐的数据库连接代理工具总结表:
场景 | 推荐工具 | 是否官方支持 | 是否开源 | 适合谁用 | 备注 |
---|---|---|---|---|---|
Google Cloud SQL (MySQL/PostgreSQL) | cloud-sql-proxy | ✅ 是 | ✅ 是 | 使用 GCP 的公司 | GCP 官方最佳实践 |
AWS RDS(IAM 鉴权) | aws-rds-auth-proxy / IAM auth token | ✅ 是 | ✅ 是 | 使用 AWS 的公司 | 无需存储密码,IAM 鉴权 |
本地私有云 / 传统 IDC / 普通 MySQL | envoy / haproxy / proxysql | ❌(第三方) | ✅ 是 | 复杂场景,如读写分离、SQL 路由 | 强大但运维成本高 |
阿里云 RDS | 内网直连 + RAM 鉴权代理(无官方 proxy) | ⚠️ 部分支持 | ❌ 无 | 使用阿里云的公司 | 通常结合 VPC + SLB 做内网隔离 |
数据库凭据托管(HashiCorp Vault) | vault-agent(sidecar)+ 动态生成密码 | ✅ 是 | ✅ 是 | 对安全要求极高的团队 | 密码自动轮换 + 自动注入 |
6.2、推荐:Cloud SQL Proxy / AWS RDS Auth Proxy
-
✅ 优点:
-
官方维护,开箱即用
-
支持身份鉴权(IAM / Service Account)
-
安全性高,不用在 Java 项目里配置明文密码
-
容器化部署友好(sidecar)
-
自动 TLS、自动续签
-
-
❌ 适用前提:
- 你的数据库部署在 云平台(如 GCP / AWS) 上
6.3、如果你是自己部署的 MySQL
✅ 轻量级通用方案:ProxySQL或Envoy
-
ProxySQL:
-
适合复杂查询场景(如 SQL 路由、分库分表、读写分离)
-
社区稳定,MySQL 场景广泛使用
-
-
Envoy:
-
可作为通用 TCP proxy,用于 Kubernetes sidecar 架构
-
与 Istio、Consul 等集成非常方便
-
🎯 总结一句话:
如果你用 云数据库(GCP/AWS),那就优先选 官方 proxy(如 cloud-sql-proxy、aws-rds-auth-proxy),安全、无密码、免维护;
如果你用的是自己部署的 MySQL,想要 SQL 路由和读写分离,可以考虑 ProxySQL。