docker - 如何有效地为 2 个远程节点使用 Kubernetes
问题描述
我想把我所有的操作都转移到 K8S 上这么久了,但我仍然犹豫不决。这个问题可能很广泛,但请耐心等待。让我先描述一下现有的系统。
我托管了很多不同的网站(>30)。其中很多是为了我自己的实验,但有些是针对实际客户的。我在纽约有 1 台虚拟机(我正在使用 DigitalOcean),带有多个 Docker 容器,经常使用docker-compose
. 每个站点有 1 个容器。请求首先进入front
运行 HAProxy 的容器。这会剥离 SSL,然后将请求转发到 2 个proxy
运行 Nginx 的容器。然后这 2 个容器将请求转发给所有其他容器以提供服务。我所有的证书都来自 LetsEncrypt,并且必须每 3 个月更新一次。为此,我停止front
,运行certbot --apache
,使其绑定到端口 80。它获取证书,然后我停止 apache,然后重新创建front
容器。
我这样做有几个原因:
- 我经常更改站点配置,以及它们是如何连接在一起的。所以
front
预计将永远运行,除非我获得证书,并且proxy
预计会发生很大变化。我更改proxy
图像,然后停止并重新创建第一个容器,然后停止并重新创建第二个容器,这样就不会有停机时间了。 - 当有多个节点时,我真的不知道如何获得证书。事实上,我在整个证书方面完全是个菜鸟,而且
LetsEncrypt
几乎是我所知道的唯一方法。 - 我想直接编辑远程服务器上的文件。我直接编辑生产代码的做法很糟糕,主要是因为我对设置开发、登台和生产环境感到不耐烦。这需要太多时间,而且收益感觉很小。对于客户来说,他们通常是小型企业,员工人数少于 10 人,并且他们经常希望对网站进行一些美学上的改变。我可以与他们进行视频通话,他们确切地告诉我他们想要什么,我将其编码,它会立即上传到服务器,他们会立即看到变化。然后他们可以批评设计,我们可以来回迭代。如果我要设置不同的环境,他们无法立即看到它,并且必须有提交到 git、部署到暂存、然后是生产的漫长过程。这需要很长时间,我不会
我意识到我的系统没有得到很好的维护。图像没有得到安全更新,我不知道它们是否仍在运行,除非我手动检查它们,这很乏味,所以我根本不做。此外,我有亚洲背景,这意味着我有来自美国和亚洲的客户,这几乎是彼此相距最远的地方,这大大增加了延迟。这意味着亚洲的客户必须等待大约 1-2 秒才能真正加载页面,这是永恒的。过去一周我也搬到了亚洲,所以现在通过 ssh 访问纽约服务器的速度非常慢,而且我的工作效率直线下降。所以现在可能是改造一切并永远迁移到 K8S 的最佳时机。但是,在规划过程中存在重大问题,目前,K8S 似乎缺少很多对我来说只是破坏交易的东西。所以请批评我的计划,并根据你认为合适的方式改进它们。
我现在打算做的是:将有 2 台服务器,1 台在纽约,1 台在新加坡。这 2 个服务器将有 2 个不同的 IP 地址。这 2 个将运行 K8S Pod。最好,它们应该具有完全相同的配置、网站容器、数据库容器等。然后对于每个网站 DNS 记录,我将修改 A 和 AAAA 记录,以便它们包含 2 个服务器的 2 个 IP 地址。
我的问题是:
- 如果用户在中国,DNS 是否总是路由到新加坡,如果用户在英国,DNS 是否总是路由到纽约?
- 如何实际获得 2 个节点的证书?我的理解是,certbot在颁发证书的时候,是把域名和节点ip地址关联起来的。这意味着 2 个节点不能拥有相同域名的相同证书。这个对吗?如果您可以获得 2 个节点的证书,那么该怎么做呢?
- 如何在服务器之间保持文件同步?假设我在新加坡服务器中编辑文件树,我希望几秒钟后在纽约也修改该文件。对于数据库,我可以在新加坡或纽约有一个主数据库,然后在两个位置都有从数据库,当主数据库更新时,从数据库可以作为每个服务器的低延迟数据库。
- 如何实际将请求从服务器路由到内部的容器。我最初计划使用 NodePort,将请求定向到 Pod,
front
然后可以将请求分发到其他 Pod,但是当 NodePort 无法连接到低于 30000 的端口时,我很伤心。我知道的唯一其他选择是拥有将流量定向到 2 台服务器的外部负载平衡服务。但这要花 15 美元/站点/月,而且因为我有超过 30 个站点,这样做会让我破产。我也可以总共拥有 4 台服务器,其中 2 台用于 K8S 集群,2 台用作将转发到 NodePort 的负载均衡器。这个计划会奏效吗?证书的自动更新甚至在这里如何工作?
请注意,我的问题可能是错误的问题(例如,我不应该使用 A 和 AAAA 记录来引导流量),并且有完全不同的方法可以做到这一点,所以请随时提出正确的问题.
解决方案
阅读您的问题以写下全部内容,但其中一半是无用的。
你的问题的答案:
我们可以在 DNS 中添加相同或多个条目吗?example.com 与 A 记录可能多次?
您可能需要设置具有区域入口支持的区域 K8s 集群。您可以将certmanager与letencrypt一起使用,它将在 LB 级别管理您的证书并在前面终止它。
如果您希望使用两个虚拟机,请在两者前面放置一个 LB 并在那里设置 SSL。
如果您使用带有无状态 POD 的 K8s,则不能选择在容器内编辑直接文件。更好地管理内部的 Github 更新,并将容器同时部署到两个集群上,这样您就可以设置 CI/CD。在使用主从概念的数据库服务器设置的情况下,您是正确的,您可以使用只读副本。
要将流量从服务器路由到 K8s 的内部应用程序,您可以使用内部 LB 或公开服务
node ports
(高于 30000,但在 SVC 中更改目标端口),如果您想使用目标端口在特定端口上重定向请求,则路由该端口。
仍然,我没有得到“我也可以总共有 4 台服务器,2 台用于 K8S 集群,2 台用作将转发到 NodePort 的负载均衡器。这个计划是否可行?证书的自动更新甚至在这里如何工作? " 哪台服务器在前面,哪台在后端。
推荐阅读
- database - 有没有办法在 Airflow 日志中从 Oracle 读取 DBMS_Output?
- python - 循环执行后列表不重置
- bitbucket - Bitbucket Scriptrunner 脚本 Post 挂钩不会在拉取请求合并时触发
- c# - 如何访问 WPF 项目中的本地文件夹以加载和存储文件?
- php - in_array() 可以与二维数组的所有二级数组的第一个值进行比较吗?
- android - 如何制作这个底部导航栏?
- javascript - 打字稿:如何扩展现有的模块定义?
- git - 尝试从 Github 导入到 Bitbucket 并收到“选择一个有效的选择。source-git 不是可用的选择之一。”
- python - Python 与 Cython 循环
- c# - 如何比较本地和云文件 Azure