点赞
评论
收藏
分享
举报
使用 NGINX 在 Kubernetes 中实现多租户和命名空间隔离
发表于2022-11-02 12:04

浏览 952

原文作者: Amir Rawdat of F5原文链接: 使用 NGINX 在 Kubernetes 中实现多租户和命名空间隔离转载来源:NGINX 官方网站

随着企业规模的不断扩大,Kubernetes 中的开发和运营工作流程也变得愈加复杂。与每个团队都拥有自己的集群相比,各个团队之间共享 Kubernetes 集群和集群中资源的做法通常更经济高效、更安全。但是,如果团队无法以安全可靠的方式共享资源或者配置遭黑客利用,则可能会对部署的应用系统造成严重损害。

网络和资源级别的多租户实践和命名空间隔离有助于团队安全地共享 Kubernetes 资源。您还可以按照单租户独占的方式隔离应用,从而显著缩小攻击的影响范围。这种方法有助于提高弹性,因为只有特定团队拥有的部分应用可能会受到损害,而提供其他功能的系统则完好无损。

NGINX Ingress Controller 支持多种多租户模式,但最常见的主要是下列的两种模式:

  • 基础架构服务提供商模式通常指使用隔离的 NGINX Ingress Controller,通过物理基础架构隔离来实现多租户;
  • 企业模式指使用共享的 NGINX Ingress Controller 部署,通过命名空间隔离来实现多租户。

我们将在本节深入探讨企业模式;有关运行多个 NGINX Ingress Controllers 的更多信息,请参阅我们的文档

使用 NGINX Ingress Controller 进行委派

NGINX Ingress Controller 既支持标准 Kubernetes Ingress 资源,也支持自定义 NGINX Ingress 资源,可提供更复杂的流量管理并配置控制任务委派给多个团队。自定义资源为VirtualServer、  VirtualServerRouteGlobalConfigurationTransportServerPolicy

借助 NGINX Ingress Controller,集群管理员可使用 VirtualServer 资源来配置 Ingress 域名(主机名)规则,将外部流量路由到后端应用,也可使用 VirtualServerRoute 资源将特定 URL 的管理委派给应用所有者和 DevOps 团队。

在 Kubernetes 集群中实现多租户时,有两种模型可供您选择完全自助服务受限自助服务

实施完全自助服务

在完全自助服务模型中,管理员不参与 NGINX Ingress Controller 所监控的 Ingress 资源的日常更改。他们只负责部署 NGINX Ingress Controller 及如何将部署的 KubernetesService暴露给外部。之后,开发人员在指定的命名空间内部署应用,而无需管理员参与。开发人员负责管理 TLS 密钥,定义域名的负载均衡配置,并通过创建 VirtualServer 或标准的Ingress资源暴露其应用。

为了阐释这个模型,我们使用了bookinfo示例应用(最初由 Istio 创建)和两个子域名a.bookinfo.comb.bookinfo.com,如下图所示。管理员在nginx-ingress命名空间(绿色)中安装和部署 NGINX Ingress Controller 之后,DevA(粉色)和 DevB(紫色)团队就会创建自己的 VirtualServer 资源,并将应用隔离在他们的命名空间(分别为AB)中。

DevA 和 DevB 团队为他们的域设置了 Ingress 规则,以便将外部连接路由到他们的应用。

DevA 团队应用以下 VirtualServer 资源对象,以a.bookinfo.com域名将A命名空间中的应用暴露出去。

 1 apiVersion: k8s.nginx.org/v1
 2 kind: VirtualServer
 3 metadata:
 4   name: bookinfo
 5   namespace: A
 6 spec:
 7   host: a.bookinfo.com
 8   upstreams:
 9   - name: productpageA
10     service: productpageA
11     port: 9080
12   routes:
13   - path: /
14     action:
15       pass: productpageA

同样,DevB 团队应用以下 VirtualServer 资源,以b.bookinfo.com域名将 B 命名空间中的应用暴露出去。

1 apiVersion: k8s.nginx.org/v1
2 kind: VirtualServer
3 metadata:
4   name: bookinfo
5   namespace: B
6 spec:
7   host: b.bookinfo.com
8   upstreams:
9   - name: productpageB
10     service: productpageB
11     port: 9080
12   routes:
13   - path: /
14     action:
15       pass: productpageB

