OpenResty Edge 通过把上游直接绑定到 K8s 服务,即可用作 Kubernetes 的 ingress controller。Edge 的 Admin 服务器监听 Kubernetes API 服务器,随 Pod 上线或下线自动同步上游服务器列表——无需手工改动,也无需网关重载、重启或二进制升级。Edge 网关服务器可以运行在 Kubernetes 集群内部或外部。下面完整演示如何管理运行在 Kubernetes 容器内部的后端应用程序的流量。

OpenResty Edge 作为 Kubernetes ingress controller,将流量路由到 K8s 集群内的 Pod

在本教程中,我们将在一个 Edge 应用中创建一个 Kubernetes 上游。Edge 网关服务器可以运行在 Kubernetes 集群内部,也可以在其外部运行。Edge 的 Admin 服务器会通过其 API 服务器持续监控 Kubernetes 集群。而且会响应 Kubernetes 节点(或容器)的在线和离线事件,自动更新上游服务器列表。

OpenResty Edge Admin 监听 Kubernetes API 服务器,随 Pod 上线下线自动更新上游服务器列表

如何创建及使用 Kubernetes 上游

让我们进入 OpenResty Edge 的 Admin Web 控制台。这就是我们控制台的样本部署。每个用户都有自己的本地部署。

OpenResty Edge Admin Web 控制台的样本部署

首先,我们需要在一个专门的网关分区中设置一个可以连接到 Kubernetes 服务的网关服务器。

可连接到 Kubernetes 服务的专用网关分区中的网关服务器

跳转到网关分区页面。

跳转到 OpenResty Edge 的网关分区页面

我们已经创建了一个网关分区,名为 kubernetes-test-partition。

OpenResty Edge 中的 kubernetes-test-partition 网关分区

分区内包含一个名为 kubernetes-test-cluster 的网关集群。

分区内的 kubernetes-test-cluster 网关集群

我们需要一个单独的网关分区,因为不是所有的网关服务器都能连接到我们的 Kubernetes 服务。

跳转到 kubernetes-test-cluster 集群。

打开 OpenResty Edge 中的 kubernetes-test-cluster 网关集群

在这个网关集群中已经定义了一个网关服务器。我们需要确保这个网关服务器可以连接到我们的 Kubernetes 集群。

集群中可连接到 Kubernetes 集群的 Edge 网关服务器

创建 Kubernetes 集群

我们在 Edge 应用中创建新的 Kubernetes 上游之前,需要先在全局范围内注册 Kubernetes 集群。

跳转到 Kubernetes 页面。

跳转到 OpenResty Edge Admin 的 Kubernetes 页面

点击这个按钮来添加一个新的 Kubernetes 集群。

在 OpenResty Edge 中添加新 Kubernetes 集群的按钮

为了接收新通知,OpenResty Edge Admin 需要建立与 Kubernetes 的 HTTPS API 服务器的连接。

输入 Kubernetes API 服务器的主机名或 IP 地址。

输入 Kubernetes API 服务器的主机名或 IP 地址

然后输入端口号。

输入 Kubernetes API 服务器的端口号

接下来输入 kubernetes 集群的名称。

输入 Kubernetes 集群的名称

停用 SSL 证书验证。这是因为我们的 Kubernetes API 服务器的证书是自签的。

为自签证书的 Kubernetes API 服务器停用 SSL 证书验证

我们还需要一个 token 来访问 Kubernetes API 服务器,这个 token 要有足够的权限。

用于访问 Kubernetes API 服务器的 token 字段

点击 “How to generate this token” 这个链接可以打开一个弹窗。

打开 OpenResty Edge 中的 “How to generate this token” 帮助链接

这里说明了如何从你自己的 Kubernetes 部署中生成一个 token。 现在让我来演示一下这个过程。

关闭这个弹窗。

关闭 OpenResty Edge 中的 token 帮助弹窗

我们需要准备一个名为 token.yml 的配置文件。下面是这个文件的一个样本。可以用它来创建一个具有读取权限的账户,以访问

创建具有读取权限的 Kubernetes 服务账户的 token.yml 样本

命名空间、

token.yml 授予对 Kubernetes 命名空间的读取权限

服务、

token.yml 授予对 Kubernetes 服务的读取权限

端点,以及

token.yml 授予对 Kubernetes 端点的读取权限

Pods 对象。

