Custom Entities
Custom Entities in KubeOps represent Custom Resource Definitions (CRDs) in Kubernetes. They allow you to extend the Kubernetes API with your own resource types.
Creating a Custom Entity
To create a custom entity, create a class that inherits from one of the base entity classes and decorate it with the [KubernetesEntity]
attribute:
[KubernetesEntity(Group = "demo.kubeops.dev", ApiVersion = "v1", Kind = "DemoEntity")]
public class V1DemoEntity : CustomKubernetesEntity<V1DemoEntity.V1DemoEntitySpec, V1DemoEntity.V1DemoEntityStatus>
{
public class V1DemoEntitySpec
{
public string Username { get; set; } = string.Empty;
}
public class V1DemoEntityStatus
{
public string DemoStatus { get; set; } = string.Empty;
}
}
Entity Types
KubeOps provides three base classes for creating custom entities:
CustomKubernetesEntity
: Base class with only metadataCustomKubernetesEntity<TSpec>
: Entity with specificationCustomKubernetesEntity<TSpec, TStatus>
: Entity with specification and status
Entity Scope
Entities can be either namespaced or cluster-wide. Use the [EntityScope]
attribute to specify the scope:
[KubernetesEntity(Group = "demo.kubeops.dev", ApiVersion = "v1", Kind = "DemoEntity")]
[EntityScope(EntityScope.Namespaced)] // or EntityScope.Cluster
public class V1DemoEntity : CustomKubernetesEntity<V1DemoEntity.V1DemoEntitySpec>
{
public class V1DemoEntitySpec
{
public string Username { get; set; } = string.Empty;
}
}
Spec and Status
Spec
The Spec
property contains the desired state of your resource. It's defined as a nested class within your entity:
public class V1DemoEntitySpec
{
[Required]
public string Username { get; set; } = string.Empty;
[Description("The number of replicas to run")]
public int Replicas { get; set; } = 1;
}
Status
The Status
property (optional) contains the current state of your resource:
public class V1DemoEntityStatus
{
public string CurrentState { get; set; } = string.Empty;
public DateTime LastUpdated { get; set; }
}
Entity Attributes
KubeOps provides various attributes to customize and validate your entities:
Entity Definition Attributes
[KubernetesEntity]
: Defines the basic entity information (Group, Version, Kind)[EntityScope]
: Specifies if the entity is namespaced or cluster-wide[StorageVersion]
: Marks an entity as the storage version for version conversion[KubernetesEntityShortNames]
: Defines short names for the CRD (e.g., "deploy" for "deployment")
Validation Attributes
[Required]
: Marks a property as required[Pattern]
: Defines a regex pattern for string validation[Length]
: Specifies minimum and maximum length for strings or arrays[RangeMinimum]
and[RangeMaximum]
: Defines numeric value ranges[MultipleOf]
: Specifies that a number must be a multiple of a given value[Items]
: Defines minimum and maximum items for arrays[ValidationRule]
: Defines custom validation rules using CEL expressions
Documentation Attributes
[Description]
: Adds a description to a property or entity[ExternalDocs]
: Links to external documentation
Display Attributes
[AdditionalPrinterColumn]
: Adds a column tokubectl get
output[GenericAdditionalPrinterColumn]
: Adds a custom column tokubectl get
output
Special Attributes
[Ignore]
: Excludes a property or entity from CRD generation[PreserveUnknownFields]
: Preserves unknown fields in the Kubernetes object[EmbeddedResource]
: Marks a property as an embedded Kubernetes resource
Example with Multiple Attributes
[KubernetesEntity(Group = "demo.kubeops.dev", ApiVersion = "v1", Kind = "DemoEntity")]
[EntityScope(EntityScope.Namespaced)]
[KubernetesEntityShortNames("demo")]
[Description("A demo entity for testing purposes")]
public class V1DemoEntity : CustomKubernetesEntity<V1DemoEntity.V1DemoEntitySpec, V1DemoEntity.V1DemoEntityStatus>
{
public class V1DemoEntitySpec
{
[Required]
[Description("The username for the demo entity")]
[Length(3, 50)]
public string Username { get; set; } = string.Empty;
[Description("Number of replicas to run")]
[RangeMinimum(1)]
[RangeMaximum(10)]
public int Replicas { get; set; } = 1;
[Pattern(@"^[a-z0-9-]+$")]
[Description("The namespace where resources should be created")]
public string? TargetNamespace { get; set; }
}
public class V1DemoEntityStatus
{
[Description("Current state of the entity")]
public string CurrentState { get; set; } = string.Empty;
[Description("Last time the entity was updated")]
public DateTime LastUpdated { get; set; }
}
}