使用 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 可以使用 虚拟服务器
或者 入口
通过自动化与 头盔文件 .
安全
本文将通过使用演示最佳实践 最小特权原则 用于限制对云资源的必要访问 工作负载标识 .当创建此类解决方案需要对云资源进行特权访问时,这是推荐的最佳实践。
工作负载标识 设置分为两个阶段:
成分
本文将介绍以下组件:
-
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 配置访问、设置项目和配置资源。
- 基本的 外壳脚本 知识,包括设置等 环境变量 . Python **** 有助于理解
加载数据.py
脚本,但不是必需的。 - 基本 Kubernetes 使用
kubectl
命令来部署应用程序和设置配置KUBCONFIG
环境变量。了解 Kubernetes 资源类型,例如部署
,有状态集
,副本集
,豆荚
,服务
(L4),入口
(L7) 很有用。 - TCP的基本网络知识( 第 4 层与第 7 层 ),有关知识 HTTP/2 与 HTTP/1.1 协议和暴露于 TLS 与 SSL 证书。
- 对此事的认知 负载均衡器 和 反向代理 ,以及基于端口的路由, 虚拟主机 , 网址路径 .
- 对谷歌的理解 主要标识符 和 Kubernetes RBAC 和 Kubernetes 服务帐号 有用,但不是必需的。
工具(必需)
- 谷歌云 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 入口控制器 文件着陆区
- 带注释的高级配置 :部署 NGINX 入口控制器时可以启用的功能。
- VirtualServer 和 VirtualServerRoute 资源 :用于 NGINX 的 CRD,用于配置标准中不可用的功能
入口
资源。 - 配置示例 : 用于配置 gRPC、external-dns、cert-manager 的有用示例
入口
或者虚拟服务器
.
结论
本文的主要内容是如何部署 NGINX 入口控制器 证书管理器 和 外部 DNS .这段旅程的一部分公开了使用 Helmfile 有条件地使用任一标准自动设置所有这些 入口
或者 虚拟服务器
资源。
NGINX 自定义资源 虚拟服务器
和 虚拟服务器路由
提供了一些超越原版的功能 入口
,例如流量拆分。当与 NGINX 加 ,您可以使用其他功能,例如 WAF , 智威汤逊 , 和 OpenID 单点登录 .你可以得到一个 审判 如果你有 NGINX Plus 商务电子邮件 ,所以例如 gmail 或 yahoo 将无法正常工作。
在不久的将来,我想覆盖 东西向交通 使用服务网格,例如 NSM ( NGINX 服务网格 )。
最后一点,源代码在 Kubernetes入口 有一些很好的例子帮助我在这个解决方案和文章中取得成功。对于为此所做的所有工作,我无法表达足够的感激之情。
感谢您的关注。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通