token.yml 授予对 Kubernetes Pods 对象的读取权限

使用以下命令创建账户。

kubectl apply -f /root/token.yml

使用 kubectl apply -f token.yml 创建 Kubernetes 服务账户

最后,我们使用下面的命令来获取账户的 token。

获取 Kubernetes 服务账户 token 的命令

“token:” 后面的文字就是我们需要的 token。

“token:” 标签后显示的 Kubernetes 服务账户 token

现在我们有了一个访问 Kubernetes API 服务器的 token。

将我们刚刚创建的 API token 粘贴到这里。

将 Kubernetes API token 粘贴到 OpenResty Edge

单击 “创建” 按钮。

点击创建,在 OpenResty Edge 中注册 Kubernetes 集群

创建 Kubernetes 上游

到这一步我们已经在全局范围内注册了 Kubernetes 集群。现在是时候在 Edge 应用程序中创建一个上游来利用这个集群了。

Kubernetes 集群已在 OpenResty Edge 中全局注册

跳转到应用程序列表页。

打开 Edge 应用程序列表页

我们已经准备了一个名为 www.kubernetes-edge-test.com 的 Edge 应用程序。

www.kubernetes-edge-test.com 这个 Edge 应用程序

这个应用程序被映射到我们之前展示的网关分区。

Edge 应用程序映射到 Kubernetes 网关分区

进入这个应用。

进入 OpenResty Edge 中的 Edge 应用程序

进入 “Upstreams” 页面。

打开 Edge 应用中的 Upstreams 页面

点击新建 Kubernetes 上游。

在 OpenResty Edge 中点击新建 Kubernetes 上游

输入 Kubernetes 上游的名称 “my kubernetes backend”。

将 Kubernetes 上游命名为 “my kubernetes backend”

选择一个 Kubernetes 集群作为目标。

选择一个 Kubernetes 集群作为上游目标

选择我们刚刚创建的那个 Kubernetes 集群。

选择本教程开头创建的 Kubernetes 集群

选择目标 Kubernetes 的命名空间。

为上游选择目标 Kubernetes 命名空间

选择名为 “default” 的命名空间。视你的环境而定,也可能是其他命名空间。

选择 “default” Kubernetes 命名空间

从列表中选择一个 Kubernetes 服务。

从列表中选择一个 Kubernetes 服务

选择 “test-hello” 服务。

选择 “test-hello” Kubernetes 服务

以及服务的端口。

选择 Kubernetes 服务端口

在我们这个例子中是 80 端口。

为 Kubernetes 服务选择 80 端口

保存新的上游。

在 OpenResty Edge 中保存新的 Kubernetes 上游

现在我们成功创建了一个新的 Kubernetes 上游。

新的 Kubernetes 上游已在 OpenResty Edge 中成功创建

上游服务器地址显示在这里。

Kubernetes 上游服务器地址自动填充

它们是从 Kubernetes 集群自动同步的 Kubernetes 节点或容器。

从 Kubernetes 集群自动同步的上游服务器

创建页面规则使用 Kubernetes 上游

就像普通的上游一样,我们仍然需要创建一个新的页面规则来使用这个新的 Kubernetes 上游。

跳转到页面规则页面。

打开 Edge 应用中的页面规则页面

点击这个 “新建规则” 按钮。

在 OpenResty Edge 中点击 “新建规则” 按钮

启用 Proxy 这个动作。

在页面规则中启用 Proxy 动作

点击这个 “代理到上游” 下拉列表。

打开 “代理到上游” 下拉列表

选择我们刚刚创建的 Kubernetes 上游 “my kubernetes backend”。

在页面规则中选择 “my kubernetes backend” Kubernetes 上游

保存这个页面规则。

保存代理到 Kubernetes 上游的页面规则

像往常一样,需要发布一个新的版本来推送我们刚才的改动。

为 Edge 应用程序发布新的配置版本

点击这个按钮。

在 OpenResty Edge 中确认配置发布

发布!

发布新的 OpenResty Edge 配置版本

同步完成。

OpenResty Edge 配置已完全同步

现在,新的页面规则已经被推送到所有的网关集群和服务器。

OpenResty Edge 将新页面规则推送到每个网关集群和服务器,第 1 帧

OpenResty Edge 在各网关服务器间同步配置,第 2 帧

OpenResty Edge 配置已完全同步到所有网关服务器,第 3 帧

