Status Conditions
This document describes the standardized status conditions used across all Bindy CRDs.
Condition Types
All Bindy custom resources (Bind9Instance, DNSZone, and all DNS record types) use the following standardized condition types:
Ready
- Description: Indicates whether the resource is fully operational and ready to serve its intended purpose
- Common Use: Primary condition type used by all reconcilers
- Status Values:
True: Resource is ready and operationalFalse: Resource is not ready (error or in progress)Unknown: Status cannot be determined
Available
- Description: Indicates whether the resource is available for use
- Common Use: Used to distinguish between “ready” and “available” when resources may be ready but not yet serving traffic
- Status Values:
True: Resource is availableFalse: Resource is not availableUnknown: Availability cannot be determined
Progressing
- Description: Indicates whether the resource is currently being worked on
- Common Use: During initial creation or updates
- Status Values:
True: Resource is being created or updatedFalse: Resource is not currently progressingUnknown: Progress status cannot be determined
Degraded
- Description: Indicates that the resource is functioning but in a degraded state
- Common Use: When some replicas are down but service continues, or when non-critical features are unavailable
- Status Values:
True: Resource is degradedFalse: Resource is not degradedUnknown: Degradation status cannot be determined
Failed
- Description: Indicates that the resource has failed and cannot fulfill its purpose
- Common Use: Permanent failures that require intervention
- Status Values:
True: Resource has failedFalse: Resource has not failedUnknown: Failure status cannot be determined
Condition Structure
All conditions follow this structure:
status:
conditions:
- type: Ready # One of: Ready, Available, Progressing, Degraded, Failed
status: "True" # One of: "True", "False", "Unknown"
reason: Ready # Machine-readable reason (typically same as type)
message: "Bind9Instance configured with 2 replicas" # Human-readable message
lastTransitionTime: "2024-11-26T10:00:00Z" # RFC3339 timestamp
observedGeneration: 1 # Generation last observed by controller
# Resource-specific fields (replicas, recordCount, etc.)
Current Usage
Bind9Instance
- Uses
Readycondition type - Status
Truewhen Deployment, Service, and ConfigMap are successfully created - Status
Falsewhen resource creation fails - Additional status fields:
replicas: Total number of replicasreadyReplicas: Number of ready replicas
Bind9Cluster
- Uses
Readycondition type with granular reasons - Condition reasons:
AllInstancesReady: All instances in the cluster are readySomeInstancesNotReady: Some instances are not ready (cluster partially functional)NoInstancesReady: No instances are ready (cluster not functional)
- Additional status fields:
instanceCount: Total number of instancesreadyInstances: Number of ready instancesinstances: List of instance names
DNSZone
- Uses
Progressing,Degraded, andReadycondition types with granular reasons - Reconciliation Flow:
Progressing/PrimaryReconciling: Before configuring primary instancesProgressing/PrimaryReconciled: After successful primary configurationProgressing/SecondaryReconciling: Before configuring secondary instancesProgressing/SecondaryReconciled: After successful secondary configurationReady/ReconcileSucceeded: When all phases complete successfully
- Error Conditions:
Degraded/PrimaryFailed: Primary reconciliation failed (fatal error)Degraded/SecondaryFailed: Secondary reconciliation failed (primaries still work, non-fatal)
- Additional status fields:
recordCount: Number of records in the zonesecondaryIps: IP addresses of configured secondary serversobservedGeneration: Last observed generation
DNS Records (A, AAAA, CNAME, MX, TXT, NS, SRV, CAA)
- Use
Progressing,Degraded, andReadycondition types with granular reasons - Reconciliation Flow:
Progressing/RecordReconciling: Before configuring record on endpointsReady/ReconcileSucceeded: When record is successfully configured on all endpoints
- Error Conditions:
Degraded/RecordFailed: Record configuration failed (includes error details)
- Status message includes count of configured endpoints (e.g., “Record configured on 3 endpoint(s)”)
- Additional status fields:
observedGeneration: Last observed generation
Best Practices
- Always set the condition type: Use one of the five standardized types
- Include timestamps: Set
lastTransitionTimewhen condition status changes - Provide clear messages: The
messagefield should be human-readable and actionable - Use appropriate reasons: The
reasonfield should be machine-readable and consistent - Update observedGeneration: Always update to match the resource’s current generation
- Multiple conditions: Resources can have multiple conditions simultaneously (e.g.,
Ready: TrueandDegraded: True)
Examples
Successful Bind9Instance
status:
conditions:
- type: Ready
status: "True"
reason: Ready
message: "Bind9Instance configured with 2 replicas"
lastTransitionTime: "2024-11-26T10:00:00Z"
observedGeneration: 1
replicas: 2
readyReplicas: 2
DNSZone - Progressing (Primary Reconciliation)
status:
conditions:
- type: Progressing
status: "True"
reason: PrimaryReconciling
message: "Configuring zone on primary instances"
lastTransitionTime: "2024-11-26T10:00:00Z"
observedGeneration: 1
recordCount: 0
DNSZone - Progressing (Secondary Reconciliation)
status:
conditions:
- type: Progressing
status: "True"
reason: SecondaryReconciling
message: "Configured on 2 primary server(s), now configuring secondaries"
lastTransitionTime: "2024-11-26T10:00:01Z"
observedGeneration: 1
recordCount: 0
secondaryIps:
- "10.42.0.5"
- "10.42.0.6"
DNSZone - Successfully Reconciled
status:
conditions:
- type: Ready
status: "True"
reason: ReconcileSucceeded
message: "Configured on 2 primary server(s) and 3 secondary server(s)"
lastTransitionTime: "2024-11-26T10:00:02Z"
observedGeneration: 1
recordCount: 5
secondaryIps:
- "10.42.0.5"
- "10.42.0.6"
- "10.42.0.7"
DNSZone - Degraded (Secondary Failure)
status:
conditions:
- type: Degraded
status: "True"
reason: SecondaryFailed
message: "Configured on 2 primary server(s), but secondary configuration failed: connection timeout"
lastTransitionTime: "2024-11-26T10:00:02Z"
observedGeneration: 1
recordCount: 5
secondaryIps:
- "10.42.0.5"
- "10.42.0.6"
DNSZone - Failed (Primary Failure)
status:
conditions:
- type: Degraded
status: "True"
reason: PrimaryFailed
message: "Failed to configure zone on primaries: No Bind9Instances matched selector"
lastTransitionTime: "2024-11-26T10:00:00Z"
observedGeneration: 1
recordCount: 0
DNS Record - Progressing
status:
conditions:
- type: Progressing
status: "True"
reason: RecordReconciling
message: "Configuring A record on zone endpoints"
lastTransitionTime: "2024-11-26T10:00:00Z"
observedGeneration: 1
DNS Record - Successfully Configured
status:
conditions:
- type: Ready
status: "True"
reason: ReconcileSucceeded
message: "Record configured on 3 endpoint(s)"
lastTransitionTime: "2024-11-26T10:00:01Z"
observedGeneration: 1
DNS Record - Failed
status:
conditions:
- type: Degraded
status: "True"
reason: RecordFailed
message: "Failed to configure record: Zone not found on primary servers"
lastTransitionTime: "2024-11-26T10:00:01Z"
observedGeneration: 1
Bind9Cluster - Partially Ready
status:
conditions:
- type: Ready
status: "False"
reason: SomeInstancesNotReady
message: "2/3 instances ready"
lastTransitionTime: "2024-11-26T10:00:00Z"
observedGeneration: 1
instanceCount: 3
readyInstances: 2
instances:
- production-dns-primary-0
- production-dns-primary-1
- production-dns-secondary-0
Validation
All condition types are enforced via CRD validation. Attempting to use a condition type not in the enum will result in a validation error:
$ kubectl apply -f invalid-condition.yaml
Error from server (Invalid): error when creating "invalid-condition.yaml":
Bind9Instance.bindy.firestoned.io "test" is invalid:
status.conditions[0].type: Unsupported value: "CustomType":
supported values: "Ready", "Available", "Progressing", "Degraded", "Failed"