使用 NGINX IC 扩展 GKE

使用 NGINX IC 扩展 GKE

在 GKE 上使用 NGINX 入口控制器

当我刚开始在 Kubernetes ,我需要使用 反向代理 (第 7 层 负载均衡器 ),我遇到了 入口-nginx ,一个开源社区解决方案,与 OpenResty 使用的平台 高级播放 NGINX .

如果有人在过去的几十年里一直住在山洞里, NGINX 是目前这个星球上最流行的 Web 服务器,所以围绕这个解决方案构建了一个入口控制器是有道理的,但这个不是作者制作的。

那么作者们呢? NGINX ?他们没有解决办法吗?

嗯,是的,有一个围绕这个的项目叫做 NGINX 入口控制器 , 开源项目位于 Kubernetes入口 那是充满了例子和隐藏的宝石。本文将深入研究此解决方案……

概述

本文详细介绍了如何使用单个 入口控制器 .作为该过程的一部分, TLS 证书将由受信任的机构颁发 加州 .这将使用 让我们加密 通过一个流行的 Kubernetes 加载项称为 证书管理器 .

本文将使用 图形 ,一个高性能的分布式图数据库,其母语是 DQL , 的超集 GraphQL ,通过任一访问 ****HTTP/1.1 或者 gRPC 协议。

VirtualServer 和 VirtualServerRoute

NGINX 提供了标准 vanilla 入口资源的替代方案,其自定义 CRD 为 虚拟服务器 虚拟服务器路由 .这些提供了额外的功能,如流量拆分和基于内容的高级路由(参考 VirtualServer 和 VirtualServerRoute 资源 )

本文将介绍使用任一选项 入口 资源或 虚拟服务器 要配置的自定义资源 南北交通 到示例服务 图形 ,一个高性能的分布式图数据库,其母语是 DQL , 的超集 GraphQL .

配置为 证书管理器 外部 DNS 使用 Cloud SQL 可以使用 虚拟服务器 或者 入口 通过自动化与 头盔文件 .

安全

本文将通过使用演示最佳实践 最小特权原则 用于限制对云资源的必要访问 工作负载标识 .当创建此类解决方案需要对云资源进行特权访问时,这是推荐的最佳实践。

工作负载标识 设置分为两个阶段:

  1. 供应阶段以创建 总务署 并链接 GSA 到 KSA
  2. 在部署期间将注释应用于 沙特阿拉伯 并链接 KSA 到 GSA

成分

本文将介绍以下组件:

  • 谷歌云资源(配备 ): 非政府组织 **** 和 云 DNS

  • Kubernetes 附加组件(随 掌舵文件 ): 证书管理器 , 外部 DNS , 和 NGINX 入口控制器

  • 应用: 图形 **** (安装有 掌舵文件 ), 一个 pydgraph 客户端(运行使用 码头工人 )

    笔记 :这已在下面进行了测试,如果版本显着不同,则可能无法正常工作。 * Kubernetes API v1.22

    • kubectl v1.22
    • 394.0.0
    • 外部 DNS v0.12.2
    • 证书管理器 v1.9.1
    • NGINX 入口控制器 2.3.0
    • 码头工人 20.10.17
    • 图形 v21.03.2

要求

这是一篇中高级类别文章,将结合负载平衡、反向代理、配置云资源和部署的多个概念 Kubernetes **** 资源(包括 入口 有状态集 )。

账户

  • 要按照本文中的步骤进行操作,您需要注册域并将 DNS 查询转发到 云 DNS 名称服务器。
    从您的域的注册商处查阅文档。
    本教程将使用 例子.com 作为示例域。
  • 谷歌云帐户结算帐户和项目设置。 Google 提供 90 天 300 美元的免费试用(2022 年 8 月),足以满足本文的需要。看 https://cloud.google.com/free .

知识

工具(必需)

  • 谷歌云 SDK ( 命令)与谷歌云交互
  • Kubernetes 客户端 ( kubectl 命令)与 Kubernetes 交互
  • ( 命令)来安装 Kubernetes 包
  • 掌舵差异 插件以查看将要部署的内容的差异。
  • 掌舵文件 ( 掌舵文件 命令)自动安装许多 helm 图表
  • 码头引擎 ( 码头工人 命令)以在本地自动运行 pydgraph 客户端及其所有依赖项。