这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。

配置变更同步到所有 OpenResty Edge 网关服务器,无需任何重载或重启

测试:扩容 Pod 观察上游自动更新

接下来,我们会在相应分区中找到 Edge 网关服务器来做实际的测试。

跳转到网关集群页面。

打开 OpenResty Edge 中的网关集群页面

找到相应的网关服务器。

找到用于测试的正确 Edge 网关服务器

请记住它的公共 IP 地址是以 .196 结尾的。

公共 IP 地址以 .196 结尾的 Edge 网关服务器

复制这个 IP 地址,以便我们可以在命令行上使用它。

在终端上,尝试通过这个网关服务器访问 Kubernetes 服务。

在终端上准备通过 Edge 网关服务器访问 Kubernetes 服务

注意,我们使用的是刚才复制的网关服务器的 IP 地址。

在 curl 命令中使用复制的 Edge 网关服务器 IP 地址

运行这个命令。

通过 OpenResty Edge 对 Kubernetes 服务运行 curl 命令

可以看到对这个服务的访问是成功的。在本教程余下的部分里,我们将修改 Kubernetes 服务的配置。

通过 OpenResty Edge 成功获得 Kubernetes 服务的响应

我们将在不停机的情况下动态把 Kubernetes 节点的数量增加到 3 个。

kubectl scale --replicas=3 deployment test-hello

使用 kubectl 将 test-hello 部署扩容到 3 个副本

扩展成功完成。

test-hello 部署成功扩容到 3 个副本

让我们检查一下新的节点。

kubectl get pods -o wide

使用 kubectl get pods -o wide 查看新的 Pod

现在确实有 3 个 Kubernetes 节点。

扩容后现在运行着 3 个 Kubernetes 节点

Edge Admin 会自动更新 Kubernetes 上游反映这个变化。

回到我们的 Edge 应用程序页面来检查一下。

返回 OpenResty Edge 应用程序页面查看上游

扩容 Kubernetes Pod 后的 OpenResty Edge 应用程序页面

返回到上游页面。

返回 OpenResty Edge 的上游页面

刷新 Upstreams 页面更新数据。

刷新上游页面以避免数据陈旧

耶! Kubernetes 上游确实有 3 台服务器了!

自动更新后 Kubernetes 上游现在显示 3 台服务器

同样地,如果 Kubernetes 节点较少,Edge Admin 也会自动更新上游。这就是我今天要讲的内容。

Kubernetes 节点变化时 Edge Admin 自动更新上游

想了解 OpenResty Edge 如何管理完整的 Kubernetes 网关节点生命周期(涵盖弹性伸缩事件与多集群统一管控),可参阅 OpenResty Edge × Kubernetes:构建企业级云原生网关的最后一公里

常见问题

OpenResty Edge 可以用作 Kubernetes 的 ingress controller 吗?

可以。OpenResty Edge 可作为 Kubernetes 集群的 ingress controller,管理运行在 Kubernetes 容器内部的后端应用程序的流量。你先在 Edge Admin 中注册 Kubernetes 集群,创建一个绑定到 K8s 服务的 Kubernetes 上游,再用页面规则代理到它即可。Edge 网关服务器可以运行在 Kubernetes 集群内部或外部。

Pod 扩缩容时 OpenResty Edge 如何更新上游?

Edge 的 Admin 服务器通过 Kubernetes API 服务器持续监控集群,随 Kubernetes 节点(或容器)上线、下线自动更新上游服务器列表。在本教程中,把 test-hello 部署扩容到 3 个副本后,Kubernetes 上游自动显示为 3 台服务器,全程无需手工改动。

更新 Kubernetes 上游需要重载或重启 OpenResty Edge 吗?

不需要。OpenResty Edge 的配置变更和上游更新都不需要服务器重载、重启或二进制升级。变更会被推送到所有网关集群和服务器并实时同步,因此在高并发、高负载场景下依然高效、可扩展。

OpenResty Edge 网关可以运行在 Kubernetes 集群外部吗?

可以。Edge 网关服务器既可以运行在 Kubernetes 集群内部,也可以在外部。唯一要求是所在专用网关分区中的网关服务器能连接到你的 Kubernetes 服务,而 Edge Admin 负责连接 Kubernetes 的 HTTPS API 服务器来跟踪 Pod 事件。

关于 OpenResty Edge

OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!