Skip to main content

Advanced Features

⚠️ CURRENT IMPLEMENTATION - PVCGroup uses annotation-based membership with largest size coordination policy only.

Overview​

PVC Chonker supports advanced configuration management through Custom Resource Definitions (CRDs) that complement the existing annotation-based approach.

Configuration Hierarchy​

The configuration precedence order is:

  1. PVC Annotations (highest priority - per-PVC overrides)
  2. PVCGroup CRD (group coordination settings)
  3. PVCPolicy CRD (policy templates)
  4. Global Flags/Environment Variables
  5. Built-in Defaults (fallback)

Override Annotation​

Use pvc-chonker.io/enabled: "false" to completely disable expansion for a PVC, regardless of any policy or group configuration.

PVCPolicy Controller​

Purpose​

Manage reusable expansion policies through Kubernetes CRDs instead of repeating annotations on individual PVCs.

When to Use​

  • Multiple PVCs with similar expansion requirements
  • Standardized policies across teams or applications
  • Centralized management of expansion settings
  • Policy inheritance for new PVCs

Basic Example​

apiVersion: pvc-chonker.io/v1alpha1
kind: PVCPolicy
metadata:
name: database-policy
namespace: production
spec:
selector:
matchLabels:
workload: database
template:
enabled: true
threshold: "85%"
inodesThreshold: "90%"
increase: "25%"
maxSize: "2000Gi"
minScaleUp: "50Gi"
cooldown: "30m"

PVCGroup Controller​

Purpose​

Coordinate PVC expansion across related volumes to maintain consistent sizing within a group using the largest size policy.

When to Use​

  • Clustered applications (Elasticsearch, MongoDB replica sets)
  • Distributed storage requiring uniform capacity
  • Consistent sizing for related workloads

Basic Example​

apiVersion: pvc-chonker.io/v1alpha1
kind: PVCGroup
metadata:
name: elasticsearch-cluster
namespace: logging
spec:
template:
threshold: "80%"
increase: "20%"
maxSize: "1000Gi"
cooldown: "20m"

PVC Membership​

PVCs join groups via annotations:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: elasticsearch-data-0
annotations:
pvc-chonker.io/group: elasticsearch-cluster
pvc-chonker.io/enabled: "true"
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 100Gi

Coordination Behavior​

PVCGroups use largest size policy - all PVCs in the group match the size of the largest PVC:

Example: If PVCs are 100Gi, 150Gi, 120Gi → all become 150Gi

This ensures:

  • No volume ever gets smaller
  • Consistent sizing across related volumes
  • Safe, predictable behavior

Annotations vs CRDs Comparison​

Annotations Approach​

# Per-PVC configuration (current method)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
annotations:
pvc-chonker.io/enabled: "true"
pvc-chonker.io/threshold: "80%"
pvc-chonker.io/increase: "20%"
pvc-chonker.io/max-size: "500Gi"
pvc-chonker.io/cooldown: "15m"
pvc-chonker.io/enabled: "false" # Break glass - disables all expansion

Pros:

  • Simple and direct
  • No additional CRDs required
  • Works immediately
  • Per-PVC customization

Cons:

  • Repetitive for similar PVCs
  • Hard to manage at scale
  • No centralized policy management
  • Manual updates required

CRDs Approach​

# Policy-based configuration (advanced method)
apiVersion: pvc-chonker.io/v1alpha1
kind: PVCPolicy
metadata:
name: standard-app-policy
spec:
selector:
matchLabels:
tier: application
template:
enabled: true
threshold: "80%"
increase: "20%"
maxSize: "500Gi"
cooldown: "15m"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
labels:
tier: application # Inherits from policy

Pros:

  • Centralized management
  • Reusable policies
  • Easier to maintain at scale
  • Consistent configuration
  • Group coordination capabilities

Cons:

  • Additional complexity
  • Requires CRD installation
  • Learning curve for teams

Migration Strategy​

Phase 1: Gradual Adoption​

  1. Keep existing annotation-based PVCs unchanged
  2. Create policies for new PVCs
  3. Test policy inheritance

Phase 2: Policy Migration​

  1. Create policies matching existing annotation patterns
  2. Add labels to existing PVCs
  3. Remove redundant annotations

Phase 3: Group Coordination​

  1. Identify PVCs that should be grouped
  2. Create PVCGroup resources
  3. Monitor coordination behavior

Best Practices​

Policy Design​

  • Use descriptive names for policies and groups
  • Start with conservative settings and adjust based on monitoring
  • Group related policies in the same namespace
  • Document policy purposes in metadata annotations

Label Strategy​

  • Consistent labeling across related resources
  • Hierarchical labels (app, component, tier)
  • Avoid label conflicts between different systems

Monitoring​

  • Track policy application through controller logs
  • Monitor group coordination events
  • Set up alerts for expansion failures
  • Review policies regularly based on usage patterns

Troubleshooting​

Policy Not Applied​

  1. Check label selectors match PVC labels
  2. Verify policy is in correct namespace
  3. Review controller logs for errors

Group Coordination Issues​

  1. Confirm all PVCs have matching labels
  2. Check coordination policy is valid
  3. Monitor PVCGroup status for errors

Configuration Conflicts​

  1. Review configuration hierarchy (Annotations > Group > Policy > Global > Defaults)
  2. Check for conflicting policies and groups
  3. Use pvc-chonker.io/enabled: "false" annotation to disable expansion
  4. Use dry-run mode to test changes

Disable Expansion Examples​

# Temporarily disable expansion during maintenance
metadata:
annotations:
pvc-chonker.io/enabled: "false"
pvc-chonker.io/disabled-reason: "maintenance-window"

# Permanently exclude from expansion (overrides any policy/group)
metadata:
labels:
app: database # Would normally match a policy
annotations:
pvc-chonker.io/enabled: "false" # Takes precedence over policy
pvc-chonker.io/disabled-reason: "manual-management"

# PVC in group but individually disabled
metadata:
labels:
app: elasticsearch
cluster: main # Matches group selector
annotations:
pvc-chonker.io/enabled: "false" # Excluded from group coordination