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

2022-08-14 10:19:40 +08:00
 sidkang

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

具体配置可以参考之前的帖子,大概的配置是 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 方式安装的应用可以无痛使用。但是不太清楚这两种方式是否有较大的弊端?

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

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

- 我的 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 感觉也是加了没必要的复杂度。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX