Kubernetes 入口:如何限制虚拟主机名以包含用户自己的命名空间?

问题描述

背景

我们有一台带有一个外部 IP、microk8s 和 k8s 入口 (Nginx) 的服务器,配置用于基于名称的虚拟主机。该机器旨在作为多个开发人员测试容器技术的游乐场。路由名称冲突的问题很快就出现了,两个用户试图设置相同的路由(如 test 或 dev)。一种解决方案是在主机名中包含命名空间,但用户仍然必须合作(而不是使用其他人的命名空间)。

问题

如何限制用户生成的主机名(使用 Ingress 配置文件设置)在基于名称的虚拟主机中仅包含用户自己的命名空间(最好使用 Nginx Ingress)?这似乎是可能的,因为这就是我们公司 Openshift 路由(包含命名空间的自动生成的主机名)的工作方式:如果没有访问权限(由 RBAC 控制),就无法在命名空间中创建路由。

解决方法

openshift 3.x docs中提到:

如果主机名未作为路由定义的一部分提供,则 OpenShift Container Platform 会自动为您生成一个。这 生成的主机名格式为:

<route-name>[-<namespace>].<suffix>

所以我猜你想要做的也是一样;未提供时生成主机名。

很遗憾,据我所知,k8s 和 k8s nginx ingress 不支持此功能。

您可能想要做的是在应用到 k8s 时创建一个 mutating webhook 来改变飞行中的对象(例如,如果没有提供,它可以生成一个主机字段),或者使用 validating webhook验证对象是否满足要求。

以下是您可能想要查看的教程:kube-mutating-webhook-tutorial

您也可以尝试找到支持您想要的功能的其他入口控制器。

另一种解决方案是取消开发人员创建入口对象的权限,并只挑选一个人负责创建和验证入口对象(可能是个坏主意,但这是一个解决方案)。