博客 | NGINX

玛拉: 现在在您附近的工作站上运行

NGINX-F5-horiz-black-type-RGB 的一部分
Jason Schmidt 缩略图
杰森·施密特
2022 年 4 月 22 日发布

当我们开始开展NGINX 现代应用参考架构(MARA) 项目时,我们选择 AWS 作为我们的 IaaS 提供商,因为我们已经熟悉该平台,并且可以使用部门预算来支付费用。 当然,并不是每个人都有相同的经验或预算,你们中的许多人要求我们提供在本地运行 MARA 的选项——在基于实验室的环境中,甚至在工作站上——使用 Kubernetes 发行版,例如K3sCanonical MicroK8sminikube

我们听到了您的声音,今天我们很高兴地宣布我们已经在 MicroK8s 上测试了 MARA,并提供了说明,以便您可以自行部署!

显示在工作站上运行的 NGINX 现代应用参考架构的拓扑图

为什么我们选择 MicroK8s 进行测试? 因为它以易于部署且内存占用低的模型提供了 MARA 所需的 DNS、存储和出口功能。 借助 MicroK8s,我们可以轻松、反复地迭代测试场景,以确定提供合理性能水平的部署的最低要求。

我们的期望是,这项工作将促进我们对其他 Kubernetes 发行版的测试;有关各种发行版的当前状态的信息,请参阅我们的GitHub repo 。 如果您有喜欢的发行版并希望将其列在列表中,我们邀请您进行分叉、测试和创建拉取请求!

处理资源限制

在本地运行 MARA 的最大限制是内存和 CPU。 在初步测试期间,我们发现内存耗尽的大部分问题都与 Elasticsearch 有关。 在内存极小(少于16 GB )的配置中,Kibana 几乎无法使用。 为了解决这个问题,我们在 MARA 配置文件中提供了设置,消除了完整 Elasticsearch 部署通常具有的冗余保护。 虽然这会增加故障模式的数量,但这是资源受限环境中必要的权衡。

CPU 的限制与我们示例Bank of Sirius应用所承受的负载量直接相关。 MARA 部署包括Locust ,用于在 Bank of Sirius 上产生负载,并通过用户控制设置用户数量和新用户的生成率。

请注意,增加 Sirius 银行的负载也会影响系统的其余部分。 如果用户数量或生成率过高,MARA 性能就会下降到组件可能崩溃或停转的程度。 导致此行为的值取决于可用的 CPU,但您可以预期部署至少具有要求中指定的容量,可以处理最多 64 个用户创建的负载以及一次 16 个用户的跨度率。

在 MicroK8s 上部署 MARA

了解了这些背景知识后,您已准备好在 MicroK8s 上启动 MARA!

要求

  • 在运行Ubuntu 20.04 (Focal)或更高版本的系统(裸机 Linux 服务器、虚拟化服务器或云)上具有root访问权限,至少具备以下条件:

    • 20 GB 磁盘
    • 16 GB 内存
    • 相当于 4 个 CPU
  • 本地系统上的 Python 3 虚拟环境,包含 MARA 所需的所有库和二进制文件。 如果尚未安装 Python 3,请运行以下命令:

    $ sudo apt 更新$ sudo apt 安装 -y python3-venv
  • MicroK8s 集成的MetalLB负载均衡器至少有一个免费的 IPv4 地址分配给 NGINX Ingress Controller 出口。 如果您通过本地主机访问 Sirius 银行应用,则任何可用的私有(符合RFC 1918标准的)地址都是可以接受的。 例如,如果您的网络是 192.168.100.0/24,则可以使用 10.10.10.10 之类的地址。

  • Pulumi 帐户和访问令牌。 如果您还没有这些,您可以在部署 MARA第 1 步中创建它们。

    请注意,虽然 Pulumi 允许您将状态文件存储在与 S3 兼容的对象存储或本地文件系统中,但 MARA 在撰写本文时不支持此功能。 此限制将在 MARA 或 Pulumi 的未来版本中消除。

