如何有效地将 Kubernetes 用于 2 个远程节点

如何解决如何有效地将 Kubernetes 用于 2 个远程节点

我想将我所有的操作转移到 K8S 这么长时间,但我仍然对此犹豫不决。这个问题可能很广泛,但请耐心等待。让我先描述一下现有的系统。

我托管了许多不同的网站(>30 个)。其中很多是为了我自己的实验,但有些是针对实际客户的。我在纽约有 1 个虚拟机(我使用的是 DigitalOcean),有多个 Docker 容器,经常使用 docker-compose 进行管理。每个站点有 1 个容器。请求首先进入运行 HAProxy 的 front 容器。这会剥离 SSL,然后将请求转发到运行 Nginx 的 2 proxy 容器。然后这两个容器将请求转发给所有其他容器以提供服务。我所有的证书都来自 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 地址。这两个将运行 K8S Pod。最好,它们应该具有完全相同的配置,网站容器,数据库容器等。然后对于每个网站DNS记录,我将修改A和AAAA记录,使其包含2个服务器的2个IP地址。

我的问题是:

  1. 如果用户在中国,DNS 是否总是路由到新加坡,如果用户在英国,是否总是路由到纽约?
  2. 如何实际获得 2 个节点的证书?我的理解是certbot在颁发证书的时候,会把域名和节点ip地址关联起来。这意味着 2 个节点不能具有相同域名的相同证书。这样对吗?如果您可以获得 2 个节点的证书,那么该怎么做?
  3. 如何在服务器之间保持文件同步?假设我在新加坡服务器中编辑文件树,我希望该文件也能在几秒钟后在纽约修改。对于数据库,我可以在新加坡或纽约拥有一个主数据库,然后在两个位置都有一个从数据库,在主更新时更新,从数据库可以作为每个服务器的低延迟数据库。
  4. 如何将请求从服务器实际路由到内部容器。我最初计划使用 NodePort,将请求定向到 front Pod,然后可以将请求分发到其他 Pod,但是当 NodePort 无法连接到 30000 以下的端口时,我很伤心。我唯一的其他选择意识到是有一个外部负载平衡服务,将流量定向到 2 个服务器。但这要花费 15 美元/站点/月,而且因为我有超过 30 个站点,这样做会使我破产。我也可以总共有 4 台服务器,2 台用于 K8S 集群,2 台用作将转发到 NodePort 的负载均衡器。这个计划会奏效吗?在这里,证书的自动续订将如何工作?

请注意,我的问题可能是错误的问题(例如,我可能不应该使用 A 和 AAAA 记录来引导流量),并且有一种完全不同的方法可以做到这一点,所以请随时提问正确的问题。

解决方法

阅读您的问题以写下全部内容,但有一半内容没有用。

您的问题的答案:

  1. 我们可以在 DNS 中添加相同或多个条目吗? example.com 可以多次使用 A 记录?

  2. 您可能需要设置具有区域入口支持的区域 K8s 集群。您可以将 certmanagerletsencrypt 结合使用,后者将在 LB 级别管理您的证书并在前端终止它。

    如果您希望使用两个虚拟机,请将一个 LB 放在两个虚拟机的前面并在那里设置 SSL。

  3. 如果您将 K8s 与无状态 POD 结合使用,则无法在容器内编辑直接文件。您最好在内部管理 Github 更新,并将容器同时部署到两个集群,以便您可以设置 CI/CD。在使用主从概念设置数据库服务器的情况下,您是对的,您可以使用只读副本。

  4. 要将流量从服务器路由到 K8s 的内部应用程序,您可以使用内部 LB 或使用 node ports高于 30000 但更改 SVC 中的目标端口)和路由如果您想使用目标端口重定向特定端口上的请求,请使用该端口。

仍然,我没有得到“我也可以总共有 4 台服务器,2 台用于 K8S 集群,2 台用作将转发到 NodePort 的负载均衡器。这个计划是否有效?如何自动更新证书甚至在这里工作?”哪台服务器在前面,哪台在后端。

,

如果您的所有服务都是网站(通过 http 运行),您可以使用 k8s ingress 根据主机标头(域名)将流量路由到 Pod,并且仅使用一个 LB 和一个 IP 地址。最受欢迎的入口控制器似乎是 Nginx Ingress Controller

如果你不想使用 LB 你可以使用 hostPort 来暴露 nginx ingress 但是一旦你有一个多节点的 k8s 集群,使用 LB 因为通常不建议使用 hostPort,除非你有充分的理由这样做。

说到 DNS,您可以使用诸如 AWS route53 routing policies 之类的东西进行位置路由。您不一定需要使用 AWS。我只是想告诉你这个问题有解决方案,但你喜欢什么就用什么。

对于证书,使用 cetrmanager 和 DNS-01 质询。 来自 Letencrypt 文档关于 DNS-01 挑战:

  • 即使您有多个网络服务器,它也能正常工作。

cetrmanager 还将为您处理证书更新。

关于在服务器之间保持文件同步;这取决于文件,但对于静态内容,最好使用 CDN 将内容从一个源复制到其他位置。

为了同时部署到 2 个独立的集群,您可以使用一些 CI/CD 管道,例如github actions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-