Originally, the Resource limit per Namespace and Namespace quota per Zone requirements have been implemented as Kyverno policies on each zone. With this approach, overriding the default resource quotas must be done on individual namespaces (or on zones for the namespace count quota). This approach doesn’t scale, and doesn’t easily allow configuring different default quotas for different organizations or billing entities.
As APPUiO Cloud has grown, and we now allow users to sign up autonomously (self signup), we want to configure lower default quotas and additional policies (for example network policies) for organizations of billing entities which haven’t been validated yet.
We’ve decided to call a set of quotas and policies a usage profile.
We’re implementing usage policies in the APPUiO Control API, so that non-technical users who have administrative privileges can easily update the usage profile for a billing entity or an organization in the APPUiO Portal.
Usage profiles are defined as a new custom resource in the APPUiO Control API.
UsageProfile reference documentation for details on the structure of the custom resource.
Default usage profile for a billing entity
We want to allow operators of APPUiO Cloud to set a default usage profile for a whole billing entity.
To enable this, we introduce a new field
spec.usageProfileRef on the billing entity which indicates the default usage profile for organizations associated with this billing entity.
The APPUiO Control API sets field
status.usageProfileRef of all organizations to field
spec.usageProfileRef of the billing entity referenced in
Customize usage profile for an organization
The organization virtual resource has a new optional field
spec.usageProfileRef which contains the name (
metadata.name) of a
If this field is present, it overrides the default usage profile that would be assigned to the organization based on its billing entity.
If present, the value of this field is validated by the APPUiO Control API.
The APPUiO Control API rejects updates of an organization virtual resource, if the
spec.usageProfileRef field is modified and the principal doesn’t have access to the usage profile referenced in the updated organization resource.
The APPUiO Control API ensures that
status.usageProfileRef is updated to the new billing entity’s default usage profile when an organization’s
spec.billingEntityRef is updated, if the organization doesn’t have
Applying usage profiles on zones
To apply usage profiles to organization namespaces on each zone, we extend the APPUiO Cloud agent.
The agent identifies the organization’s usage profile by looking at field
status.usageProfileRef in the APPUiO Control API
Organization object for the organization.
We reimplement the existing Kyverno policies which manages the resource quotas in organization namespaces and restrict the number of namespaces per zone in the agent.
The resource quota policy is changed to apply the quotas and policies defined in the
UsageProfile referenced by the
Organization by default, instead of the default quotas stored on the zone.
Per-namespace quota overrides are still possible through namespace annotations.
Additionally, the agent reject new namespaces if the namespace’s organization has reached its namespace count limit on the zone.
The agent reads the organization’s namespace count limit from the organization’s usage profile.
To determine the usage profile for each organization, the agent connects to the APPUiO Control API to read
The agent watches these resource for changes to ensure changes are reflected on the zones.
Additionally, the agent reconciles all Kubernetes resources which are created to apply a usage profile. This ensures that users can’t modify the quotas and policies defined through the usage profile.