安装并配置MicroK8s

  1. 安装MicroK8s:

    $ sudo snap install microk8s --classic microk8s (1.23/stable) v1.23.3 来自 Canonical✓ 已安装
  2. 设置运行microk8s命令所需的权限。 为了 <用户名>,替换您的帐户 系统权限:

    $ sudo usermod -a -G microk8s <用户名> $ sudo chown -f -R <用户名> ~/.kube $ newgrp microk8s
  3. 注销您的 root特权帐户并重新登录以使新权限生效。

  4. 启用DNS存储MetalLB的 MicroK8s 附加组件。

    在提示符下,指定形式为X . X . X . XX . X . X . Y的 IP 地址范围来表示:

    • 实际的私有 IP 地址范围(例如,192.168.100.100-192.168.100.110 (下面使用的值)
    • 单个私有 IP 地址(例如,192.168.100.100-192.168.100.100
    $ microk8s 启用 dns 存储 metallb启用 DNS 应用清单...
    重新启动 kubelet DNS 已启用 启用默认存储类...
    存储即将推出 启用 MetalLB 输入以逗号分隔的每个 IP 地址范围(例如 '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'): 192.168.100.100-192.168.100.110
    正在应用 Metallb 清单......
    MetalLB 已启用
  5. 确认 MicroK8s 正在运行:

    $ microk8s 状态microk8s 正在运行高可用性:没有数据存储主节点: 127.0.0.1:19001 数据存储备用节点:无插件:启用:dns #CoreDNS ha-cluster #在当前节点上配置高可用性 metallb #Kubernetes 集群的负载均衡器存储 #存储类;从主机目录分配存储...
  6. 将 MicroK8s 配置加载到大多数实用程序希望找到的文件中( ~/.kube/config ),并在目录和文件上设置推荐的权限:

    $ microk8s 配置 > ~/.kube/config $ sudo chmod 0644 ~/.kube/config

克隆 MARA Repo 并设置 MicroK8s 集群

  1. 克隆 MARA 存储库并初始化 Bank of Sirius 子模块:

    $ git clone https://github.com/nginxinc/kic-reference-architectures.git $ cd kic-reference-architectures/ $ git 子模块更新 --init --recursive --remote
  2. 在克隆的 MARA repo 的根目录中工作(您在上一步中更改了那里的目录),为 MicroK8s 集群设置 Python 虚拟环境:

    $ ./bin/setup_venv.sh

    此命令会生成一个较长的跟踪。 如果有错误,请查看 MARA GitHub repo 中的已知问题/注意事项部分以获取建议。

  3. 激活 Python 虚拟环境。 该命令设置您的PATH和其他环境变量以使用虚拟环境:

    $源 ./pulumi/python/venv/bin/activate
  4. 确认 MicroK8s 集群已正确配置以进行 MARA 部署:

    $ ./bin/testcap.sh该脚本将使用当前活动的 kubernetes 配置和上下文对当前 kubernetes 安装执行测试。
    应该调查任何故障,因为它们表明安装不满足运行 MARA 所需的最低功能集。... ================================================================= | 所有测试通过! 该系统满足部署 MARA 的基本要求。| =================================================================

部署 MARA

本节用于部署 MARA 的start.sh脚本包含需要额外操作才能成功部署的选项。 为了简单起见,我们这里假设一个基本部署:

  • 使用 kubeconfig 文件而不是其他受支持的部署选项之一。 有关其他选项的详细信息,请参阅我们的 GitHub 存储库中的入门指南
  • 使用我们已经测试过 MARA 的最新版本的 NGINX 开源版本(不一定是最新版本)。
  • 使用基于 NGINX 开源的 NGINX Ingress Controller。 如果您想使用基于 NGINX Plus 的 NGINX Ingress Controller,则必须使用来自 Kubernetes 集群中的 F5 Docker 注册表的基于 NGINX Plus 的映像。 请参阅下面步骤 3中的第一个“注意!”以了解更多信息。
  • 使用单个标准 Kubernetes 上下文。 请参阅步骤 3 中的第二个“注意!”

在MicroK8s集群中部署MARA:

  1. 运行start.sh脚本。

    如果您尚未将工作站配置为使用 Pulumi,您将被引导登录 Pulumi(如有必要,创建一个帐户),然后提示输入与您的 Pulumi 帐户关联的 API 令牌。

    $ ./bin/start.sh将 [/home/ubuntu/kic-reference-architectures/bin/venv/bin] 添加到 PATH 通过登录管理您的 Pulumi 堆栈。
    运行“pulumi login --help”获取其他登录选项。
    输入来自 https://app.pulumi.com/account/tokens 的访问令牌
    或按 <ENTER> 使用浏览器登录: <令牌>
    
    请阅读文档以了解更多详细信息。
  2. 选择部署类型,在提示符下输入k以使用 kubeconfig 文件构建部署。 忽略有关make和 Docker 未安装的警告 – 部署将使用来自注册表的 NGINX Ingress Controller 映像。

    键入 a 表示 AWS,键入 k 表示 kubeconfig? k调用 kubeconfig 启动脚本 make 未安装 - 如果您打算从源代码构建 NGINX Kubernetes Ingress Controller,则必须安装它。docker 未安装 - 如果您打算从源代码构建 NGINX Kubernetes Ingress Controller,则必须安装它。
  3. 在提示符下,指定要创建的 Pulumi 堆栈的名称(此处为mara )。 它在您的 Pulumi 帐户中必须是唯一的。

    输入在所有项目中使用的 Pulumi 堆栈的名称: mara找到子模块源配置所有 Pulumi 项目以使用堆栈:mara 创建堆栈“mara”通知! 目前通过 kubeconfig 进行部署仅支持从注册表中提取映像! 需要 JWT 才能访问 NGINX Plus 存储库。 这应该放在根目录下的 extras 目录中名为 jwt.token 的文件中。有关更多详细信息和示例,请参阅 https://docs.nginx.com/nginx-ingress-controller/installation/using-the-jwt-token-docker-secret/ 。
    
    未找到 JWT;正在写入占位符清单通知! 使用 kubeconfig 文件时,您需要确保您的环境已配置为正确连接到 Kubernetes。 如果您有多个 kubernetes 上下文(或自定义上下文),您可能需要删除它们并用简单的 ~/.kube/config 文件替换它们。 我们将在未来版本中解决这个问题。
  4. 在提示符下,指定 kubeconfig 文件的完整路径和集群的名称。 它们在这里 /家/<用户名>/.kube/配置microk8s-集群

    提供您的 kubeconfig 文件值的绝对路径: /家/<用户名>/.kube/配置
    提供您的集群名称
    值: microk8s-集群
    尝试连接到 kubernetes 集群
  5. 在下一个提示符下指定集群的完全限定域名 (FQDN)。 该脚本使用 FQDN 有两个目的:配置 NGINX Ingress Controller 和创建自签名证书(第二种用途意味着该值不能是 IP 地址)。 如果您用不同的 FQDN 替换mara.example.com ,请记住在以下步骤中也使用它。

  6. 为您的部署创建一个 fqdn 值: mara.example.com
  7. 指定 Grafana 管理员密码:

    为 grafana 管理员用户创建一个密码;此密码将用于访问 Grafana 仪表板。该密码应该是一个不带任何 shell 特殊字符的字母数字字符串;由于 Pulumi 机密的当前限制,它以纯文本形式呈现。 您将需要此密码才能访问 Grafana 仪表板。值: <密码>
  8. 出现安装过程的跟踪信息,显示每个步骤的以下信息:

    • 描述步骤中执行的关键操作的横幅(例如, Logstore表示 Elasticsearch 部署的开始)
    • Pulumi 将要执行的任务列表
    • 每个 Pulumi 任务的实时状态指示器
    • Pulumi 和 MARA 生成的诊断信息,例如定义的主机名和 IP 地址
    • 受影响的资源数量
    • 已过时间

    当最后一步(针对 Bank of Sirius)完成时,跟踪会报告 MetalLB 分配给 NGINX Ingress Controller 的 IP 地址(此处192.168.100.100) 和您为部署选择的 FQDN(此处为mara.example.com )以及有关部署的其他信息。

    启动过程已成功完成
    后续步骤:
    1. 将 Ingress 控制器的 IP 地址 (192.168.100.100) 映射到您的 FQDN (mara.example.com)。
    2. 使用 ./bin/test-forward.sh 程序建立可用于连接管理工具的隧道。
    3. 使用 kubectl、k9s 或 Kubernetes 仪表板探索您的部署。
    
    要查看您的配置选项(包括定义的密码),您可以通过以下命令访问 pulumi 机密:
    
    主要配置:pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/config
    
    天狼星银行(示例应用)配置:pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/kubernetes/应用 /sirius
    
    K8 负载均衡器 IP:kubectl get services --namespace nginx-ingress
    
    请参阅 github 存储库中的文档以获取更多信息
  9. 在用于解析 FQDN 的工具(例如本地/etc/hosts文件或 DNS 服务器)中创建上一步报告的 FQDN 和 IP 地址之间的映射。

  10. 验证对 MARA 部署的请求是否成功。 包含-k选项,以便curl接受自签名证书。 要显示有关证书的更多信息,请添加-v选项。

    $ curl -k -I https://mara.example.com HTTP/1.1 200 OK 服务器:nginx/1.21.5 日期: , DD 星期一 YYYY hh:mm:ss TZ内容类型: text/html; charset=utf-8 内容长度: 7016 连接:保持活动
  11. 在浏览器中导航到https://mara.example.com以显示 Sirius 银行网站。 在撰写本文时,使用许多浏览器(包括 Firefox 和 Safari),您可以安全地点击有关使用自签名证书的站点的警告。 我们建议您不要使用 Chrome——由于最近的安全变化,它可能会禁止您访问该网站。

  12. 运行test-forward.sh脚本来设置 Kubernetes 端口转发,以便您可以访问 MARA 管理套件中的工具 – ElasticsearchGrafanaKibanaLocustPrometheus 。 该脚本确定适当的服务名称并运行kubectl命令将其转发到本地端口。

    笔记: 为了使端口转发正常工作,您的浏览器必须与运行此命令的命令 shell 在同一系统上运行。 如果没有(例如,因为您正在使用虚拟化环境),命令似乎成功了,但端口转发实际上不起作用。 有关更多信息,请参阅我们的 GitHub 存储库中的访问 MARA 中的管理工具

    $ ./bin/test-forward.sh连接详细信息 ===================================== Kibana:http://localhost:5601 Grafana:http://localhost:3000 Locust:http://localhost:8089 Prometheus:http://localhost:9090 Elasticsearch:http://localhost:9200 ====================================== 发出 Ctrl-C 退出

概括

就是这样! 按照这些说明,大约 20 分钟内,您的环境中即可启动并运行有效的 MARA 部署。 此时,您可以像任何其他 Kubernetes应用一样与 Bank of Sirius应用进行交互。 一个好的起点是使用内置的可观察性工具来测试当您使用 Locust 生成不同数量的负载时环境的行为。

我们的目标是让尽可能多的 Kubernetes 用户能够使用 MARA。 不喜欢我们对某些组件做出的选择? 如果您想分享,我们鼓励您替换您的组件并打开拉取请求。 此外,请在我们的仓库的“问题讨论”页面上分享想法并提出问题 - 包括我们所做的任何有疑问的假设。

相关文章

这篇文章是系列文章的一部分。 随着我们不断增加 MARA 的功能,我们会在博客上发布详细信息:


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”