容器化应用与虚拟机共存架构设计

实现容器化应用与传统虚拟机间的数据库访问与服务调用,需解决网络互通、服务发现和安全控制三大核心问题。以下是分层解决方案:

1. 网络层互通
  • 方案:构建覆盖网络(Overlay Network)
    $$ \text{容器网络} \xrightarrow{\text{VXLAN隧道}} \text{物理网络} \xleftarrow{\text{路由}} \text{虚拟机网络} $$
  • 关键配置
    • 容器平台(如Kubernetes)启用host-gateway模式
    • 虚拟机侧配置静态路由指向容器网络CIDR
    • 示例:虚拟机路由表添加条目
    ip route add 10.244.0.0/16 via <宿主机IP> dev eth0
    

2. 服务发现机制
组件 容器环境 虚拟机环境
DNS解析 CoreDNS Bind9
服务注册 Kubernetes Service Consul Agent
流量代理 Ingress Controller Nginx反向代理
  • 跨平台服务调用流程
    $$ \text{容器App} \to \text{CoreDNS} \xrightarrow{\text{转发}} \text{Bind9} \to \text{解析虚拟机服务域名} $$
3. 数据库访问实现

场景:容器Pod访问虚拟机MySQL

  • 步骤
    1. 虚拟机MySQL开放监听(bind-address=0.0.0.0
    2. 容器侧通过Service访问:
      apiVersion: v1
      kind: Service
      metadata:
        name: vm-mysql-proxy
      spec:
        type: ExternalName
        externalName: vm-db-host.company.local # 虚拟机域名
        ports:
        - port: 3306
      

    3. Pod连接串:jdbc:mysql://vm-mysql-proxy:3306/dbname
4. 服务调用安全控制
  • 双向认证
    • 容器侧:ServiceAccount绑定RBAC角色
    • 虚拟机侧:X.509证书认证($ openssl req -x509 -newkey rsa:4096...$
  • 网络策略
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-vm-access
    spec:
      podSelector: {}
      ingress:
      - from:
        - ipBlock:
            cidr: 192.168.1.0/24 # 虚拟机网段
    

5. 混合部署实践案例
graph LR
    A[容器化微服务] -->|gRPC调用| B[虚拟机遗留系统]
    B -->|JDBC| C[(虚拟机Oracle DB)]
    A -->|HTTPS| D[API Gateway]
    D -->|Service Mesh| E[容器Redis集群]

故障排查工具链

  • 网络诊断:tcpdump -i any host <虚拟机IP>
  • 连通性测试:nc -zv <目标IP> <端口>
  • 流量监控:Prometheus + Grafana跨平台Dashboard

关键建议:优先使用Service Mesh(如Istio)抽象网络差异,通过VirtualService统一管理跨平台流量路由,实现渐进式迁移。

更多推荐