Kubernetes 最佳实践。 外部服务映射

Kubernetes 最佳实践。 创建小容器
Kubernetes 最佳实践。 具有命名空间的 Kubernetes 组织
Kubernetes 最佳实践。 通过就绪性和活性测试进行 Kubernetes 健康检查
Kubernetes 最佳实践。 设置资源请求和限制
Kubernetes 最佳实践。 正确关机 终止

如果您像大多数人一样,您可能正在使用在集群外部运行的资源。 也许您使用 Taleo API 发送短信,或使用 Google Cloud Vision API 分析图像。

如果您在所有环境中使用相同的服务器端请求端点,并且不打算将服务器迁移到 Kubernetes,那么在代码中拥有一个服务端点是完全可以的。 然而,事件的发展还有很多其他的场景。 在这个 Kubernetes 最佳实践系列中,您将学习如何使用 Kubernetes 的内置机制来发现集群内部和外部的服务。

常见外部服务的一个示例是在 Kubernetes 集群外部运行的数据库。 与 Google Cloud Data Store 或 Google Cloud Spanner 等使用单个端点进行所有访问的云数据库不同,大多数数据库针对不同情况都有单独的端点。
使用 MySQL 和 MongoDB 等传统数据库的最佳实践通常意味着您针对不同的环境连接到不同的组件。 您可以使用一台大型计算机用于生产数据,使用一台较小的计算机用于测试环境。 它们每个都有自己的 IP 地址或域名,但您可能不想在从一种环境迁移到另一种环境时更改代码。 因此,您可以像原生 Kubernetes 服务一样使用 Kubernetes 内置的基于 DNS 的外部服务发现,而不是对这些地址进行硬编码。

Kubernetes 最佳实践。 外部服务映射

假设您正在 Google Compute Engine 上运行 MongoDB 数据库。 您将陷入这个混合世界,直到您设法将其转移到集群。

幸运的是,您可以使用静态 Kubernetes 服务让您的生活变得更轻松。 在此示例中,我使用 Google Cloud Launcher 创建了一个 MongoDB 服务器。 由于它是在同一网络(或 Kubernetes 集群 VPC)上创建的,因此使用高性能内部 IP 地址进行访问。

Kubernetes 最佳实践。 外部服务映射

这是 Google Cloud 上的默认设置,因此您无需配置任何内容。 现在您已经有了 IP 地址,第一步就是创建服务。 您可能会注意到此服务没有 pod 选择器。 也就是说,我们创建了一个不知道将流量发送到哪里的服务。 这将允许您手动创建将从该服务接收流量的端点对象。

Kubernetes 最佳实践。 外部服务映射

以下代码示例显示端点使用与服务相同的 mongo 名称来确定数据库的 IP 地址。

Kubernetes 最佳实践。 外部服务映射

Kubernetes 将使用所有 IP 地址来查找端点,就像它们是常规 Kubernetes Pod 一样,因此现在您可以使用上述名称 mongodb://mongo 的简单连接字符串来访问数据库。 根本不需要在代码中使用 IP 地址。

如果将来 IP 地址发生变化,您只需使用新的 IP 地址更新端点即可,而无需以任何其他方式修改您的应用程序。

如果您使用的是第三方主机上托管的数据库,则该主机的所有者可能已为您提供了要连接的统一资源标识符 URI。 因此,如果您已获得 IP 地址,则可以简单地使用前面的方法。 此示例显示我在 mLab 主机上托管了两个 MongoDB 数据库。

Kubernetes 最佳实践。 外部服务映射

一个是开发者数据库,另一个是生产数据库。 这些数据库的连接字符串如下所示 - mLab 为您提供动态 URI 和动态端口。 正如您所看到的,它们是不同的。

Kubernetes 最佳实践。 外部服务映射

为了抽象化这一点,让我们使用 Kubernetes 并连接到开发人员数据库。 您可以创建一个外部 Kubernetes 服务名称,这将为您提供一个静态服务,将流量转发到外部服务。

Kubernetes 最佳实践。 外部服务映射

该服务将在内核级别执行简单的 CNAME 转发,对性能的影响最小。 因此,您可以使用更简单的连接字符串。

Kubernetes 最佳实践。 外部服务映射

但由于外部名称使用了CNAME转发,因此无法进行端口转发。 因此,该方案仅适用于静态端口,不能用于动态端口。 但 mLab 免费套餐默认为用户提供动态端口号,并且您无法更改它。 这意味着您需要为 dev 和 prod 使用不同的连接命令行。 不好的是,这需要您对端口号进行硬编码。 那么如何让端口转发发挥作用呢?

第一步是从 URI 获取 IP 地址。 如果运行 nslookup、主机名或 ping URI,则可以获得数据库的 IP 地址。 如果服务返回多个 IP 地址给您,则所有这些地址都可以在对象的端点处使用。

Kubernetes 最佳实践。 外部服务映射

需要记住的一件事是,IP URI 可能会在没有通知的情况下发生更改,这使得它们在产品中使用的风险很大。 使用此 IP 地址,您可以连接到远程数据库,而无需指定端口。 因此,Kubernetes 服务非常透明地执行端口转发。

Kubernetes 最佳实践。 外部服务映射

通过映射或将外部资源映射到内部资源,您可以灵活地在将来在集群内使用这些服务,同时最大限度地减少重构工作。 它还可以更轻松地管理并深入了解公司使用的外部服务。

很快就会继续...

一些广告🙂

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的内容? 通过下订单或推荐给朋友来支持我们, 面向开发人员的云 VPS,4.99 美元起, 我们为您发明的入门级服务器的独特模拟: VPS (KVM) E5-2697 v3(6 核)10​​4GB DDR480 1GB SSD 19Gbps XNUMX 美元或如何共享服务器的全部真相? (适用于 RAID1 和 RAID10,最多 24 个内核和最多 40GB DDR4)。

Dell R730xd 在阿姆斯特丹的 Equinix Tier IV 数据中心便宜 2 倍? 只有这里 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 电视低至 199 美元 在荷兰! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 美元起! 阅读 如何建设基础设施公司同级使用价值730欧元的Dell R5xd E2650-4 v9000服务器一分钱?

来源: habr.com

添加评论