工具(推荐)

  • POSIX 外壳 **** ( ) 如 GNU 重击 ( 重击 ) 或者 Zsh ( zsh ):本指南中的这些脚本是在 macOS 和 Ubuntu Linux 上使用这些 shell 测试的。
  • GNU 流编辑器 ( sed ) 和 GNU grep ( grep ):使用这些工具对脚本进行了测试,macOS 或 BSD 等价物可能无法正常工作。
  • 卷曲 ( 卷曲 ):从命令行与 Web 服务器交互的工具。
  • jq ( jq ):一个 JSON 处理器工具,可以从 JSON 中转换和提取对象,并提供彩色 JSON 输出更高的可读性。
  • gprcurl **** ( gprcurl ):从命令行与 gRPC 服务交互的工具。

这些工具可以安装 家酿 在 macOS 和 巧克力味 MSYS2 在 Windows 上。

项目设置

目录结构

我们要在您的项目区域中创建此目录结构:

 ~/projects/nginx-k8s-ingress  
 dgraph  
 │ └── helmfile.yaml  
 ├── kube-addons  
 │ ├── helmfile.yaml  
 │ └── issuers.yaml  
 └── 拨浪鼓  
 └── helmfile.yaml

GNU 重击 ,您可以像这样创建上述结构:

**mkdir** -p ~/projects/nginx-k8s-ingress/{dgraph,ratel,kube-addons}  
 **光盘** ~/projects/nginx-k8s-ingress **触碰** {dgraph,kube-addons,ratel}/helmfile.yaml \  
 kube-addons/issuers.yaml

环境变量

这些环境变量将在本项目中使用。创建一个名为 环境文件 使用以下内容,根据需要更改值,然后运行 源环境.sh .

您可以运行此脚本来验证环境变量和命令是否可用:

**用户** ="darkn3rd"  
 **ID** ="7af3da347073b0ddf20fd7fa0c4e69c7"  
 **向** ="a3ac0c761e49c2ca8cd88f2e0d75d04dd3f4ed1c"  
 **文件** ="验证.sh"  
 **网址** =https://gist.githubusercontent.com/ **$USER** / **$ID** /生的/ **$TO** / **$文件** **卷曲 -s $URL** | **重击 -s --**

谷歌项目设置

会有两个谷歌云 项目 创建用于配置云资源。一 项目 将拥有 云 DNS 区域和其他 项目 **** 将拥有 非政府组织 簇。您可以在 Web 控制台中进行设置,或者键入以下命令:

条款

这部分将设置云资源和第一部分 工作负载标识 .

云 DNS

使用谷歌云 SDK 命令,您可以设置 云 DNS **** 区内 GNU 重击 使用以下命令:

您应该获得一个名称服务器列表,这些名称服务器对您的注册商进行配置很有用。名称服务器将非常;这是一个示例输出:

 ns-cloud-d1.googledomains.com。  
 ns-cloud-d2.googledomains.com。  
 ns-cloud-d3.googledomains.com。  
 ns-cloud-d4.googledomains.com。

谷歌 Kubernetes 引擎

创建时的默认设置 非政府组织 cluster 是为了让所有节点都可以访问升级权限。这是不可取的。这个过程将创建一个 非政府组织 具有最低权限的集群并拥有 工作负载标识 启用。

执行以下步骤 GNU 重击

授予对 Cloud DNS 的访问权限

两个都 证书管理器 外部DNS 需要读写 DNS 记录的能力。此步骤将开始在 沙特阿拉伯 ( Kubernetes 服务帐号 ) 和 总务署 ( 谷歌服务帐号 ) 使用 国际数据中心 ( OpenID 连接 ) 提供者。

执行此处的步骤以设置访问权限:

部署 Kubernetes 插件

创建下面的文件为 在插件/helmfile.yaml 中:

这个 helmfile.yaml 将会安装 NGINX 入口控制器 , 外部 DNS , 和 证书管理器 掌舵图。添加了支持的其他必要配置 工作负载标识 用于访问 云 DNS 区。

准备就绪后,您可以使用以下命令进行部署:

**资源** 环境文件 **  
helmfile -- 文件** 到插件/helmfile.yaml

证书管理器 已安装,它将安装一些客户 CRD 安装证书所需的。我们需要添加一些集群范围的颁发者,这将允许我们在部署时颁发证书 入口 对象。

复制以下内容并另存为 kube-addons/issuers.yaml

准备就绪后,可以通过以下方式部署它们:

**资源** 环境文件 **  
helmfile -- 文件** kube-addons/issuers.yaml

您可以使用以下方法验证结果:

**kubectl** 得到所有,证书颁发者 **--命名空间** kube 插件

示例应用:Dgraph

Dgraph 是一个高性能的分布式图数据库,可以很容易地部署在 Kubernetes 上。

