跳转至

Ingress 使用范围(Scope)

IngressClass Scope 用于指定 Ingress 实例的使用范围为集群级、命名空间级和工作空间级。

平台级负载均衡

  • 同一个集群中,共享同一个 Ingress 实例,可设置平台级 Ingress 实例

租户级负载均衡

租户级负载均衡分为 命名空间 Ingress 实例工作空间 Ingress 实例

  • 单一命名空间独享一个 Ingress 实例实现负载隔离,可设置命名空间级 Ingress 实例
  • 工作空间独享一个 Ingress 实例实现负载隔离,可设置工作空间 Ingress 实例,工作空间中对应当前集群下的命名空间,其中 Pod 都可以接收到由该负载均衡分发的请求。

如果在同一个集群内,同一命名空间内有不同应用需要使用不同 Ingress 实例的需求,请参考 IngressClass

平台级 Ingress 实例

创建 Ingress 实例时,如果启用 Ingress Scope,创建后的 IngressClass 资源在以下两种情况下, Ingress 实例的使用范围都为平台级

  1. 仅设置了 parameters 但是未设置 .spec.parameters.scope
  2. 设置了 .spec.parameters.scopecluster
#示例
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-1
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Cluster # 指定 Ingress 实例范围为 Cluster
    apiGroup: k8s.example.net
    kind: ClusterIngressParameter #指定 Ingress 实例 Kind 为 ClusterIngressParameter
    name: external-config-1

命名空间级 Ingress 实例

当创建 Ingress 实例时,如果启用 Ingress Scope,IngressClass 设置了 .spec.parameters,并且设置 .spec.parameters.scopeNamespace,那么 Ingress 实例的 Ingress Class 指向为命名空间级,需要指定待使用的命名空间。

命名空间级的 Ingress 实例,相当于管理员将 Ingress 的使用权限下发给到某个命名空间,可以实现资源隔离,如设置了命名空间级实例,创建路由时,可在 租户级负载均衡中选择并使用。

#示例
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Namespace # 指定 Ingress 实例范围为 Namespace
    apiGroup: k8s.example.com
    kind: IngressParameter # 指定 Ingress 实例 Kind 为 IngressParameter
    namespace: default # 指定待使用的 Namespace
    name: external-config

工作空间 Ingress 实例

当创建 Ingress 实例时,如果启用 Ingress Scope,IngressClass 设置了 .spec.parameters,并且设置 .spec.parameters.scopenamespaceSelector,并输入的 Label 为 workspace.ghippo.io/id='12345'(其中 12345 为指定的工作空间 workspace01 ID),那么 Ingress 实例的 Ingress Class 指向为工作空间,适用范围为workspace01中所有在当前集群的命名空间。

租户级的 Ingress 实例,相当于管理员将 Ingress 的使用权限下发给到某个工作空间,从而实现租户资源隔离。

#示例
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Namespace # 指定 Ingress 实例范围为 Namespace
    apiGroup: k8s.example.com
    kind: IngressParameter # 指定 Ingress 实例 Kind 为 IngressParameter
    namespaceSelector: workspace.ghippo.io/id = 12345 # 指定待使用的工作空间 ID
    name: external-config

如何部署平台/工作空间级/命名空间级 Ingress 实例?

可以通过指定 --watch-namespace 的方式,不同的实例 watch 不同的命名空间。 若ingress-nginx 实例通过 Helm 安装,需通过指定 controller.scope.enabled=true--set controller.scope.namespace=$NAMESPACE 开启并设置平台/工作空间级/命名空间级 Ingress。

  1. 平台级 Ingress 实例:创建 Ingress 实例时, scope 关闭,则创建的 Ingress 实例为 平台级
  2. 命名空间 Ingress 实例:创建 Ingresss 实例时,scope 开启,并在 namespace中指定对应的命名空间,则创建的 Ingress 为 命名空间级。 如下示例,创建的 Ingress-nginx 为 Default 独享:

    scope01

    对应的 value.yaml 中的配置信息:

    scope02

  3. 工作空间 Ingress 实例:部署 Ingress-Ngnix 时 ,scope设置为 disabled 并指定在 Namespace Selector 中输入 workspace.ghippo.io/id=12345,创建后的 Ingress 实例为 ID12345 的 工作空间独享。 工作空间Ingress对应的 value.yaml 中的配置信息:workspaceingress02

Ingress 实例部署后,可在对应的命名空间中创建 Ingress 规则,并选择对应实例的 Ingress Class 进行使用。

更多信息可以参考 scope

评论