实施受限自助服务

在受限自助服务模型中,管理员配置 VirtualServer 资源,将进入集群的流量路由到适当的命名空间,但将命名空间中的应用配置任务委派给负责任的开发团队。每个团队只负责其在 VirtualServer 资源中实例化的应用子路由,使用 VirtualServerRoute 资源来定义流量规则并将应用子路由暴露在其命名空间中。

如图所示,集群管理员在nginx-ingress命名空间(绿色突出显示)中安装和部署了 NGINX Ingress Controller,并将一项 VirtualServer 资源定义为根据 VirtualServerRoute 资源定义设置基于路径的规则。

该 VirtualServer 资源定义设置了两条基于路径的规则,这些规则关联了需要通过 VirtualServerRoute 资源定义的两条子路由/productpage-A/productpage-B

 1 apiVersion: k8s.nginx.org/v1
 2 kind: VirtualServer
 3 metadata:
 4   name: example
 5 spec:
 6   host: bookinfo.example.com
 7   routes:
 8   - path: /productpage-A
 9     route: A/ingress 
10   - path: /productpage-B
11     route: B/ingress

然后,负责命名空间AB中应用的开发人员团队定义 VirtualServerRoute 资源,将其命名空间中的应用通过子路由暴露出去。这些团队通过命名空间隔离,并且只能部署由管理员提供的 VirtualServer 资源设置的应用子路由:

  • DevA 团队(图中粉色部分)应用下面的 VirtualServerRoute 资源,暴露管理员设置的应用子路由规则路径/productpage-A
 1 apiVersion: k8s.nginx.org/v1
 2 kind: VirtualServerRoute
 3 metadata:
 4   name: ingress 
 5   namespace: A
 6 spec:
 7   host: bookinfo.example.com
 8   upstreams:
 9   - name: productpageA
10     service: productpageA-svc
11     port: 9080
12   subroutes:
13   - path: /productpage-A 
14     action:
15       pass: productpageA
  • DevB 团队(图中紫色部分) 应用下面的 Virtual ServerRoute 资源,暴露管理员设置的应用子路由规则路径/productpage-B
 1 apiVersion: k8s.nginx.org/v1
 2 kind: VirtualServerRoute
 3 metadata:
 4   name: ingress 
 5   namespace: B
 6 spec:
 7   host: bookinfo.example.com
 8   upstreams:
 9   - name: productpageB
10     service: productpageB-svc
11     port: 9080
12   subroutes:
13   - path: /productpage-B 
14     action:
15       pass: productpageB

如欲详细了解您可以在 VirtualServer 和 VirtualServerRoute 资源中配置的特性,请参阅NGINX Ingress Controller 文档

注:您可以使用可合并的 Ingress 类型来配置跨命名空间的路由,但在受限自助服务委派模型中,这种方法与 VirtualServer 和 VirtualServerRoute 资源相比有三个缺点:

  1. 不太安全。
  2. 由于可合并的 Ingress 类型不会阻止开发人员在其命名空间内为主机名设置 Ingress 规则,随着 Kubernetes 部署规模和复杂度的日益增加,它将越来越容易遭到篡改。
  3. 与 VirtualServer 和 VirtualServerRoute 资源不同,可合并的 Ingress 类型不允许主 (“master”) Ingress 资源控制 “minion” Ingress 资源的路径。

在受限自助服务模型中利用 Kubernetes RBAC

您可以使用 Kubernetes 的基于角色的访问控制 (RBAC) 功能,根据分配给用户的角色来管理用户对命名空间和 NGINX Ingress 资源的访问。

举例来说,在受限自助服务模型中,只有具有特殊权限的管理员才能安全地访问 VirtualServer 资源——因为这些资源定义了 Kubernetes 集群的入口点,如果遭到滥用,可能会导致系统中断。

开发人员使用 VirtualServerRoute 资源为他们拥有的应用路由配置 Ingress 规则,因此管理员将 RBAC 策略设置为开发人员只能创建这些资源。如果需要进一步规范开发人员的访问权限,他们甚至可以将该访问权限限制到特定的命名空间。

在完全自助服务模型中,开发人员可以安全地访问 VirtualServer 资源,但管理员也可能会将该访问权限限制到特定的命名空间。