虽然 Dgraph 的界面是通过 Web 界面使用 GraphQL 或称为超集 DQL ,它仍然是一个数据库,因此应该受到保护。

运行以下命令来创建一个 **DG_ALLOW_LIST** 分配的私有 IP 地址 非政府组织 集群,以及用于访问 Internet 的 IP 地址。

在下面创建以下文件 dgraph/helmfile.yaml

这将有两个不同的配置嵌入到这个 helmfile.yaml 中。你可以使用默认的 入口 ,或者,使用 虚拟服务 自定义资源。启用此 CRD 集 **NGINX_CRD** =真 在部署之前。

准备就绪后,可以通过键入以下命令进行部署:

**资源** 环境文件  
 **导出 NGINX_CRD** =假 **** # 设置为 'true' 以使用 VirtualService **helmfile -- 文件** dgraph/helmfile.yaml

这将部署 3 个 Dgraph Alpha 节点和 3 个 Dgraph 零节点和一个 入口 对象来访问 Dgraph Alpha 节点。

将流量路由到服务时,每个虚拟主机仅支持一个协议,因此两个 入口 (或两个 虚拟服务器 ) 需要创建资源,一个用于 HTTP 流量,一个用于 gRPC 流量。

通过运行以下命令验证入口是否已创建:

 如果 [[ ” **$NGINX_CRD** " == "真" ]]; 然后  
  **kubectl** 获取虚拟服务 **--命名空间** dgraph  
 别的  
  **kubectl** 得到 **--命名空间** dgraph  

您可以使用以下方式查询端点:

**资源** 环境文件  
 **HTTP_ADDR** =[ dgraph。 **${DNS_DOMAIN}**](https://dgraph.%24%7BDNS_DOMAIN%7D/health) **  
GRPC_ADDR=** grpc。 **$DNS_DOMAIN** _# 使用 HTTP/1.1 进行测试_ **  
卷曲** **$HTTP_ADDR**[ /健康](https://dgraph.%24%7BDNS_DOMAIN%7D/health) | **jq**  
 **卷曲** [**$**](https://dgraph.%24%7BDNS_DOMAIN%7D/health) **HTTP_ADDR**[ /](https://dgraph.%24%7BDNS_DOMAIN%7D/health) 状态 | **jq** _# 获取 api.proto 文件  
_ **GIT_ADDR=** raw.githubusercontent.com  
 **GIT_PATH** =dgraph-io/pydgraph/master/pydgraph/proto/api.proto  
 **卷曲-溶胶** [ https://$](https://raw.githubusercontent.com/dgraph-io/pydgraph/master/pydgraph/proto/api.proto) **GIT_ADDR** / **$路径** _# 使用 gRPC 进行测试  
_ **grpcurl** **-原型** api.proto \  
  **$GRPC_ADDR** :443 \  
 api.Dgraph/CheckVersion

示例应用:Ratel

拨浪鼓 是一个在浏览器中运行的小型应用程序,可以从浏览器访问 Draph 集群到服务器。有一个小型 Web 服务器托管需要首先部署的前端代码。

拨浪鼓 永远不应部署在与 图形 ,因为如果应用程序遭到入侵,恶意行为者可以直接读取私有图形数据库。通过拥有单独的命名空间, 图形 **** 可以使用进一步保护 网络策略 喜欢 印花布 或者 睫毛 ,并且还有一个 服务网格 支持严格模式。

在下面创建一个文件 棘轮/helmfile.yaml

准备好后,可以通过以下方式部署:

**资源** 环境文件  
 **导出 NGINX_CRD** =假 **** # 设置为 'true' 以使用 VirtualService **helmfile -- 文件** 棘轮/helmfile.yaml

您可以根据您的域访问它,但类似 https://ratel.example.com (将 example.com 替换为您正在使用的域):

将 Dgraph 服务器 URL 配置为用于 Dgraph Alpha 节点的域名,例如 https://dgraph.example.com (将 example.com 替换为您正在使用的域)。

Dgraph 的乐趣

来自 拨浪鼓 应用程序,我们可以添加一些数据、添加模式并运行查询。

笔记 : 这些都是改编自 入门 教程并使用我为调用的早期博客编写的片段 AWS 上的 Dgraph:设置水平可扩展的图形数据库 .

通过 gRPC 的数据集和模式

对于数据集和模式,我们可以使用 gRPC 代替 curl 或 拨浪鼓 .对于这一部分,我创建了一组脚本,可以构建一个 码头工人 具有所需依赖项和数据的图像。

将创建以下结构和文件:

 ~/projects/nginx-k8s-ingress  
 └── 例子  
 pydgraph  
 ├── Dockerfile  
 ├── 生成文件  
 ├── helmfile.yaml  
 ├── load_data.py  
 ├── requirements.txt  
 ├── sw.nquads.rdf  
 └── sw.schema

您可以下载、设置文件结构、构建 码头工人 **** 图像,并使用以下命令使用数据集和模式运行它:

这将使用 grpc FQDN,例如 grpc.example.com ,使用 gRPC 与 Dgraph Alpha 服务器交互。

客户端(Python 脚本 加载数据.py ) 将使用加密流量 ( h2 ),到 Dgraph Alpha 服务器。 ingress-nginx 控制器将实际终止,然后将其发送到未加密的 Dgraph Alpha pod 之一( h2c )。

ingress-nginx 控制器可以执行此操作,因为从 ACME CA 服务器颁发的证书使用来自 证书管理器 .为了实现这一切,DNS 地址记录在 云 DNS 通过 外部DNS .

使用 Ratel 查询

使用执行查询 拨浪鼓 更刺激,因为您可以获得 JSON 和视觉反馈。

拨浪鼓 ,它应该在 https://ratel.example.com (代替 例子.com 对于您正在使用的域),选择 安慰 , 询问 ,然后复制并粘贴以下内容:

这应该看起来像这样:

故障排除

证书

跑步时 卷曲 针对 HTTP 端点,您可以运行:

**资源** 环境文件  
 **卷曲-svvI** [ https://dgraph。 **$DNS_DOMAIN** /健康](https://dgraph.%24DNS_DOMAIN/health)

我遇到的一个问题是早些时候 macOS 卡塔利娜 (MacOS X 版本 10.15.2 ) 从 2019 年左右开始,Let's Encrypt 根证书已过期。我能说的唯一解决方法是升级 macOS 或购买新电脑。我没有同样的问题 流行!_OS 或者 Ubuntu .

如果您需要检查证书本身,可以运行以下命令:

清理

其他 Kubernetes 资源是可选的,因为它们将随着集群的销毁而被删除。

Kubernetes 资源

你可以清理 Kubernetes **** 使用以下命令获取资源:

⚠️ 重要的 : 删除 PVC 以便在删除 Kubernetes 集群时没有剩余存储空间。在实践中,Google Cloud 会清理挥之不去的资源,但其他云提供商并非如此。删除与云资源直接关联的 Kubernetes 资源始终是一种很好的做法。

您可以使用以下命令清理 Google 云资源。

附录:使用注册域的替代方法

选择 注册域并将域解析转发到 云 DNS ,您可以执行以下操作来使用不受信任的证书并模拟域解析:

  • **ACME_ISSUER_NAME** =letsencrypt-staging 在部署任何入口之前。
  • 编辑编辑 /etc/hosts (或等效)匹配 DNS 记录、本地 DNS 缓存或配置 DNS 客户端以指向 云 DNS 对于该域的搜索域。
  • 通过网络访问服务时,例如 拨浪鼓 ,当提示您输入不受信任的网站时,您将需要单击添加例外。
  • 使用时 卷曲 命令,你将不得不使用 -k 选项,例如 curl -k .
  • 使用时 加载数据.py 脚本,您将需要从 Kubernetes 密钥中复制私有证书,并使用 kubectl cp 命令,然后将其复制到正在运行的 Docker 容器中 码头工人cp 命令。然后在运行的时候 load_pata.py 脚本,使用适当的命令行选项指向私有证书的路径。跑 load_data.py --帮助 有关命令行选项的更多信息。

资源

NGINX 文档

结论

本文的主要内容是如何部署 NGINX 入口控制器 证书管理器 外部 DNS .这段旅程的一部分公开了使用 Helmfile 有条件地使用任一标准自动设置所有这些 入口 或者 虚拟服务器 资源。

NGINX 自定义资源 虚拟服务器 虚拟服务器路由 提供了一些超越原版的功能 入口 ,例如流量拆分。当与 NGINX 加 ,您可以使用其他功能,例如 WAF , 智威汤逊 , 和 OpenID 单点登录 .你可以得到一个 审判 如果你有 NGINX Plus 商务电子邮件 ,所以例如 gmail 或 yahoo 将无法正常工作。

在不久的将来,我想覆盖 东西向交通 使用服务网格,例如 NSM ( NGINX 服务网格 )。

最后一点,源代码在 Kubernetes入口 有一些很好的例子帮助我在这个解决方案和文章中取得成功。对于为此所做的所有工作,我无法表达足够的感激之情。

感谢您的关注。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/18426/21030608

posted @   哈哈哈来了啊啊啊  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示