V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sidkang
V2EX  ›  NAS

服务隔离的必要性疑问、以及不同 Docker Host 之间通信的方案

  •  
  •   sidkang · 2022-08-14 10:19:40 +08:00 · 1940 次点击
    这是一个创建于 619 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的主机硬件及配置方案

    具体配置可以参考之前的帖子,大概的配置是 5950X+128G+若干存储,host 系统是 proxmox ,安装了若干 lxc 和 vm 。其中有一个 lxc 用作 docker host ,lxc 基本上以服务类型区分,网关、下载、文件服务等等。

    遇到的痛点

    配置混乱,维护困难。难以记忆。作为一台 nas ,基本上不遇到大问题,我是不会进入到 cli 来进行维护,这样造成很容易忘记一些配置容器时的参数,包括挂载路径、密码、用户等等,结果就是上新服务麻烦,维护旧服务也很麻烦;

    预想的解决方案

    通过 ansible 进行各种服务的安装,包括创建 lxc ,安装 /更新 lxc 环境相关组件,安装 docker 服务,创建 /启动 /更新相关容器。目前已经实现了一个 lxc+几个 docker 容器的配置,实验下来体验完好。接下来只要按部就班把需要的服务一个个写成 playbook 就好。

    新方案疑难

    1. 服务隔离。由于使用的配置性能较强,lxc+docker 套娃容器在 CPU 、硬盘性能上没有发现明显瓶颈,内存也够用,所以性能方面的 overhead 可以不用考虑,同时隔离后,我可以根据不同服务分别写一个 playbook ,可以进一步降低未来维护的心智成本;同时,隔离后也可以较为方便的对资源、权限进行加载、设置;所以是否有必要进行服务隔离呢,或者有什么弊端么?
    2. 容器通信。如果 1 中的答案是 yes ,那么接下来的问题是如何让各 lxc 以及其内的 docker 容器进行通信(因为打算数据库应用集中在一个容器、以及反代的需要),目前能想到的有两个方案
      • Docker Swarm 。将所有 lxc 的 docker 组成 swarm ,建立 overlay network 。不考虑 k3s 、k8s 等等,非运维人士,也不打算在这方面更进一步;
      • LXC Private Network over PVE Host 。在 PVE 上建立网桥,将所有 lxc 接入,所有 docker 容器配置为使用这个 interface ,网关容器使用所有 interface 。
      • 上述两个方案简单试了一下,网络性能也没有瓶颈,最慢也可以到 40G 水平,所以倒是不用考虑,配置方面因为使用 ansible ,所以也不是痛点。我能想到的是,通过第二种方式配置,lxc 之间也可以较为方便的通信,方便非 docker 方式安装的应用可以无痛使用。但是不太清楚这两种方式是否有较大的弊端?

    目前有这两大方面的疑问,提前感谢各位给予的各种建议。

    5 条回复    2022-08-15 06:40:42 +08:00
    ltkun
        1
    ltkun  
       2022-08-14 10:33:31 +08:00 via Android
    我就是这么干的 不过也越来越臃肿了 pve 非特权 lxc 里面开 docker 关于互访 我暂时没有考虑 docker 网络配置比较灵活 哪怕不是同一网络都可以通过主机不同端口通信 container 甚至都能得到家里网络的实际 ip
    sidkang
        2
    sidkang  
    OP
       2022-08-14 10:55:48 +08:00
    @ltkun 确实可以,我之所以想搞网络隔离还是希望能够通过白名单的方式来给其他人 /家里人用相关的服务,安全到还是其次,网络简单用的话还是因为这个有点不放心。
    ltkun
        3
    ltkun  
       2022-08-14 11:02:06 +08:00 via Android
    pve 隔离也很方便 因为它自带 VLAN 对于外网用户也可以用各种方式进行隔离 比如我用 openvpn 的不同配置来访问不同子网
    sidkang
        4
    sidkang  
    OP
       2022-08-14 13:52:26 +08:00
    @ltkun 嗯,是,隔离在 lxc 、docker 层面其实都挺方便的,vlan 确实也是个思路。
    ruidoBlanco
        5
    ruidoBlanco  
       2022-08-15 06:40:42 +08:00   ❤️ 4
    根据我的用法,大体说下:

    - 我的 pve 上跑三个 lxc docker host ,按功能分配容器:

    1. caja: jellyfin, heimdall, minio, node-red, paperless-ng, uptime-kuma ,总之各种家用服务
    2. arr: radarr, sonarr, tdarr, transmission, prowlarr ,wireguard ,下载一条龙
    3. adguard: adguardhome ,netinstallxyz ,算「基础设施」吧

    - 每个 docker host ,都是一个 docker-compose 拉起所有服务。容器间如果需要在同一个网络,那么就放同一个 lxc ,比如 arr 里面的东西。

    - 不同所有的配置文件,都在 pve 的同一个目录里,比如 /disk/backup/docker ,然后这个目录用 bind mount 的方式挂载到所有 lxc host 上,然后所有 docker 容器的 config 都写到这个目录里。 另有一个数据分区,在 caja 和 arr 都需要,/disk/media ,我也是 bind mount 挂载到两个 lxc 。

    - 所有的 docker-compose 文件,都在一台 vm 的同一个叫做 compose 的目录里管理,比如 caja 的在 compose/caja/docker-compose.yml ,切换子目录的时候,用 direnv 切换 DOCKER_CONTEXT 环境变量。这里当然需要先配置了 docker context 管理这些 lxc docker host 。

    我用法只用到 docker-compose ,完全不需要 swarm 或者 k3s 。也不需要 ansible ,docker host 只需要大体配好一台,pve 里做成 template ,以后就是 clone 的事情了。vlan 感觉也是加了没必要的复杂度。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5824 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:58 · PVG 10:58 · LAX 19:58 · JFK 22:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.