如欲了解 RBAC 授权的更多信息,请参阅Kubernetes 文档

添加策略

NGINX Policy 资源也支持分布式团队在多租户部署中配置 Kubernetes。Policy 资源支持OAuthOpenID Connect(OIDC) 身份验证、速率限制和 Web 应用防火墙 (WAF) 等功能。Policy 资源在 VirtualServer 和 VirtualServerRoute 资源中被引用,在 Ingress 配置中生效。

举例来说,负责集群中身份管理的团队可以定义JSON Web Token(JWT) 或 OIDC 策略,如下所示,使用 Okta 作为 OIDC 身份认证提供商 (IdP) 的策略。

text
apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: okta-oidc-policy
  spec:
   oidc:
    clientID: client_id
    clientSecret: okta-oidc-secret
    authEndpoint: https://your_okta_domain/oauth2/v1/authorize
    tokenEndpoint: https://your_okta_domain/oauth2/v1/token
    jwksURI: https://your_okta_domain/oauth2/v1/keys

NetOps 和 DevOps 团队可以使用 VirtualServer 或 VirtualServerRoute 资源来引用这些策略,如本示例所示。

NGINX Policy、VirtualServer 和 VirtualServerRoute 资源可进一步完善分布式配置架构,管理员可轻松地将配置委派给其他团队。团队可以跨命名空间组装模块,并以安全、可扩展和可管理的方式为 NGINX Ingress Controller 配置复杂的用例。

有关 Policy 资源的更多信息,请参阅NGINX Ingress Controller 文档


更多资源

想要更及时全面地获取 NGINX 相关的技术干货、互动问答、系列课程、活动资源?

请前往 NGINX 开源社区:

已修改于2023-03-27 18:45
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
233
文章
21
问答
198
粉丝
相关文章
介绍nginx网页配置工具QQ技术交流群1:1106758598QQ技术交流群2:560797506邮箱: cym1102@qq.com官网地址: http://www.nginxwebui.cn码云: https://gitee.com/cym1102/nginxWebUIgithub: https://github.com/cym1102/nginxWebUI功能特点nginxWebUI也可管理多个nginx服务器集群,随时一键切换到对应服务器上进行nginx配置,也可以一键将某台服务器配置同步到其他服务器,方便集群管理.部署此项目后,配置nginx再也不用上网各种搜索配置代码,再也不用手动申请和配置ssl证书,只需要在本项目中进行增删改查就可方便的配置和启动nginx。技术说明本项目是基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库项目启动时会释放一个.sqlite.db到系统用户文件夹中,注意进行备份本系统通过Let'sencrypt申请证书,使用acme.sh脚本
点赞 6
浏览 6.3k
  前三周学习了陶辉老师的“NGINX基础培训系列课程”,感觉受益良多,在这里想把一些知识点记录一下,和大家分享一下知识点,也方便日后的随手查看,温故知新。  首先,我们了解到了Nginx的版本,Nginx发布版本分为主线版本和稳定版本,区分两个版本也非常简单,主线版本版本号为单数,比如1.19,稳定版本为双数,比如1.18,今天我要说的是稳定版本,这个版本会尽量少的减少Nginx的bug问题,适用于生产环境,这里我不建议使用Nginx和其他软件一样在生产环境中落后一个或多个大版本使用,之前生产环境做过漏扫,发现我们编译自带的Nginx版本为:nginx/1.13.3(查询命令为nginx-V),结果出现了多个漏洞,四个高危和一个中危漏洞:        通过升级Nginx到稳定版最新版本后修复!  其次,是Nginx发行版本的选择,目前比较流行的有:nginx、nginxplus、Tengine、openresty、ope
点赞 1
浏览 3.4k
感谢您参加“NGINX从入门到精通进阶系列培训”!以下为培训的问答、课件和录像,希望您能通过此培训学有所得,祝学习进步!>问与答:- 基础篇+高级篇 - 应用篇+实战篇(New)>课件(PPT):基础篇:-NGINX概要、安装、配置:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-Setup.pdf-NGINX日志、运维:https://interact.f5.com/rs/653-SMC-783/images/cnfeb22-nginxcorecourse-maintenance.pdf高级篇:-NGINX变量、API:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-API.pdf-NGINXSSL、NJS:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-SSL.pdf
点赞 10
浏览 4.9k