Skip to content

GarageCluster v1beta2

API version: garage.rajsingh.info/v1beta2. Scope: Namespaced.

The custom-resource guide explains operational behavior. The JSON schemas are the validation source of truth.

Spec

GarageClusterSpec defines the desired state of a GarageCluster. A cluster has two optional tiers: - storage — long-lived storage. Its optional default group uses StatefulSet/PVC nodes; nodeLocalPools add selector-driven HostPath nodes. - gateway — routes S3/Admin traffic and stores no object blocks. Auto unified clusters generate one GarageNode-owned StatefulSet per gateway identity; Manual unified clusters use ordinary user-owned GarageNodes. Edge clusters use one cluster-level StatefulSet. Metadata uses a small PVC by default and data uses EmptyDir. Explicit EmptyDir metadata gives up identity persistence and is warned at admission. Supported topology shapes are deliberately disjoint: 1. storage only (storage cluster). 2. storage together with gateway (unified cluster — most common). 3. gateway together with connectTo (edge gateway — pods live separately from the storage backend). 4. connectTo only (management handle; no workloads). storage and connectTo are mutually exclusive. Joining independently managed storage sites is expressed with remoteClusters, not connectTo.

Field path Type Constraints Description
admin object Admin configures the admin API endpoint and metrics
admin.adminTokenSecretRef object AdminTokenSecretRef references the secret used by the operator to authenticate with Garage's Admin API.
admin.adminTokenSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
admin.adminTokenSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
admin.adminTokenSecretRef.optional boolean Specify whether the Secret or its key must be defined
admin.bindAddress string BindAddress is a custom wildcard TCP bind address for the Admin API. Managed workloads accept "0.0.0.0:3903" or "[::]:3903". Unix sockets, empty hosts, loopback, and specific hosts are rejected because Services and direct Pod probes must reach every Garage process. If set, its port overrides BindPort for all generated endpoints. The effective Admin API TCP port is immutable after GarageCluster creation.
admin.bindPort integer default: 3903; format: "int32"; min: 1; max: 65535 BindPort is the port to bind for admin API. The effective Admin API TCP port is immutable after the GarageCluster is created.
admin.metricsRequireToken boolean MetricsRequireToken requires Bearer token authentication for the /metrics endpoint.
admin.metricsTokenSecretRef object MetricsTokenSecretRef references a secret containing a token that protects /metrics.
admin.metricsTokenSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
admin.metricsTokenSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
admin.metricsTokenSecretRef.optional boolean Specify whether the Secret or its key must be defined
admin.traceSink string TraceSink is the OpenTelemetry collector address for tracing.
blocks object Blocks configures block storage settings
blocks.compressionLevel string pattern: "^(none|0|-?[1-9][0-9]*)$" CompressionLevel is the zstd compression level.
blocks.disableScrub boolean DisableScrub disables automatic monthly data directory scrub.
blocks.maxConcurrentReads integer min: 1 MaxConcurrentReads is the maximum simultaneous block file reads.
blocks.maxConcurrentWritesPerRequest integer min: 1 MaxConcurrentWritesPerRequest is the maximum parallel block writes per PUT request.
blocks.ramBufferMax integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" RAMBufferMax is the maximum RAM for buffering blocks.
blocks.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size is the size of data blocks (default: 1M).
blocks.useLocalTZ boolean UseLocalTZ runs lifecycle worker at midnight in local timezone.
connectTo object ConnectTo specifies a remote storage cluster this cluster connects to. Required when gateway is set without storage (edge gateway pattern).
connectTo.adminApiEndpoint string AdminAPIEndpoint is the storage cluster's Admin API URL.
connectTo.adminTokenSecretRef object AdminTokenSecretRef references the storage cluster's admin token.
connectTo.adminTokenSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
connectTo.adminTokenSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
connectTo.adminTokenSecretRef.optional boolean Specify whether the Secret or its key must be defined
connectTo.bootstrapPeers array of string BootstrapPeers are initial peers for cluster formation.
connectTo.clusterRef object ClusterRef references a GarageCluster in the same namespace.
connectTo.clusterRef.kubeConfigSecretRef object KubeConfigSecretRef is reserved for a future remote Kubernetes client integration. It is currently rejected by admission because the operator does not use it.
connectTo.clusterRef.kubeConfigSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
connectTo.clusterRef.kubeConfigSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
connectTo.clusterRef.kubeConfigSecretRef.optional boolean Specify whether the Secret or its key must be defined
connectTo.clusterRef.name string required Name of the GarageCluster resource.
connectTo.clusterRef.namespace string Namespace of the GarageCluster. Defaults to the referencing resource's namespace. Cross-namespace references require a GarageReferenceGrant in the target namespace.
connectTo.rpcSecretRef object RPCSecretRef references a secret containing the shared RPC secret.
connectTo.rpcSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
connectTo.rpcSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
connectTo.rpcSecretRef.optional boolean Specify whether the Secret or its key must be defined
database object Database configures the metadata database engine
database.engine string default: "lmdb"; enum: ["lmdb", "sqlite", "fjall"] Engine specifies the database engine to use.
database.fjallBlockCacheSize integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" FjallBlockCacheSize is the block cache size for Fjall.
database.lmdbMapSize integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" LMDBMapSize is the virtual memory region size for LMDB.
defaultNodeTags array of string DefaultNodeTags are tags applied to all auto-managed nodes. Only used when LayoutPolicy is "Auto".
deletionPolicy string enum: ["Destroy", "Drain"] DeletionPolicy controls deletion-time Garage layout handling. Destroy is whole-store teardown and does not attempt Garage's invalid empty-layout transition. Drain retires one federated site and blocks deletion until its roles migrate to surviving replicas and layout history settles. HostPath data is never deleted; PVC cleanup remains controlled by storage.pvcRetentionPolicy. When omitted, standalone clusters retain legacy Destroy behavior. Federated deletion is refused until this is set explicitly; if admission is bypassed, the controller fails closed as Drain.
discovery object Discovery configures peer discovery mechanisms
discovery.consul object Consul configures Consul-based peer discovery.
discovery.consul.api string default: "catalog"; enum: ["catalog", "agent"] API specifies the service registration API.
discovery.consul.caCert string CACert is the CA certificate for TLS connection.
discovery.consul.caCertSecretRef object CACertSecretRef references a secret containing the CA certificate.
discovery.consul.caCertSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
discovery.consul.caCertSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
discovery.consul.caCertSecretRef.optional boolean Specify whether the Secret or its key must be defined
discovery.consul.clientCertSecretRef object ClientCertSecretRef references a secret containing client TLS cert.
discovery.consul.clientCertSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
discovery.consul.clientCertSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
discovery.consul.clientCertSecretRef.optional boolean Specify whether the Secret or its key must be defined
discovery.consul.clientKeySecretRef object ClientKeySecretRef references a secret containing client TLS key.
discovery.consul.clientKeySecretRef.key string required The key of the secret to select from. Must be a valid secret key.
discovery.consul.clientKeySecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
discovery.consul.clientKeySecretRef.optional boolean Specify whether the Secret or its key must be defined
discovery.consul.datacenters array of string Datacenters for WAN federation.
discovery.consul.enabled boolean Enabled enables Consul-based discovery.
discovery.consul.httpAddr string HTTPAddr is the full HTTP(S) address of Consul server.
discovery.consul.meta map of string Meta is service metadata key-value pairs.
discovery.consul.serviceName string ServiceName for Garage RPC port registration.
discovery.consul.tags array of string Tags are additional service tags.
discovery.consul.tlsSkipVerify boolean TLSSkipVerify skips TLS hostname verification.
discovery.consul.tokenSecretRef object TokenSecretRef references a secret containing the bearer token.
discovery.consul.tokenSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
discovery.consul.tokenSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
discovery.consul.tokenSecretRef.optional boolean Specify whether the Secret or its key must be defined
discovery.kubernetes object Kubernetes configures Kubernetes-based peer discovery.
discovery.kubernetes.enabled boolean Enabled enables Kubernetes-based discovery.
discovery.kubernetes.namespace string Namespace for Garage custom resources.
discovery.kubernetes.serviceName string ServiceName label to filter custom resources.
discovery.kubernetes.skipCRD boolean SkipCRD skips automatic CRD creation/patching.
gateway object validation: initContainers and extraContainers names must be unique across both lists Gateway configures the gateway tier. Auto unified clusters generate one GarageNode-owned StatefulSet per replica; Manual unified clusters use ordinary user-owned GarageNodes. Edge clusters use one cluster-level StatefulSet. Gateway pods store no object blocks. Metadata uses a small PVC by default to persist identity across restarts; callers may explicitly choose EmptyDir metadata and accept identity churn. May be combined with storage (unified cluster) or connectTo (edge cluster), but never both.
gateway.affinity object Affinity for pod scheduling.
gateway.affinity.nodeAffinity object Describes node affinity scheduling rules for the pod.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference object required A node selector term, associated with the corresponding weight.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions array of object A list of node selector requirements by node's labels.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].key string required The label key that the selector applies to.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields array of object A list of node selector requirements by node's fields.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].key string required The label key that the selector applies to.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
gateway.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms array of object required Required. A list of node selector terms. The terms are ORed.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions array of object A list of node selector requirements by node's labels.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].key string required The label key that the selector applies to.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields array of object A list of node selector requirements by node's fields.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].key string required The label key that the selector applies to.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
gateway.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
gateway.affinity.podAffinity object Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
gateway.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
gateway.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
gateway.affinity.podAntiAffinity object Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
gateway.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
gateway.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
gateway.containerSecurityContext object ContainerSecurityContext for the Garage container.
gateway.containerSecurityContext.allowPrivilegeEscalation boolean AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by this container. If set, this profile overrides the pod's appArmorProfile. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
gateway.containerSecurityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
gateway.containerSecurityContext.capabilities object The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.capabilities.add array of string Added capabilities
gateway.containerSecurityContext.capabilities.drop array of string Removed capabilities
gateway.containerSecurityContext.privileged boolean Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.procMount string procMount denotes the type of proc mount to use for the containers. The default value is Default which uses the container runtime defaults for readonly paths and masked paths. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.readOnlyRootFilesystem boolean Whether this container has a read-only root filesystem. Default is false. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
gateway.containerSecurityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.seLinuxOptions object The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
gateway.containerSecurityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
gateway.containerSecurityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
gateway.containerSecurityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
gateway.containerSecurityContext.seccompProfile object The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.
gateway.containerSecurityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
gateway.containerSecurityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
gateway.containerSecurityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
gateway.containerSecurityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
gateway.containerSecurityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
gateway.containerSecurityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
gateway.containerSecurityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
gateway.env array of object Env is a list of additional environment variables to set on the Garage container. Garage config-path and RPC/Admin/metrics credential variables are operator-reserved. Typical use: setting GARAGE_ALLOW_WORLD_READABLE_SECRETS or another non-identity Garage startup option.
gateway.env[].name string required Name of the environment variable. May consist of any printable ASCII characters except '='.
gateway.env[].value string Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".
gateway.env[].valueFrom object Source for the environment variable's value. Cannot be used if value is not empty.
gateway.env[].valueFrom.configMapKeyRef object Selects a key of a ConfigMap.
gateway.env[].valueFrom.configMapKeyRef.key string required The key to select from the ConfigMap's Data field. Keys in the BinaryData field are not currently propagated to container env vars.
gateway.env[].valueFrom.configMapKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
gateway.env[].valueFrom.configMapKeyRef.optional boolean Specify whether the ConfigMap or its key must be defined
gateway.env[].valueFrom.fieldRef object Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels\['<KEY>'\], metadata.annotations\['<KEY>'\], spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
gateway.env[].valueFrom.fieldRef.apiVersion string Version of the schema the FieldPath is written in terms of, defaults to "v1".
gateway.env[].valueFrom.fieldRef.fieldPath string required Path of the field to select in the specified API version.
gateway.env[].valueFrom.fileKeyRef object FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.
gateway.env[].valueFrom.fileKeyRef.key string required The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
gateway.env[].valueFrom.fileKeyRef.optional boolean default: false Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers. If optional is set to false and the specified key does not exist, an error will be returned during Pod creation.
gateway.env[].valueFrom.fileKeyRef.path string required The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.
gateway.env[].valueFrom.fileKeyRef.volumeName string required The name of the volume mount containing the env file.
gateway.env[].valueFrom.resourceFieldRef object Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
gateway.env[].valueFrom.resourceFieldRef.containerName string Container name: required for volumes, optional for env vars
gateway.env[].valueFrom.resourceFieldRef.divisor integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Specifies the output format of the exposed resources, defaults to "1"
gateway.env[].valueFrom.resourceFieldRef.resource string required Required: resource to select
gateway.env[].valueFrom.secretKeyRef object Selects a key of a secret in the pod's namespace
gateway.env[].valueFrom.secretKeyRef.key string required The key of the secret to select from. Must be a valid secret key.
gateway.env[].valueFrom.secretKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
gateway.env[].valueFrom.secretKeyRef.optional boolean Specify whether the Secret or its key must be defined
gateway.envFrom array of object EnvFrom is a list of sources to populate environment variables in the Garage container. A source prefix must not be capable of injecting an operator-reserved Garage variable. Sources are evaluated before the per-variable Env list, matching Kubernetes container semantics.
gateway.envFrom[].configMapRef object The ConfigMap to select from
gateway.envFrom[].configMapRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
gateway.envFrom[].configMapRef.optional boolean Specify whether the ConfigMap must be defined
gateway.envFrom[].prefix string Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.
gateway.envFrom[].secretRef object The Secret to select from
gateway.envFrom[].secretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
gateway.envFrom[].secretRef.optional boolean Specify whether the Secret must be defined
gateway.extraContainers array of object max items: 16; validation: container name is operator-reserved ExtraContainers run beside the Garage container in the same pod and network namespace. They cannot mount operator-owned volumes.
gateway.extraContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
gateway.extraVolumes array of object max items: 32; validation: volume name is operator-reserved ExtraVolumes are added to the pod. Operator-owned volume names are reserved (config, metadata, data, data-, rpc-secret, admin-token, metrics-token).
gateway.extraVolumes[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the volume. It must be unique across extraVolumes, a DNS-1123 label, and not an operator-reserved volume name.
gateway.initContainers array of object max items: 16; validation: container name is operator-reserved InitContainers run before the Garage container, after any operator-injected init containers. Entries with restartPolicy: Always are native sidecars (Kubernetes 1.29+ beta, GA in 1.33). Names garage, purge-cluster-layout and the prefix garage-operator- are reserved.
gateway.initContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
gateway.metadata object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Metadata configures gateway metadata storage for Auto unified gateways and edge gateways. It defaults to a 1Gi PVC; type EmptyDir explicitly gives up identity persistence. Manual unified gateways are user-owned GarageNodes, so this cluster-level field is rejected there. Paths and volumeClaimTemplateSpec is unsupported. Selector applies to newly created claims in both unified and edge gateway workloads. Change an edge gateway's metadata configuration only after scaling gateway replicas to zero and waiting for its capacity-less roles to retire. Data always stays EmptyDir because gateways do not store object blocks.
gateway.metadata.accessModes array of string AccessModes for the PVC.
gateway.metadata.annotations map of string Annotations to set on the PVC.
gateway.metadata.dataSourceRef object DataSourceRef is the opt-in restore source for every generated PVC of this volume role. Setting it copies the same same-namespace, non-core group populator onto each Auto ordinal of this role; the populator must map target claim i to source-group member i. A core PVC or single-volume clone is not a safe source. Metadata and data are independent roles: restore identity by setting this on metadata, object blocks by setting it on data. It is immutable after the GarageCluster is created.
gateway.metadata.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.dataSourceRef.kind string required Kind is the type of resource being referenced
gateway.metadata.dataSourceRef.name string required Name is the name of resource being referenced
gateway.metadata.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.labels map of string Labels to set on the PVC.
gateway.metadata.paths array of object Paths configures multiple data directories for multi-disk setups. Only valid for data volumes — webhook rejects this on metadata volumes.
gateway.metadata.paths[].capacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity of the drive (required unless readOnly).
gateway.metadata.paths[].path string required Path to the data directory.
gateway.metadata.paths[].readOnly boolean ReadOnly marks the directory as a legacy read-only Garage data source for migrations. This controls Garage's block placement; the Kubernetes mount remains writable so Garage can maintain its per-directory marker file.
gateway.metadata.paths[].volume object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Volume configuration for this data path.
gateway.metadata.paths[].volume.accessModes array of string AccessModes for the PVC.
gateway.metadata.paths[].volume.annotations map of string Annotations to set on the PVC.
gateway.metadata.paths[].volume.dataSourceRef object DataSourceRef is the opt-in restore source for this data path's PVC across every Auto ordinal. Same group-populator contract as VolumeConfig.dataSourceRef.
gateway.metadata.paths[].volume.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.paths[].volume.dataSourceRef.kind string required Kind is the type of resource being referenced
gateway.metadata.paths[].volume.dataSourceRef.name string required Name is the name of resource being referenced
gateway.metadata.paths[].volume.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.paths[].volume.labels map of string Labels to set on the PVC.
gateway.metadata.paths[].volume.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
gateway.metadata.paths[].volume.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.metadata.paths[].volume.selector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.metadata.paths[].volume.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.metadata.paths[].volume.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.metadata.paths[].volume.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.metadata.paths[].volume.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume (storage request).
gateway.metadata.paths[].volume.storageClassName string StorageClassName for the PVC.
gateway.metadata.paths[].volume.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type.
gateway.metadata.paths[].volume.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
gateway.metadata.paths[].volume.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
gateway.metadata.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
gateway.metadata.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.metadata.selector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.metadata.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.metadata.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.metadata.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.metadata.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume.
gateway.metadata.storageClassName string StorageClassName for the PVC.
gateway.metadata.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type: PersistentVolumeClaim (default) or EmptyDir.
gateway.metadata.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
gateway.metadata.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Arbitrary claim-template dataSource or volumeName settings can clone a metadata node_key or bind multiple Garage identities to one disk. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
gateway.metadata.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
gateway.metadata.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
gateway.metadata.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
gateway.metadata.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
gateway.metadata.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
gateway.metadata.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
gateway.metadata.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
gateway.metadata.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
gateway.metadata.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
gateway.metadata.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.metadata.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.metadata.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
gateway.metadata.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.metadata.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.metadata.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
gateway.metadata.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
gateway.metadata.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
gateway.metadata.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
gateway.nodeSelector map of string NodeSelector for pod scheduling.
gateway.podAnnotations map of string PodAnnotations to add to pods.
gateway.podDisruptionBudget object PodDisruptionBudget configures a PDB for the gateway workloads. Gateway pods serve S3/Admin traffic but hold no object data, so a PDB only protects request availability during node drains — not data durability.
gateway.podDisruptionBudget.enabled boolean default: true Enabled enables PodDisruptionBudget creation
gateway.podDisruptionBudget.maxUnavailable integer or string MaxUnavailable specifies the maximum number of pods that can be unavailable.
gateway.podDisruptionBudget.minAvailable integer or string MinAvailable specifies the minimum number of pods that must be available.
gateway.podLabels map of string PodLabels to add to pods.
gateway.priorityClassName string PriorityClassName for pods.
gateway.pvcRetentionPolicy object PVCRetentionPolicy controls gateway metadata PVC lifecycle. It preserves the released v1beta1 gateway storage.pvcRetentionPolicy contract. When omitted, edge gateway StatefulSets keep their established Delete/Delete behavior, while per-GarageNode unified gateway StatefulSets keep Kubernetes' safer Retain/Retain default. An explicit value applies to both managed gateway shapes.
gateway.pvcRetentionPolicy.whenDeleted string default: "Retain"; enum: ["Retain", "Delete"] WhenDeleted specifies what happens to PVCs when the StatefulSet is deleted.
gateway.pvcRetentionPolicy.whenScaled string default: "Retain"; enum: ["Retain", "Delete"] WhenScaled specifies what happens to PVCs when the StatefulSet is scaled down.
gateway.readinessProbe object ReadinessProbe overrides the gateway tier's readiness probe. When unset, the operator uses a bind-only TCP check on the S3 port. The default is deliberately NOT a serving-aware admin /health probe: /health is a cluster-wide consistent write-quorum signal, so at replication.factor=2 a single storage-node loss (or, for a federated cluster, the window before remote peers join) makes /health return 503 on every node, which would mark all gateways NotReady and — behind a publishNotReadyAddresses=false Service such as the Tailscale anycast — withdraw the whole anycast and take down reads too, even though read_quorum=1 means reads still work. Serving-health belongs in monitoring (alert on /health), not readiness. Set this only if you have a custom read-capability gate (e.g. an exec probe) that won't withdraw a gateway that can still serve reads.
gateway.readinessProbe.exec object Exec specifies a command to execute in the container.
gateway.readinessProbe.exec.command array of string Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.
gateway.readinessProbe.failureThreshold integer format: "int32" Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.
gateway.readinessProbe.grpc object GRPC specifies a GRPC HealthCheckRequest.
gateway.readinessProbe.grpc.mode string mode specifies the connection mode for the gRPC health probe. Set to "TLS" to use TLS without certificate verification. Set to "Plaintext" to use a plaintext (insecure) connection explicitly. If not specified, the probe uses a plaintext (insecure) connection.
gateway.readinessProbe.grpc.port integer required; format: "int32" Port number of the gRPC service. Number must be in the range 1 to 65535.
gateway.readinessProbe.grpc.service string default: "" Service is the name of the service to place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). If this is not specified, the default behavior is defined by gRPC.
gateway.readinessProbe.httpGet object HTTPGet specifies an HTTP GET request to perform.
gateway.readinessProbe.httpGet.host string Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead.
gateway.readinessProbe.httpGet.httpHeaders array of object Custom headers to set in the request. HTTP allows repeated headers.
gateway.readinessProbe.httpGet.httpHeaders[].name string required The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
gateway.readinessProbe.httpGet.httpHeaders[].value string required The header field value
gateway.readinessProbe.httpGet.path string Path to access on the HTTP server.
gateway.readinessProbe.httpGet.port integer or string required Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
gateway.readinessProbe.httpGet.protocol string Protocol selects the wire protocol for the probe connection. Nil defaults to HTTP/1.1.
gateway.readinessProbe.httpGet.scheme string Scheme to use for connecting to the host. Defaults to HTTP.
gateway.readinessProbe.initialDelaySeconds integer format: "int32" Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
gateway.readinessProbe.periodSeconds integer format: "int32" How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.
gateway.readinessProbe.successThreshold integer format: "int32" Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.
gateway.readinessProbe.tcpSocket object TCPSocket specifies a connection to a TCP port.
gateway.readinessProbe.tcpSocket.host string Optional: Host name to connect to, defaults to the pod IP.
gateway.readinessProbe.tcpSocket.port integer or string required Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.
gateway.readinessProbe.terminationGracePeriodSeconds integer format: "int64" Optional duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this value overrides the value provided by the pod spec. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate. Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.
gateway.readinessProbe.timeoutSeconds integer format: "int32" Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
gateway.replicas integer required; default: 2; format: "int32"; min: 0 Replicas controls generated gateway identities in an Auto unified cluster, or the cluster-level StatefulSet replicas in an edge cluster. Set it to 0 to retire those operator-managed roles and workloads. It does not control ordinary user-owned gateway GarageNodes in Manual layout mode.
gateway.resources object Resources specifies compute resources for the pod.
gateway.resources.claims array of object Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.
gateway.resources.claims[].name string required Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
gateway.resources.claims[].request string Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.
gateway.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
gateway.rpcPublicAddr string RPCPublicAddr, when set, is written into the gateway pods' garage.toml as rpc_public_addr so that peers in other regions can dial gateways by hostname. It is operationally required when federated peers cannot route directly to each Pod IP; leave it unset when gateways communicate only with a locally routable storage tier.
gateway.securityContext object SecurityContext for the pod.
gateway.securityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
gateway.securityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
gateway.securityContext.fsGroup integer format: "int64" A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- If unset, the Kubelet will not modify the ownership and permissions of any volume. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.fsGroupChangePolicy string fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
gateway.securityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.seLinuxChangePolicy string seLinuxChangePolicy defines how the container's SELinux label is applied to all volumes used by the Pod. It has no effect on nodes that do not support SELinux or to volumes does not support SELinux. Valid values are "MountOption" and "Recursive". "Recursive" means relabeling of all files on all Pod volumes by the container runtime. This may be slow for large volumes, but allows mixing privileged and unprivileged Pods sharing the same volume on the same node. "MountOption" mounts all eligible Pod volumes with -o context mount option. This requires all Pods that share the same volume to use the same SELinux label. It is not possible to share the same volume among privileged and unprivileged Pods. Eligible volumes are in-tree FibreChannel and iSCSI volumes, and all CSI volumes whose CSI driver announces SELinux support by setting spec.seLinuxMount: true in their CSIDriver instance. Other volumes are always re-labelled recursively. If not specified, "MountOption" is used. This field affects only Pods that have SELinux label set, either in PodSecurityContext or in SecurityContext of all containers. All Pods that use the same volume should use the same seLinuxChangePolicy, otherwise some pods can get stuck in ContainerCreating state. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.seLinuxOptions object The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
gateway.securityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
gateway.securityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
gateway.securityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
gateway.securityContext.seccompProfile object The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
gateway.securityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
gateway.securityContext.supplementalGroups array of integer A list of groups applied to the first process run in each container, in addition to the container's primary GID and fsGroup (if specified). If the SupplementalGroupsPolicy feature is enabled, the supplementalGroupsPolicy field determines whether these are in addition to or instead of any group memberships defined in the container image. If unspecified, no additional groups are added, though group memberships defined in the container image may still be used, depending on the supplementalGroupsPolicy field. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.supplementalGroupsPolicy string Defines how supplemental groups of the first container processes are calculated. Valid values are "Merge" and "Strict". If not specified, "Merge" is used. (Alpha) Using the field requires the SupplementalGroupsPolicy feature gate to be enabled and the container runtime must implement support for this feature. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.sysctls array of object Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. Note that this field cannot be set when spec.os.name is windows.
gateway.securityContext.sysctls[].name string required Name of a property to set
gateway.securityContext.sysctls[].value string required Value of a property to set
gateway.securityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
gateway.securityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
gateway.securityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
gateway.securityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
gateway.securityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
gateway.tolerations array of object Tolerations for pod scheduling.
gateway.tolerations[].effect string Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
gateway.tolerations[].key string Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.
gateway.tolerations[].operator string Operator represents a key's relationship to the value. Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
gateway.tolerations[].tolerationSeconds integer format: "int64" TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.
gateway.tolerations[].value string Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.
gateway.topologySpreadConstraints array of object TopologySpreadConstraints for pod scheduling.
gateway.topologySpreadConstraints[].labelSelector object LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
gateway.topologySpreadConstraints[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
gateway.topologySpreadConstraints[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
gateway.topologySpreadConstraints[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
gateway.topologySpreadConstraints[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
gateway.topologySpreadConstraints[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
gateway.topologySpreadConstraints[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).
gateway.topologySpreadConstraints[].maxSkew integer required; format: "int32" MaxSkew describes the degree to which pods may be unevenly distributed. When whenUnsatisfiable=DoNotSchedule, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When whenUnsatisfiable=ScheduleAnyway, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.
gateway.topologySpreadConstraints[].minDomains integer format: "int32" MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew.
gateway.topologySpreadConstraints[].nodeAffinityPolicy string NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy.
gateway.topologySpreadConstraints[].nodeTaintsPolicy string NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy.
gateway.topologySpreadConstraints[].topologyKey string required TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
gateway.topologySpreadConstraints[].whenUnsatisfiable string required WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it more imbalanced. It's a required field.
image string Image specifies the Garage container image to use. Takes precedence over imageRepository if both are set.
imagePullPolicy string default: "IfNotPresent" ImagePullPolicy specifies the image pull policy
imagePullSecrets array of object ImagePullSecrets specifies secrets for pulling images from private registries
imagePullSecrets[].name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
imageRepository string ImageRepository overrides just the repository portion of the default Garage image, preserving the default tag for automatic version upgrades. Ignored if image is set.
k2vApi object K2VAPI configures the K2V (key-value) API endpoint. Omit to disable K2V.
k2vApi.bindAddress string BindAddress is a custom wildcard TCP bind address for the K2V API.
k2vApi.bindPort integer default: 3904; format: "int32"; min: 1; max: 65535 BindPort is the port to bind for K2V API.
layoutManagement object LayoutManagement controls automatic layout application behavior.
layoutManagement.autoApply boolean AutoApply automatically applies staged layout changes.
layoutManagement.drain object Drain configures the fail-closed boundary for positive-capacity removal across the canonical Garage layout. It is deliberately independent of a local storage workload: management handles, mixed PVC/SMB/node-local-pool sites, external GarageNodes, scale-down, and deletionPolicy: Drain all coordinate through the same policy.
layoutManagement.drain.unverifiedPeersPolicy string default: "Block"; enum: ["Block", "AssumeConsistent"] UnverifiedPeersPolicy defaults to Block. AssumeConsistent is required for federated or externally managed processes and is a deliberate maintenance assertion, not an online safety guarantee.
layoutManagement.minNodesHealthy integer MinNodesHealthy is the minimum healthy nodes required before applying layout changes.
layoutManagement.redundancyVerification object RedundancyVerification configures the FullyReplicated proof (#474).
layoutManagement.redundancyVerification.onTopologyChange boolean OnTopologyChange starts a blocks-only proof, one local storage node at a time, when the storage nodes, zones or capacities of the layout change after the operator recorded its baseline. Off by default: proofs then run only from the annotation. Ignored on a Follower site.
layoutManagement.siteRole string enum: ["Writer", "Follower"] SiteRole selects whether this GarageCluster may change the shared Garage layout. Absent is equivalent to Writer, the behavior of every release before this field existed. A Follower never stages, applies, reverts, or removes roles; it only reconciles its own workloads and reports status. Exactly one site in a federation should be the Writer.
layoutPolicy string default: "Auto"; enum: ["Auto", "Manual"] LayoutPolicy controls whether node layouts are automatically managed or manually configured.
logging object Logging configures logging behavior for Garage nodes
logging.journald boolean Journald enables logging to systemd journald.
logging.level string Level sets the log level using RUST_LOG format.
logging.syslog boolean Syslog enables logging to syslog.
maintenance object Maintenance configures maintenance mode for this cluster.
maintenance.suspended boolean Suspended pauses all reconciliation for this cluster.
monitoring object Monitoring configures Prometheus integration for this cluster.
monitoring.additionalLabels map of string AdditionalLabels are added to the ServiceMonitor metadata.
monitoring.enabled boolean Enabled creates a ServiceMonitor targeting the admin API /metrics endpoint.
monitoring.interval string Interval is the Prometheus scrape interval (e.g. "30s", "1m").
monitoring.metricRelabelings array of object MetricRelabelings are applied to samples scraped from the admin /metrics endpoint before ingestion (set as the ServiceMonitor endpoint's metricRelabelings). Use them to drop high-cardinality series that nothing queries — e.g. the per-method rpc_duration_* histograms, which dominate a Garage node's metric series count.
monitoring.metricRelabelings[].action string default: "replace"; enum: ["replace", "Replace", "keep", "Keep", "drop", "Drop", "hashmod", "HashMod", "labelmap", "LabelMap", "labeldrop", "LabelDrop", "labelkeep", "LabelKeep", "lowercase", "Lowercase", "uppercase", "Uppercase", "keepequal", "KeepEqual", "dropequal", "DropEqual"] action to perform based on the regex matching. Uppercase and Lowercase actions require Prometheus >= v2.36.0. DropEqual and KeepEqual actions require Prometheus >= v2.41.0. Default: "Replace"
monitoring.metricRelabelings[].modulus integer format: "int64"; min: 0 modulus to take of the hash of the source label values. Only applicable when the action is HashMod.
monitoring.metricRelabelings[].regex string regex defines the regular expression against which the extracted value is matched.
monitoring.metricRelabelings[].replacement string replacement value against which a Replace action is performed if the regular expression matches. Regex capture groups are available.
monitoring.metricRelabelings[].separator string separator defines the string between concatenated SourceLabels.
monitoring.metricRelabelings[].sourceLabels array of string sourceLabels defines the source labels select values from existing labels. Their content is concatenated using the configured Separator and matched against the configured regular expression.
monitoring.metricRelabelings[].targetLabel string targetLabel defines the label to which the resulting string is written in a replacement. It is mandatory for Replace, HashMod, Lowercase, Uppercase, KeepEqual and DropEqual actions. Regex capture groups are available.
network object Network configures RPC and API networking
network.bootstrapPeers array of string BootstrapPeers lists initial peers for cluster formation.
network.rpcBindAddress string RPCBindAddress is a custom wildcard TCP bind address for the RPC server.
network.rpcBindOutgoing boolean RPCBindOutgoing pre-binds outgoing sockets to same IP.
network.rpcBindPort integer default: 3901; format: "int32"; min: 1; max: 65535 RPCBindPort is the port for inter-cluster RPC.
network.rpcPingTimeout string RPCPingTimeout sets the RPC ping timeout.
network.rpcPublicAddr string RPCPublicAddr is the external address for storage-tier nodes to advertise. Gateway tier has its own rpcPublicAddr field on spec.gateway.
network.rpcPublicAddrSubnet string RPCPublicAddrSubnet filters autodiscovered IPs to specific subnet.
network.rpcSecretRef object RPCSecretRef references a secret containing the shared RPC secret.
network.rpcSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
network.rpcSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
network.rpcSecretRef.optional boolean Specify whether the Secret or its key must be defined
network.rpcTimeout string RPCTimeout sets the RPC call timeout.
network.service object Service configures the Kubernetes Service for the cluster.
network.service.annotations map of string Annotations to add to the service.
network.service.externalTrafficPolicy string ExternalTrafficPolicy for LoadBalancer/NodePort.
network.service.labels map of string Labels to add to the service. Operator-managed labels take precedence on conflict.
network.service.loadBalancerIP string LoadBalancerIP for LoadBalancer type.
network.service.loadBalancerSourceRanges array of string LoadBalancerSourceRanges for LoadBalancer type.
network.service.type string default: "ClusterIP"; enum: ["ClusterIP", "NodePort", "LoadBalancer"] Type of service.
publicEndpoint object PublicEndpoint configures how remote clusters reach this cluster's nodes. Used for multi-cluster federation of the storage tier.
publicEndpoint.externalIP object ExternalIP is retained for API compatibility but is not supported. Setting it is rejected because the operator does not consume the explicit address mapping or template.
publicEndpoint.externalIP.addressTemplate string AddressTemplate is retained for API compatibility but is unsupported.
publicEndpoint.externalIP.addresses map of string Addresses is retained for API compatibility but is unsupported.
publicEndpoint.loadBalancer object LoadBalancer configuration.
publicEndpoint.loadBalancer.annotations map of string Annotations to add to the service.
publicEndpoint.loadBalancer.labels map of string Labels to add to the service. Operator-managed labels take precedence on conflict.
publicEndpoint.loadBalancer.perNode boolean PerNode creates a separate LoadBalancer service per GarageCluster pod.
publicEndpoint.nodePort object NodePort configuration.
publicEndpoint.nodePort.annotations map of string Annotations to add to the service.
publicEndpoint.nodePort.basePort integer format: "int32"; min: 30000; max: 32767 BasePort is the starting NodePort; Garage pod N is exposed on BasePort+N.
publicEndpoint.nodePort.externalAddresses array of string required ExternalAddresses are the externally-reachable IPs or hostnames of the Kubernetes nodes.
publicEndpoint.nodePort.labels map of string Labels to add to the service. Operator-managed labels take precedence on conflict.
publicEndpoint.type string required; enum: ["LoadBalancer", "NodePort", "ExternalIP", "Headless"] Type specifies how nodes are exposed to remote clusters for RPC.
remoteClusters array of object RemoteClusters lists Garage clusters in other Kubernetes clusters to federate with. Applies to the storage tier. Gateways inherit reachability via the local storage peer.
remoteClusters[].connection object required Connection defines how to connect to this remote cluster.
remoteClusters[].connection.adminApiEndpoint string required; min length: 1 AdminAPIEndpoint is the admin API endpoint of the remote cluster.
remoteClusters[].connection.adminTokenSecretRef object AdminTokenSecretRef references the admin token for the remote cluster's API.
remoteClusters[].connection.adminTokenSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
remoteClusters[].connection.adminTokenSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
remoteClusters[].connection.adminTokenSecretRef.optional boolean Specify whether the Secret or its key must be defined
remoteClusters[].connection.gatewayRpcEndpointTemplate string GatewayRPCEndpointTemplate is a hostname:port template used by federation to connect to remote gateway pods individually. The literal {ordinal} is replaced with each remote gateway pod's ordinal (0, 1, ...) parsed from the layout role's pod-name tag (e.g. garage-gateway-0). Required when the remote cluster runs gateway pods that participate in the cluster layout (default since v0.5.8). FullReplication tables (key_table, bucket_table, ...) need quorum across all_nodes, which includes remote gateways. Without this field the operator only peers storage↔storage cross-region; remote gateways appear in layout but remain unreachable, blocking GetKeyInfo / DeleteKey / FullReplication writes that need full quorum. Example: "ottawa-garage-gw-{ordinal}.keiretsu.ts.net:3901"
remoteClusters[].connection.storageRpcEndpointTemplate string StorageRPCEndpointTemplate is a hostname:port template used by federation to connect to remote STORAGE pods individually, mirroring GatewayRPCEndpointTemplate. The literal {ordinal} is replaced with each remote storage pod's ordinal (0, 1, ...) parsed from the layout role's pod-name tag (e.g. garage-storage-0). Needed when a remote region runs more than one storage pod behind a single admin hostname (e.g. a Tailscale VIP): the default storage↔storage connect loop dials every remote node at that one shared hostname, which only ever lands one pod, leaving the rest unreachable cross-region. Set this together with the remote region's spec.storage.rpcPublicAddr {ordinal} template so each storage pod is both advertised and dialed per-pod. Example: "ottawa-storage-{ordinal}.keiretsu.ts.net:3901"
remoteClusters[].defaultCapacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" DefaultCapacity is retained for API compatibility but is not supported. Remote role capacity is copied from the source cluster's committed or staged layout and cannot be overridden by the importing cluster.
remoteClusters[].name string required; min length: 1 Name is a friendly name for this remote cluster.
remoteClusters[].zone string required; min length: 1 Zone is the zone name for nodes in this remote cluster.
replication object Replication configures data replication settings. If omitted, defaults to factor: 3 and consistencyMode: consistent.
replication.consistencyMode string default: "consistent"; enum: ["consistent", "degraded", "dangerous"] ConsistencyMode controls quorum behavior for read/write operations.
replication.factor integer required; default: 3; min: 1; max: 7 Factor is the replication factor (1, 2, 3, 5, 7, etc.)
replication.zoneRedundancyMinZones integer min: 1; max: 7 ZoneRedundancyMinZones is the minimum number of zones required.
replication.zoneRedundancyMode string enum: ["Maximum", "AtLeast"] ZoneRedundancyMode controls how data is distributed across zones.
s3Api object S3API configures the S3-compatible API endpoint
s3Api.bindAddress string BindAddress is a custom wildcard TCP bind address for the S3 API.
s3Api.bindPort integer default: 3900; format: "int32"; min: 1; max: 65535 BindPort is the port to bind for S3 API.
s3Api.region string required; default: "garage" Region is the AWS S3 region name to use.
s3Api.rootDomain string RootDomain is the root domain suffix for vhost-style S3 access.
security object Security configures security-related settings
security.allowInsecureSecretPermissions boolean AllowInsecureSecretPermissions bypasses Garage's check that secret files are not world-readable on disk.
security.allowPunycode boolean AllowPunycode allows punycode in bucket names.
security.tls object TLS configures TLS settings.
security.tls.caSecretRef object CASecretRef references a secret containing the CA certificate.
security.tls.caSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
security.tls.caSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
security.tls.caSecretRef.optional boolean Specify whether the Secret or its key must be defined
security.tls.certSecretRef object CertSecretRef references a secret containing the TLS certificate for RPC.
security.tls.certSecretRef.key string required The key of the secret to select from. Must be a valid secret key.
security.tls.certSecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
security.tls.certSecretRef.optional boolean Specify whether the Secret or its key must be defined
security.tls.enabled boolean Enabled enables TLS for inter-node RPC communication.
security.tls.keySecretRef object KeySecretRef references a secret containing the TLS private key for RPC.
security.tls.keySecretRef.key string required The key of the secret to select from. Must be a valid secret key.
security.tls.keySecretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
security.tls.keySecretRef.optional boolean Specify whether the Secret or its key must be defined
serviceAccountName string ServiceAccountName for Garage pods (shared by both tiers).
storage object validation: initContainers and extraContainers names must be unique across both lists Storage configures the long-lived storage tier. The existing replicas, metadata, and data fields describe the default operator-managed StatefulSet/PVC member group. NodeLocalPools adds independently configured node-local HostPath member sets that may coexist with that group or with ordinary user-managed GarageNodes. Omit for gateway-only edge clusters.
storage.affinity object Affinity for pod scheduling.
storage.affinity.nodeAffinity object Describes node affinity scheduling rules for the pod.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference object required A node selector term, associated with the corresponding weight.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions array of object A list of node selector requirements by node's labels.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].key string required The label key that the selector applies to.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields array of object A list of node selector requirements by node's fields.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].key string required The label key that the selector applies to.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms array of object required Required. A list of node selector terms. The terms are ORed.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions array of object A list of node selector requirements by node's labels.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].key string required The label key that the selector applies to.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields array of object A list of node selector requirements by node's fields.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].key string required The label key that the selector applies to.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.affinity.podAffinity object Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.affinity.podAntiAffinity object Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.capacityReservePercent integer min: 0; max: 50 CapacityReservePercent reserves a percentage of PVC capacity for overhead. Only meaningful when LayoutPolicy is "Auto".
storage.containerSecurityContext object ContainerSecurityContext for the Garage container.
storage.containerSecurityContext.allowPrivilegeEscalation boolean AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by this container. If set, this profile overrides the pod's appArmorProfile. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
storage.containerSecurityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
storage.containerSecurityContext.capabilities object The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.capabilities.add array of string Added capabilities
storage.containerSecurityContext.capabilities.drop array of string Removed capabilities
storage.containerSecurityContext.privileged boolean Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.procMount string procMount denotes the type of proc mount to use for the containers. The default value is Default which uses the container runtime defaults for readonly paths and masked paths. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.readOnlyRootFilesystem boolean Whether this container has a read-only root filesystem. Default is false. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.containerSecurityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.seLinuxOptions object The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
storage.containerSecurityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
storage.containerSecurityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
storage.containerSecurityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
storage.containerSecurityContext.seccompProfile object The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.
storage.containerSecurityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
storage.containerSecurityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
storage.containerSecurityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
storage.containerSecurityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
storage.containerSecurityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
storage.containerSecurityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
storage.containerSecurityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.data object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Data configures object-block storage for the default StatefulSet/PVC group. It may be omitted together with metadata when replicas is 0.
storage.data.accessModes array of string AccessModes for the PVC.
storage.data.annotations map of string Annotations to set on the PVC.
storage.data.dataSourceRef object DataSourceRef is the opt-in restore source for every generated PVC of this volume role. Setting it copies the same same-namespace, non-core group populator onto each Auto ordinal of this role; the populator must map target claim i to source-group member i. A core PVC or single-volume clone is not a safe source. Metadata and data are independent roles: restore identity by setting this on metadata, object blocks by setting it on data. It is immutable after the GarageCluster is created.
storage.data.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.data.dataSourceRef.name string required Name is the name of resource being referenced
storage.data.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.labels map of string Labels to set on the PVC.
storage.data.paths array of object Paths configures multiple data directories for multi-disk setups. Only valid for data volumes — webhook rejects this on metadata volumes.
storage.data.paths[].capacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity of the drive (required unless readOnly).
storage.data.paths[].path string required Path to the data directory.
storage.data.paths[].readOnly boolean ReadOnly marks the directory as a legacy read-only Garage data source for migrations. This controls Garage's block placement; the Kubernetes mount remains writable so Garage can maintain its per-directory marker file.
storage.data.paths[].volume object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Volume configuration for this data path.
storage.data.paths[].volume.accessModes array of string AccessModes for the PVC.
storage.data.paths[].volume.annotations map of string Annotations to set on the PVC.
storage.data.paths[].volume.dataSourceRef object DataSourceRef is the opt-in restore source for this data path's PVC across every Auto ordinal. Same group-populator contract as VolumeConfig.dataSourceRef.
storage.data.paths[].volume.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.paths[].volume.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.data.paths[].volume.dataSourceRef.name string required Name is the name of resource being referenced
storage.data.paths[].volume.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.paths[].volume.labels map of string Labels to set on the PVC.
storage.data.paths[].volume.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
storage.data.paths[].volume.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.data.paths[].volume.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.data.paths[].volume.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.data.paths[].volume.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.data.paths[].volume.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.data.paths[].volume.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume (storage request).
storage.data.paths[].volume.storageClassName string StorageClassName for the PVC.
storage.data.paths[].volume.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type.
storage.data.paths[].volume.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
storage.data.paths[].volume.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
storage.data.paths[].volume.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
storage.data.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.paths[].volume.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
storage.data.paths[].volume.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.data.paths[].volume.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.data.paths[].volume.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
storage.data.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.data.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.data.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.data.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.data.paths[].volume.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.data.paths[].volume.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
storage.data.paths[].volume.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
storage.data.paths[].volume.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
storage.data.paths[].volume.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
storage.data.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
storage.data.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.data.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.data.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.data.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.data.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.data.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume.
storage.data.storageClassName string StorageClassName for the PVC.
storage.data.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type: PersistentVolumeClaim (default) or EmptyDir.
storage.data.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
storage.data.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Arbitrary claim-template dataSource or volumeName settings can clone a metadata node_key or bind multiple Garage identities to one disk. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
storage.data.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
storage.data.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
storage.data.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
storage.data.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
storage.data.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.data.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.data.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
storage.data.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.data.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
storage.data.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.data.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.data.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
storage.data.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.data.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.data.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.data.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.data.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.data.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
storage.data.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
storage.data.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
storage.data.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
storage.dataFsync boolean DataFsync enables fsync for data block writes.
storage.env array of object Env is a list of additional environment variables to set on the Garage container. Garage config-path and RPC/Admin/metrics credential variables are operator-reserved. Typical use: setting GARAGE_ALLOW_WORLD_READABLE_SECRETS or another non-identity Garage startup option.
storage.env[].name string required Name of the environment variable. May consist of any printable ASCII characters except '='.
storage.env[].value string Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".
storage.env[].valueFrom object Source for the environment variable's value. Cannot be used if value is not empty.
storage.env[].valueFrom.configMapKeyRef object Selects a key of a ConfigMap.
storage.env[].valueFrom.configMapKeyRef.key string required The key to select from the ConfigMap's Data field. Keys in the BinaryData field are not currently propagated to container env vars.
storage.env[].valueFrom.configMapKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.env[].valueFrom.configMapKeyRef.optional boolean Specify whether the ConfigMap or its key must be defined
storage.env[].valueFrom.fieldRef object Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels\['<KEY>'\], metadata.annotations\['<KEY>'\], spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
storage.env[].valueFrom.fieldRef.apiVersion string Version of the schema the FieldPath is written in terms of, defaults to "v1".
storage.env[].valueFrom.fieldRef.fieldPath string required Path of the field to select in the specified API version.
storage.env[].valueFrom.fileKeyRef object FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.
storage.env[].valueFrom.fileKeyRef.key string required The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
storage.env[].valueFrom.fileKeyRef.optional boolean default: false Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers. If optional is set to false and the specified key does not exist, an error will be returned during Pod creation.
storage.env[].valueFrom.fileKeyRef.path string required The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.
storage.env[].valueFrom.fileKeyRef.volumeName string required The name of the volume mount containing the env file.
storage.env[].valueFrom.resourceFieldRef object Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
storage.env[].valueFrom.resourceFieldRef.containerName string Container name: required for volumes, optional for env vars
storage.env[].valueFrom.resourceFieldRef.divisor integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Specifies the output format of the exposed resources, defaults to "1"
storage.env[].valueFrom.resourceFieldRef.resource string required Required: resource to select
storage.env[].valueFrom.secretKeyRef object Selects a key of a secret in the pod's namespace
storage.env[].valueFrom.secretKeyRef.key string required The key of the secret to select from. Must be a valid secret key.
storage.env[].valueFrom.secretKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.env[].valueFrom.secretKeyRef.optional boolean Specify whether the Secret or its key must be defined
storage.envFrom array of object EnvFrom is a list of sources to populate environment variables in the Garage container. A source prefix must not be capable of injecting an operator-reserved Garage variable. Sources are evaluated before the per-variable Env list, matching Kubernetes container semantics.
storage.envFrom[].configMapRef object The ConfigMap to select from
storage.envFrom[].configMapRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.envFrom[].configMapRef.optional boolean Specify whether the ConfigMap must be defined
storage.envFrom[].prefix string Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.
storage.envFrom[].secretRef object The Secret to select from
storage.envFrom[].secretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.envFrom[].secretRef.optional boolean Specify whether the Secret must be defined
storage.extraContainers array of object max items: 16; validation: container name is operator-reserved ExtraContainers run beside the Garage container in the same pod and network namespace. They cannot mount operator-owned volumes.
storage.extraContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
storage.extraVolumes array of object max items: 32; validation: volume name is operator-reserved ExtraVolumes are added to the pod. Operator-owned volume names are reserved (config, metadata, data, data-, rpc-secret, admin-token, metrics-token).
storage.extraVolumes[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the volume. It must be unique across extraVolumes, a DNS-1123 label, and not an operator-reserved volume name.
storage.initContainers array of object max items: 16; validation: container name is operator-reserved InitContainers run before the Garage container, after any operator-injected init containers. Entries with restartPolicy: Always are native sidecars (Kubernetes 1.29+ beta, GA in 1.33). Names garage, purge-cluster-layout and the prefix garage-operator- are reserved.
storage.initContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
storage.layoutPolicy string enum: ["Auto", "Manual"] LayoutPolicy overrides the cluster-level spec.layoutPolicy for the STORAGE default StatefulSet/PVC group only. This lets a cluster hand-manage SMB/PVC GarageNodes (Manual) while node-local pools remain operator-managed and while the gateway tier follows the cluster policy. Defaults to spec.layoutPolicy when empty. Auto->Manual is one-way for the default group.
storage.metadata object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Metadata configures Garage node identity + index DB storage for the default StatefulSet/PVC group. It may be omitted together with data when replicas is 0 and only Manual GarageNodes or node-local pools are used.
storage.metadata.accessModes array of string AccessModes for the PVC.
storage.metadata.annotations map of string Annotations to set on the PVC.
storage.metadata.dataSourceRef object DataSourceRef is the opt-in restore source for every generated PVC of this volume role. Setting it copies the same same-namespace, non-core group populator onto each Auto ordinal of this role; the populator must map target claim i to source-group member i. A core PVC or single-volume clone is not a safe source. Metadata and data are independent roles: restore identity by setting this on metadata, object blocks by setting it on data. It is immutable after the GarageCluster is created.
storage.metadata.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.metadata.dataSourceRef.name string required Name is the name of resource being referenced
storage.metadata.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.labels map of string Labels to set on the PVC.
storage.metadata.paths array of object Paths configures multiple data directories for multi-disk setups. Only valid for data volumes — webhook rejects this on metadata volumes.
storage.metadata.paths[].capacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity of the drive (required unless readOnly).
storage.metadata.paths[].path string required Path to the data directory.
storage.metadata.paths[].readOnly boolean ReadOnly marks the directory as a legacy read-only Garage data source for migrations. This controls Garage's block placement; the Kubernetes mount remains writable so Garage can maintain its per-directory marker file.
storage.metadata.paths[].volume object validation: volumeAttributesClassName is only valid for PersistentVolumeClaim volumes Volume configuration for this data path.
storage.metadata.paths[].volume.accessModes array of string AccessModes for the PVC.
storage.metadata.paths[].volume.annotations map of string Annotations to set on the PVC.
storage.metadata.paths[].volume.dataSourceRef object DataSourceRef is the opt-in restore source for this data path's PVC across every Auto ordinal. Same group-populator contract as VolumeConfig.dataSourceRef.
storage.metadata.paths[].volume.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.paths[].volume.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.metadata.paths[].volume.dataSourceRef.name string required Name is the name of resource being referenced
storage.metadata.paths[].volume.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.paths[].volume.labels map of string Labels to set on the PVC.
storage.metadata.paths[].volume.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
storage.metadata.paths[].volume.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.metadata.paths[].volume.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.metadata.paths[].volume.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.metadata.paths[].volume.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.metadata.paths[].volume.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.metadata.paths[].volume.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume (storage request).
storage.metadata.paths[].volume.storageClassName string StorageClassName for the PVC.
storage.metadata.paths[].volume.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type.
storage.metadata.paths[].volume.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
storage.metadata.paths[].volume.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
storage.metadata.paths[].volume.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
storage.metadata.paths[].volume.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.metadata.paths[].volume.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
storage.metadata.paths[].volume.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
storage.metadata.paths[].volume.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
storage.metadata.paths[].volume.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
storage.metadata.selector object Selector matches pre-provisioned PVs for newly created claims. Kubernetes does not dynamically provision a PV when this is set; StorageClassName must also match the target PV.
storage.metadata.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.metadata.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.metadata.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.metadata.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.metadata.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.metadata.size integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Size of the volume.
storage.metadata.storageClassName string StorageClassName for the PVC.
storage.metadata.type string default: "PersistentVolumeClaim"; enum: ["PersistentVolumeClaim", "EmptyDir"] Type specifies the volume type: PersistentVolumeClaim (default) or EmptyDir.
storage.metadata.volumeAttributesClassName string min length: 1; max length: 253; pattern: "^[a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)*$" VolumeAttributesClassName is the name of a cluster-scoped Kubernetes VolumeAttributesClass applied to every PVC generated for this volume role. The class's driver must match the StorageClass provisioner; the operator does not check that or whether the class exists. Valid only for PersistentVolumeClaim volumes. Unlike storageClassName it may be changed while replicas are live: the operator updates bound claims in place, which asks the CSI driver to modify the volume. Requires Kubernetes 1.34+ (or 1.31-1.33 with the VolumeAttributesClass feature enabled) and a driver that supports ModifyVolume. Removing a configured value from a live volume is rejected.
storage.metadata.volumeClaimTemplateSpec object VolumeClaimTemplateSpec is retained for API compatibility but is not supported by operator-managed workloads. Admission rejects new or changed values; an unchanged legacy value is tolerated only so it can be removed. Arbitrary claim-template dataSource or volumeName settings can clone a metadata node_key or bind multiple Garage identities to one disk. Use the explicit PVC fields above, or pre-provision a PVC and reference it from an ordinary GarageNode storage existingClaim. Deprecated: use explicit PVC fields or GarageNode existingClaim.
storage.metadata.volumeClaimTemplateSpec.accessModes array of string accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1
storage.metadata.volumeClaimTemplateSpec.dataSource object dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.
storage.metadata.volumeClaimTemplateSpec.dataSource.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.volumeClaimTemplateSpec.dataSource.kind string required Kind is the type of resource being referenced
storage.metadata.volumeClaimTemplateSpec.dataSource.name string required Name is the name of resource being referenced
storage.metadata.volumeClaimTemplateSpec.dataSourceRef object dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.volumeClaimTemplateSpec.dataSourceRef.apiGroup string APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.
storage.metadata.volumeClaimTemplateSpec.dataSourceRef.kind string required Kind is the type of resource being referenced
storage.metadata.volumeClaimTemplateSpec.dataSourceRef.name string required Name is the name of resource being referenced
storage.metadata.volumeClaimTemplateSpec.dataSourceRef.namespace string Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
storage.metadata.volumeClaimTemplateSpec.resources object resources represents the minimum resources the volume should have. Users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
storage.metadata.volumeClaimTemplateSpec.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.metadata.volumeClaimTemplateSpec.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.metadata.volumeClaimTemplateSpec.selector object selector is a label query over volumes to consider for binding.
storage.metadata.volumeClaimTemplateSpec.selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.metadata.volumeClaimTemplateSpec.selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.metadata.volumeClaimTemplateSpec.selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.metadata.volumeClaimTemplateSpec.storageClassName string storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
storage.metadata.volumeClaimTemplateSpec.volumeAttributesClassName string volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/
storage.metadata.volumeClaimTemplateSpec.volumeMode string volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.
storage.metadata.volumeClaimTemplateSpec.volumeName string volumeName is the binding reference to the PersistentVolume backing this claim.
storage.metadataAutoSnapshotInterval string pattern: "^(\d+(\.\d+)?\s*(ns|us|ms|s|m|h|d|w|M|y)\s*)+$" MetadataAutoSnapshotInterval enables automatic metadata snapshots.
storage.metadataFsync boolean MetadataFsync enables fsync for metadata transactions.
storage.metadataSnapshotsDir string MetadataSnapshotsDir specifies directory for metadata snapshots
storage.nodeLocalPools array of object max items: 32 NodeLocalPools adds named node-local storage member sets. Each entry is currently realized as one operator-managed DaemonSet. One Garage Pod and one generated GarageNode identity run on every Kubernetes Node selected by the entry. Metadata and block data remain tied to that Node's HostPaths. The DaemonSet is an implementation of the node-local contract, not a selectable workload mode. The operator coordinates activation, rollout, Garage layout membership, draining, and retirement. Multiple entries produce multiple DaemonSets; one entry is the normal single-DaemonSet deployment. Entries remain operator-managed even when storage.layoutPolicy is Manual and are independent of the optional default StatefulSet/PVC group. Across all entries, at most 255 Kubernetes Nodes may be selected. Garage's global layout accepts at most 256 positive-capacity roles across node-local, PVC, SMB, manual, external, and federated members; those other members consume the same headroom and can make activation fail below the selector ceiling. At 255 live roles, a new node-local activation is eligible only for a locally proven retiring generated member. This is not a reservation against independently operated federated sites.
storage.nodeLocalPools[].capacity integer or string required; pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity is the uniform effective capacity advertised to the Garage layout for every generated role in this pool; it is not aggregate pool capacity. HostPath volumes have no PVC request from which to derive it. For multi-disk pools this may not exceed the sum of writable dataPaths capacities.
storage.nodeLocalPools[].data object Data is the single node-local block-data directory, mounted at /data/data. Mutually exclusive with dataPaths.
storage.nodeLocalPools[].data.hostPath string required HostPath is an absolute directory on each selected Kubernetes Node.
storage.nodeLocalPools[].data.hostPathType string default: "Directory"; enum: ["Directory", "DirectoryOrCreate"] HostPathType controls whether Kubernetes creates a missing directory. Directory (the production default) also requires a pre-provisioned .garage-volume-id file inside HostPath. The pool workload mounts that marker separately as HostPath type File, so an unmounted but still-present root-filesystem directory cannot silently receive Garage data. DirectoryOrCreate skips this marker guarantee and is intended for tests or explicitly ephemeral provisioning.
storage.nodeLocalPools[].dataPaths array of object max items: 32 DataPaths configures multiple node-local Garage data directories. Mutually exclusive with data. Every writable entry needs a capacity; read-only entries are retained for Garage's staged disk migration flow.
storage.nodeLocalPools[].dataPaths[].capacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity is the per-directory Garage capacity. Required unless readOnly.
storage.nodeLocalPools[].dataPaths[].hostPath string required HostPath is the absolute directory on each selected Kubernetes Node.
storage.nodeLocalPools[].dataPaths[].hostPathType string default: "Directory"; enum: ["Directory", "DirectoryOrCreate"] HostPathType controls whether Kubernetes creates a missing directory. Directory also requires a pre-provisioned .garage-volume-id file inside HostPath; see HostPathVolumeConfig. DirectoryOrCreate skips that production mount check and is intended for tests or explicitly ephemeral provisioning.
storage.nodeLocalPools[].dataPaths[].path string required Path is the absolute in-container mount path used in garage.toml.
storage.nodeLocalPools[].dataPaths[].readOnly boolean ReadOnly removes this path from new block placement while keeping it mounted for Garage's staged disk migration.
storage.nodeLocalPools[].metadata object required Metadata is the node-local directory that stores Garage's durable node_key and metadata database. Its hostPath is immutable after pool creation because changing it changes every selected node's identity.
storage.nodeLocalPools[].metadata.hostPath string required HostPath is an absolute directory on each selected Kubernetes Node.
storage.nodeLocalPools[].metadata.hostPathType string default: "Directory"; enum: ["Directory", "DirectoryOrCreate"] HostPathType controls whether Kubernetes creates a missing directory. Directory (the production default) also requires a pre-provisioned .garage-volume-id file inside HostPath. The pool workload mounts that marker separately as HostPath type File, so an unmounted but still-present root-filesystem directory cannot silently receive Garage data. DirectoryOrCreate skips this marker guarantee and is intended for tests or explicitly ephemeral provisioning.
storage.nodeLocalPools[].name string required; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name identifies this operator-managed membership set and is used in child resource names, labels, and Garage layout tags. It is not a Garage identity, replication group, quorum, zone, or failure domain.
storage.nodeLocalPools[].network object Network configures identity-specific connectivity for this pool.
storage.nodeLocalPools[].network.rpcPublicAddrTemplate string RPCPublicAddrTemplate is the directly routable RPC address for each node identity. {nodeName} is replaced with the Kubernetes Node name and the result is stored in the Garage layout's rpc-address tag. Example: "{nodeName}.storage.example.net:3901"
storage.nodeLocalPools[].podTemplate object validation: initContainers and extraContainers names must be unique across both lists PodTemplate carries pod settings that do not change membership. Required node affinity is intentionally unavailable: selector is the only durable membership boundary.
storage.nodeLocalPools[].podTemplate.affinity object Affinity for pod scheduling. Required node affinity is rejected because it would create a second, hidden membership selector.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity object Describes node affinity scheduling rules for the pod.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference object required A node selector term, associated with the corresponding weight.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions array of object A list of node selector requirements by node's labels.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].key string required The label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields array of object A list of node selector requirements by node's fields.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].key string required The label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms array of object required Required. A list of node selector terms. The terms are ORed.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions array of object A list of node selector requirements by node's labels.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].key string required The label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchExpressions[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields array of object A list of node selector requirements by node's fields.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].key string required The label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].operator string required Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
storage.nodeLocalPools[].podTemplate.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[].matchFields[].values array of string An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity object Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.nodeLocalPools[].podTemplate.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity object Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution array of object The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm object required Required. A pod affinity term, associated with the corresponding weight.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].podAffinityTerm.topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight integer required; format: "int32" weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution array of object If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector object A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].mismatchLabelKeys array of string MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector object A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaceSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].namespaces array of string namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
storage.nodeLocalPools[].podTemplate.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[].topologyKey string required This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
storage.nodeLocalPools[].podTemplate.containerSecurityContext object ContainerSecurityContext for the Garage container.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.allowPrivilegeEscalation boolean AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by this container. If set, this profile overrides the pod's appArmorProfile. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
storage.nodeLocalPools[].podTemplate.containerSecurityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.capabilities object The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.capabilities.add array of string Added capabilities
storage.nodeLocalPools[].podTemplate.containerSecurityContext.capabilities.drop array of string Removed capabilities
storage.nodeLocalPools[].podTemplate.containerSecurityContext.privileged boolean Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.procMount string procMount denotes the type of proc mount to use for the containers. The default value is Default which uses the container runtime defaults for readonly paths and masked paths. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.readOnlyRootFilesystem boolean Whether this container has a read-only root filesystem. Default is false. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seLinuxOptions object The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seccompProfile object The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
storage.nodeLocalPools[].podTemplate.containerSecurityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.nodeLocalPools[].podTemplate.env array of object max items: 256; validation: GARAGE_CONFIG_FILE is operator-reserved Env contains additional environment variables for the Garage container. Garage config-path and RPC/Admin/metrics credential variables are operator-reserved because storage-drain safety and mesh identity rely on the rendered config and pinned immutable Secrets.
storage.nodeLocalPools[].podTemplate.env[].name string required Name of the environment variable. May consist of any printable ASCII characters except '='.
storage.nodeLocalPools[].podTemplate.env[].value string Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".
storage.nodeLocalPools[].podTemplate.env[].valueFrom object Source for the environment variable's value. Cannot be used if value is not empty.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.configMapKeyRef object Selects a key of a ConfigMap.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.configMapKeyRef.key string required The key to select from the ConfigMap's Data field. Keys in the BinaryData field are not currently propagated to container env vars.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.configMapKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.nodeLocalPools[].podTemplate.env[].valueFrom.configMapKeyRef.optional boolean Specify whether the ConfigMap or its key must be defined
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fieldRef object Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels\['<KEY>'\], metadata.annotations\['<KEY>'\], spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fieldRef.apiVersion string Version of the schema the FieldPath is written in terms of, defaults to "v1".
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fieldRef.fieldPath string required Path of the field to select in the specified API version.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fileKeyRef object FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fileKeyRef.key string required The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fileKeyRef.optional boolean default: false Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers. If optional is set to false and the specified key does not exist, an error will be returned during Pod creation.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fileKeyRef.path string required The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.fileKeyRef.volumeName string required The name of the volume mount containing the env file.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.resourceFieldRef object Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.resourceFieldRef.containerName string Container name: required for volumes, optional for env vars
storage.nodeLocalPools[].podTemplate.env[].valueFrom.resourceFieldRef.divisor integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Specifies the output format of the exposed resources, defaults to "1"
storage.nodeLocalPools[].podTemplate.env[].valueFrom.resourceFieldRef.resource string required Required: resource to select
storage.nodeLocalPools[].podTemplate.env[].valueFrom.secretKeyRef object Selects a key of a secret in the pod's namespace
storage.nodeLocalPools[].podTemplate.env[].valueFrom.secretKeyRef.key string required The key of the secret to select from. Must be a valid secret key.
storage.nodeLocalPools[].podTemplate.env[].valueFrom.secretKeyRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.nodeLocalPools[].podTemplate.env[].valueFrom.secretKeyRef.optional boolean Specify whether the Secret or its key must be defined
storage.nodeLocalPools[].podTemplate.envFrom array of object EnvFrom contains sources used to populate Garage container environment variables. A source prefix must not be capable of injecting an operator-reserved Garage variable.
storage.nodeLocalPools[].podTemplate.envFrom[].configMapRef object The ConfigMap to select from
storage.nodeLocalPools[].podTemplate.envFrom[].configMapRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.nodeLocalPools[].podTemplate.envFrom[].configMapRef.optional boolean Specify whether the ConfigMap must be defined
storage.nodeLocalPools[].podTemplate.envFrom[].prefix string Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.
storage.nodeLocalPools[].podTemplate.envFrom[].secretRef object The Secret to select from
storage.nodeLocalPools[].podTemplate.envFrom[].secretRef.name string default: "" Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
storage.nodeLocalPools[].podTemplate.envFrom[].secretRef.optional boolean Specify whether the Secret must be defined
storage.nodeLocalPools[].podTemplate.extraContainers array of object max items: 16; validation: container name is operator-reserved ExtraContainers run beside the Garage container in the same pod and network namespace. They cannot mount operator-owned volumes.
storage.nodeLocalPools[].podTemplate.extraContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
storage.nodeLocalPools[].podTemplate.extraVolumes array of object max items: 32; validation: volume name is operator-reserved ExtraVolumes are added to the pod. Operator-owned volume names are reserved (config, metadata, data, data-, rpc-secret, admin-token, metrics-token).
storage.nodeLocalPools[].podTemplate.extraVolumes[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the volume. It must be unique across extraVolumes, a DNS-1123 label, and not an operator-reserved volume name.
storage.nodeLocalPools[].podTemplate.initContainers array of object max items: 16; validation: container name is operator-reserved InitContainers run before the Garage container, after any operator-injected init containers. Entries with restartPolicy: Always are native sidecars (Kubernetes 1.29+ beta, GA in 1.33). Names garage, purge-cluster-layout and the prefix garage-operator- are reserved.
storage.nodeLocalPools[].podTemplate.initContainers[].name string required; min length: 1; max length: 63; pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" Name of the container. It must be unique across initContainers and extraContainers, a DNS-1123 label, and not an operator-reserved name.
storage.nodeLocalPools[].podTemplate.podAnnotations map of string PodAnnotations to add to pods.
storage.nodeLocalPools[].podTemplate.podLabels map of string PodLabels to add to pods.
storage.nodeLocalPools[].podTemplate.priorityClassName string PriorityClassName for pods.
storage.nodeLocalPools[].podTemplate.resources object Resources specifies compute resources for the pod.
storage.nodeLocalPools[].podTemplate.resources.claims array of object Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.
storage.nodeLocalPools[].podTemplate.resources.claims[].name string required Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
storage.nodeLocalPools[].podTemplate.resources.claims[].request string Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.
storage.nodeLocalPools[].podTemplate.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.nodeLocalPools[].podTemplate.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.nodeLocalPools[].podTemplate.securityContext object SecurityContext for the pod.
storage.nodeLocalPools[].podTemplate.securityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
storage.nodeLocalPools[].podTemplate.securityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
storage.nodeLocalPools[].podTemplate.securityContext.fsGroup integer format: "int64" A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- If unset, the Kubelet will not modify the ownership and permissions of any volume. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.fsGroupChangePolicy string fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.nodeLocalPools[].podTemplate.securityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxChangePolicy string seLinuxChangePolicy defines how the container's SELinux label is applied to all volumes used by the Pod. It has no effect on nodes that do not support SELinux or to volumes does not support SELinux. Valid values are "MountOption" and "Recursive". "Recursive" means relabeling of all files on all Pod volumes by the container runtime. This may be slow for large volumes, but allows mixing privileged and unprivileged Pods sharing the same volume on the same node. "MountOption" mounts all eligible Pod volumes with -o context mount option. This requires all Pods that share the same volume to use the same SELinux label. It is not possible to share the same volume among privileged and unprivileged Pods. Eligible volumes are in-tree FibreChannel and iSCSI volumes, and all CSI volumes whose CSI driver announces SELinux support by setting spec.seLinuxMount: true in their CSIDriver instance. Other volumes are always re-labelled recursively. If not specified, "MountOption" is used. This field affects only Pods that have SELinux label set, either in PodSecurityContext or in SecurityContext of all containers. All Pods that use the same volume should use the same seLinuxChangePolicy, otherwise some pods can get stuck in ContainerCreating state. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxOptions object The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
storage.nodeLocalPools[].podTemplate.securityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
storage.nodeLocalPools[].podTemplate.securityContext.seccompProfile object The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
storage.nodeLocalPools[].podTemplate.securityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
storage.nodeLocalPools[].podTemplate.securityContext.supplementalGroups array of integer A list of groups applied to the first process run in each container, in addition to the container's primary GID and fsGroup (if specified). If the SupplementalGroupsPolicy feature is enabled, the supplementalGroupsPolicy field determines whether these are in addition to or instead of any group memberships defined in the container image. If unspecified, no additional groups are added, though group memberships defined in the container image may still be used, depending on the supplementalGroupsPolicy field. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.supplementalGroupsPolicy string Defines how supplemental groups of the first container processes are calculated. Valid values are "Merge" and "Strict". If not specified, "Merge" is used. (Alpha) Using the field requires the SupplementalGroupsPolicy feature gate to be enabled and the container runtime must implement support for this feature. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.sysctls array of object Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. Note that this field cannot be set when spec.os.name is windows.
storage.nodeLocalPools[].podTemplate.securityContext.sysctls[].name string required Name of a property to set
storage.nodeLocalPools[].podTemplate.securityContext.sysctls[].value string required Value of a property to set
storage.nodeLocalPools[].podTemplate.securityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
storage.nodeLocalPools[].podTemplate.securityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
storage.nodeLocalPools[].podTemplate.securityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
storage.nodeLocalPools[].podTemplate.securityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
storage.nodeLocalPools[].podTemplate.securityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.nodeLocalPools[].podTemplate.tolerations array of object Tolerations for pod scheduling.
storage.nodeLocalPools[].podTemplate.tolerations[].effect string Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
storage.nodeLocalPools[].podTemplate.tolerations[].key string Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.
storage.nodeLocalPools[].podTemplate.tolerations[].operator string Operator represents a key's relationship to the value. Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
storage.nodeLocalPools[].podTemplate.tolerations[].tolerationSeconds integer format: "int64" TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.
storage.nodeLocalPools[].podTemplate.tolerations[].value string Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints array of object TopologySpreadConstraints for pod scheduling.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector object LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].maxSkew integer required; format: "int32" MaxSkew describes the degree to which pods may be unevenly distributed. When whenUnsatisfiable=DoNotSchedule, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When whenUnsatisfiable=ScheduleAnyway, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].minDomains integer format: "int32" MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].nodeAffinityPolicy string NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].nodeTaintsPolicy string NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].topologyKey string required TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
storage.nodeLocalPools[].podTemplate.topologySpreadConstraints[].whenUnsatisfiable string required WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it more imbalanced. It's a required field.
storage.nodeLocalPools[].selector object required Selector chooses the Kubernetes Nodes that own a persistent Garage identity in this pool. It is membership, not a pod scheduling hint. A Node may match at most one node-local pool in a GarageCluster.
storage.nodeLocalPools[].selector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.nodeLocalPools[].selector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.nodeLocalPools[].selector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.nodeLocalPools[].selector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.nodeLocalPools[].selector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.nodeSelector map of string NodeSelector for pod scheduling.
storage.podAnnotations map of string PodAnnotations to add to pods.
storage.podDisruptionBudget object PodDisruptionBudget configures one PDB covering the storage tier, including the default StatefulSet and all node-local pools.
storage.podDisruptionBudget.enabled boolean default: true Enabled enables PodDisruptionBudget creation
storage.podDisruptionBudget.maxUnavailable integer or string MaxUnavailable specifies the maximum number of pods that can be unavailable.
storage.podDisruptionBudget.minAvailable integer or string MinAvailable specifies the minimum number of pods that must be available.
storage.podLabels map of string PodLabels to add to pods.
storage.priorityClassName string PriorityClassName for pods.
storage.pvcRetentionPolicy object PVCRetentionPolicy controls PVC lifecycle when the StatefulSet is deleted or scaled down.
storage.pvcRetentionPolicy.whenDeleted string default: "Retain"; enum: ["Retain", "Delete"] WhenDeleted specifies what happens to PVCs when the StatefulSet is deleted.
storage.pvcRetentionPolicy.whenScaled string default: "Retain"; enum: ["Retain", "Delete"] WhenScaled specifies what happens to PVCs when the StatefulSet is scaled down.
storage.replicas integer required; default: 3; format: "int32"; min: 0 Replicas controls only the default operator-managed StatefulSet/PVC group. Set it to 0 to disable that group. Ordinary Manual GarageNodes and node-local-pool members remain independently declared; pool cardinality follows each entry's selector.
storage.resources object Resources specifies compute resources for the pod.
storage.resources.claims array of object Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers.
storage.resources.claims[].name string required Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
storage.resources.claims[].request string Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.
storage.resources.limits map of integer or string Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.resources.requests map of integer or string Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
storage.rpcPublicAddr string RPCPublicAddr is the externally-routable rpc_public_addr advertised by storage pods so peers in other regions can dial them by hostname. With replicas > 1 a single shared address only ever routes to one pod (e.g. behind a Tailscale VIP), leaving the others unreachable cross-region. Use an {ordinal} placeholder — the operator substitutes each pod's ordinal (0, 1, ...), symmetric with the gateway tier's rpcPublicAddr and with remoteClusters[].storageRpcEndpointTemplate on the consuming side — so every pod advertises its own address. An address without the placeholder is rendered verbatim (fine for a single-replica storage tier). When a per-node publicEndpoint (LoadBalancer perNode) is in effect, that address wins and this field is ignored. Example: "us-east-storage-{ordinal}.example.ts.net:3901"
storage.securityContext object SecurityContext for the pod.
storage.securityContext.appArmorProfile object appArmorProfile is the AppArmor options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.appArmorProfile.localhostProfile string localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost".
storage.securityContext.appArmorProfile.type string required type indicates which kind of AppArmor profile will be applied. Valid options are: Localhost - a profile pre-loaded on the node. RuntimeDefault - the container runtime's default profile. Unconfined - no AppArmor enforcement.
storage.securityContext.fsGroup integer format: "int64" A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- If unset, the Kubelet will not modify the ownership and permissions of any volume. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.fsGroupChangePolicy string fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.runAsGroup integer format: "int64" The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.runAsNonRoot boolean Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.securityContext.runAsUser integer format: "int64" The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.seLinuxChangePolicy string seLinuxChangePolicy defines how the container's SELinux label is applied to all volumes used by the Pod. It has no effect on nodes that do not support SELinux or to volumes does not support SELinux. Valid values are "MountOption" and "Recursive". "Recursive" means relabeling of all files on all Pod volumes by the container runtime. This may be slow for large volumes, but allows mixing privileged and unprivileged Pods sharing the same volume on the same node. "MountOption" mounts all eligible Pod volumes with -o context mount option. This requires all Pods that share the same volume to use the same SELinux label. It is not possible to share the same volume among privileged and unprivileged Pods. Eligible volumes are in-tree FibreChannel and iSCSI volumes, and all CSI volumes whose CSI driver announces SELinux support by setting spec.seLinuxMount: true in their CSIDriver instance. Other volumes are always re-labelled recursively. If not specified, "MountOption" is used. This field affects only Pods that have SELinux label set, either in PodSecurityContext or in SecurityContext of all containers. All Pods that use the same volume should use the same seLinuxChangePolicy, otherwise some pods can get stuck in ContainerCreating state. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.seLinuxOptions object The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.seLinuxOptions.level string Level is SELinux level label that applies to the container.
storage.securityContext.seLinuxOptions.role string Role is a SELinux role label that applies to the container.
storage.securityContext.seLinuxOptions.type string Type is a SELinux type label that applies to the container.
storage.securityContext.seLinuxOptions.user string User is a SELinux user label that applies to the container.
storage.securityContext.seccompProfile object The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.seccompProfile.localhostProfile string localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is "Localhost". Must NOT be set for any other type.
storage.securityContext.seccompProfile.type string required type indicates which kind of seccomp profile will be applied. Valid options are: Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.
storage.securityContext.supplementalGroups array of integer A list of groups applied to the first process run in each container, in addition to the container's primary GID and fsGroup (if specified). If the SupplementalGroupsPolicy feature is enabled, the supplementalGroupsPolicy field determines whether these are in addition to or instead of any group memberships defined in the container image. If unspecified, no additional groups are added, though group memberships defined in the container image may still be used, depending on the supplementalGroupsPolicy field. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.supplementalGroupsPolicy string Defines how supplemental groups of the first container processes are calculated. Valid values are "Merge" and "Strict". If not specified, "Merge" is used. (Alpha) Using the field requires the SupplementalGroupsPolicy feature gate to be enabled and the container runtime must implement support for this feature. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.sysctls array of object Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. Note that this field cannot be set when spec.os.name is windows.
storage.securityContext.sysctls[].name string required Name of a property to set
storage.securityContext.sysctls[].value string required Value of a property to set
storage.securityContext.windowsOptions object The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. Note that this field cannot be set when spec.os.name is linux.
storage.securityContext.windowsOptions.gmsaCredentialSpec string GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.
storage.securityContext.windowsOptions.gmsaCredentialSpecName string GMSACredentialSpecName is the name of the GMSA credential spec to use.
storage.securityContext.windowsOptions.hostProcess boolean HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.
storage.securityContext.windowsOptions.runAsUserName string The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.
storage.tolerations array of object Tolerations for pod scheduling.
storage.tolerations[].effect string Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
storage.tolerations[].key string Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.
storage.tolerations[].operator string Operator represents a key's relationship to the value. Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
storage.tolerations[].tolerationSeconds integer format: "int64" TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.
storage.tolerations[].value string Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.
storage.topologySpreadConstraints array of object TopologySpreadConstraints for pod scheduling.
storage.topologySpreadConstraints[].labelSelector object LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
storage.topologySpreadConstraints[].labelSelector.matchExpressions array of object matchExpressions is a list of label selector requirements. The requirements are ANDed.
storage.topologySpreadConstraints[].labelSelector.matchExpressions[].key string required key is the label key that the selector applies to.
storage.topologySpreadConstraints[].labelSelector.matchExpressions[].operator string required operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
storage.topologySpreadConstraints[].labelSelector.matchExpressions[].values array of string values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
storage.topologySpreadConstraints[].labelSelector.matchLabels map of string matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
storage.topologySpreadConstraints[].matchLabelKeys array of string MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).
storage.topologySpreadConstraints[].maxSkew integer required; format: "int32" MaxSkew describes the degree to which pods may be unevenly distributed. When whenUnsatisfiable=DoNotSchedule, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When whenUnsatisfiable=ScheduleAnyway, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.
storage.topologySpreadConstraints[].minDomains integer format: "int32" MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew.
storage.topologySpreadConstraints[].nodeAffinityPolicy string NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy.
storage.topologySpreadConstraints[].nodeTaintsPolicy string NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy.
storage.topologySpreadConstraints[].topologyKey string required TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
storage.topologySpreadConstraints[].whenUnsatisfiable string required WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it more imbalanced. It's a required field.
webApi object WebAPI configures the static website hosting endpoint. Enabled by default with rootDomain "...svc". Set webApi.enabled: false to turn off.
webApi.addHostToMetrics boolean AddHostToMetrics adds the domain name to metrics labels for per-domain tracking.
webApi.bindAddress string BindAddress is a custom wildcard TCP bind address for the Web API.
webApi.bindPort integer default: 3902; format: "int32"; min: 1; max: 65535 BindPort is the port to bind for web serving.
webApi.enabled boolean Enabled controls whether the web endpoint is active. Defaults to true.
webApi.rootDomain string RootDomain is the root domain suffix for bucket website access.
webApi.scheme string default: "http"; enum: ["http", "https"] Scheme is the URL scheme used when publishing bucket website URLs. Set to https when TLS is terminated in front of the Garage Web API. Defaults to http.
workers object Workers configures Garage background worker behavior.
workers.resyncTranquility integer format: "int32"; min: 0 ResyncTranquility controls how aggressively the block resync worker runs.
workers.resyncWorkerCount integer format: "int32"; min: 1; max: 8 ResyncWorkerCount sets the number of parallel block resync worker goroutines.
workers.scrubTranquility integer format: "int32"; min: 0 ScrubTranquility controls how aggressively the block integrity scrub runs.
zone string Zone is the static Garage layout zone used by members of this cluster and the fallback before a ZoneFrom Pod is scheduled or when its readable Kubernetes Node does not carry the configured label. When ZoneFrom is configured, one workload-owning cluster may contain roles in multiple actual Garage failure-domain zones.
zoneFrom object ZoneFrom derives each storage node's layout zone from a label on the Kubernetes Node its pod is scheduled to, instead of using the single cluster-wide Zone above. This lets one cluster express failure domains internally (racks, power circuits, switches) so replication.zoneRedundancy has something to act on without splitting into a federation. Applies to operator-managed storage nodes only, including both default StatefulSet nodes and node-local-pool nodes. Zone remains the fallback when the label is missing or the pod is not scheduled yet. If the operator cannot read the required Kubernetes Node, reconciliation fails closed; it does not silently substitute Zone. Cluster-scoped installation is required.
zoneFrom.nodeLabel string required; min length: 1; max length: 316 NodeLabel is the label key on the Kubernetes Node whose value becomes the Garage layout zone. Examples: "topology.kubernetes.io/zone" for cloud AZs, "kubernetes.io/hostname" for per-node failure domains, or a custom label such as "example.com/rack" for physical racks or power circuits.

Cross-field validation

  • at least one of spec.storage, spec.gateway, or spec.connectTo must be set: has(self.storage) || has(self.gateway) || has(self.connectTo)

  • spec.gateway requires either spec.storage (unified cluster) or spec.connectTo (edge gateway): !has(self.gateway) || has(self.storage) || has(self.connectTo)

  • layoutManagement.siteRole: Follower requires at least one remoteClusters entry (a Follower with nothing to follow is a cluster nobody can assign roles to): !has(self.layoutManagement) || !has(self.layoutManagement.siteRole) || self.layoutManagement.siteRole != 'Follower' || (has(self.remoteClusters) && size(self.remoteClusters) > 0)

  • layoutManagement.siteRole: Follower is not supported with connectTo; edge gateways and management handles act on their layout owner: !has(self.layoutManagement) || !has(self.layoutManagement.siteRole) || self.layoutManagement.siteRole != 'Follower' || !has(self.connectTo)

Status

GarageClusterStatus defines the observed state of GarageCluster.

Field path Type Constraints Description
activeRepairs array of object ActiveRepairs contains currently running repair operations. Deprecated: never populated by the operator. It will be removed in the next API version.
activeRepairs[].nodeId string NodeID is the node running this repair.
activeRepairs[].progress string Progress is a human-readable progress description.
activeRepairs[].startedAt string format: "date-time" StartedAt is when the repair started.
activeRepairs[].type string Type is the repair operation type (Tables, Blocks, Scrub, Rebalance, etc.)
autoModePvcHandoffs array of object AutoModePVCHandoffs are controller-owned, exact-UID authorizations for retained Auto-mode claims whose GarageNode slot was scaled down and later recreated. Entries are removed after the replacement binds the exact PVC.
autoModePvcHandoffs[].previousGarageNodeUid string required PreviousGarageNodeUID is the exact deleted GarageNode incarnation that reserved the claim.
autoModePvcHandoffs[].pvcName string required PVCName and PVCUID identify the exact retained claim incarnation.
autoModePvcHandoffs[].pvcUid string required
autoModePvcHandoffs[].replacementGarageNodeUid string ReplacementGarageNodeUID is the only new GarageNode incarnation allowed to consume this handoff.
autoModePvcHandoffs[].replacementReservationHash string ReplacementReservationHash is a one-way commitment to the nonce placed on the controller-created replacement GarageNode. It closes the crash gap between Create and recording the replacement object's API-server UID.
autoModePvcHandoffs[].slotName string required SlotName is the stable Auto-mode slot (for example, cluster-gateway-1).
blockErrorDetails object BlockErrorDetails provides detailed information about block errors.
blockErrorDetails.count integer format: "int32" Count is the total number of blocks with errors.
blockErrorDetails.lastErrorAt string format: "date-time" LastErrorAt is when the most recent block error occurred.
blockErrorDetails.topErrors array of object TopErrors contains details about the most problematic blocks.
blockErrorDetails.topErrors[].blockHash string BlockHash is the hash of the affected block.
blockErrorDetails.topErrors[].errorCount integer format: "int32" ErrorCount is the number of times this block failed to sync.
blockErrorDetails.topErrors[].lastAttempt string format: "date-time" LastAttempt is when the last sync attempt occurred.
blockErrorDetails.topErrors[].lastError string LastError is the most recent error message for this block.
blockErrorDetails.topErrors[].nextRetry string format: "date-time" NextRetry is when the next sync retry is scheduled.
blockErrors integer format: "int32" BlockErrors is the count of blocks with sync errors across all nodes. Absent means not observed (Admin API unreachable, or a node that can hold blocks did not answer; silent capacityless gateways are ignored). 0 means observed with no errors.
buildInfo object BuildInfo contains Garage build information.
buildInfo.features array of string Features lists enabled Cargo features.
buildInfo.rustVersion string RustVersion is the Rust compiler version used to build Garage.
buildInfo.version string Version is the Garage version string.
clusterId string ClusterID is the unique identifier of the Garage cluster.
conditions array of object Conditions represent the current state of the cluster.
conditions[].lastTransitionTime string required; format: "date-time" lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
conditions[].message string required; max length: 32768 message is a human readable message indicating details about the transition. This may be an empty string.
conditions[].observedGeneration integer format: "int64"; min: 0 observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.
conditions[].reason string required; min length: 1; max length: 1024; pattern: "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$" reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.
conditions[].status string required; enum: ["True", "False", "Unknown"] status of the condition, one of True, False, Unknown.
conditions[].type string required; max length: 316; pattern: "^([a-z0-9]([-a-z0-9][a-z0-9])?(\.[a-z0-9]([-a-z0-9][a-z0-9])?)/)?(([A-Za-z0-9][-A-Za-z0-9_.])?[A-Za-z0-9])$" type of condition in CamelCase or in foo.example.com/CamelCase.
drainingNodes integer DrainingNodes is the count of nodes that are draining data from an older layout version.
endpoints object Endpoints contains service endpoints.
endpoints.admin string Admin is the admin API endpoint.
endpoints.k2v string K2V is the K2V API endpoint.
endpoints.metrics string Metrics is the Prometheus metrics endpoint.
endpoints.rpc string RPC is the internal RPC endpoint.
endpoints.s3 string S3 is the S3 API endpoint.
endpoints.web string Web is the web hosting endpoint.
factorMigration object FactorMigration tracks an in-flight coordinated replication-factor migration (the garage.rajsingh.info/purge-cluster-layout operation). Nil when no migration has run.
factorMigration.completedAt string format: "date-time" CompletedAt is when the migration finished (Completed or Failed).
factorMigration.force boolean Force records whether the trigger carried the ,force flag (overriding the dangerous-mode / pending-tombstone guards). Captured at start because the annotation is consumed immediately.
factorMigration.fromFactor integer FromFactor is the replication factor before the migration.
factorMigration.message string Message is a human-readable description of the current phase or failure.
factorMigration.phase string enum: ["Validating", "ScalingDown", "Purging", "Verifying", "RebuildingLayout", "Converging", "Completed", "Failed"] Phase is the current migration phase.
factorMigration.phaseStartedAt string format: "date-time" PhaseStartedAt is when the current Phase was entered. It is reset on every phase transition and bounds each wait phase independently of the overall migration duration, so a single phase that hangs (e.g. a node whose status.nodeId never repopulates after restart) trips the stuck guard rather than the whole migration sharing one global deadline.
factorMigration.purgeId string PurgeID uniquely identifies this migration; it is the marker-file suffix the per-node init container uses so the on-disk cluster_layout is deleted exactly once even across extra restarts.
factorMigration.startedAt string format: "date-time" StartedAt is when the migration began.
factorMigration.toFactor integer ToFactor is the target replication factor.
gatewayNodesNotInLayout array of string GatewayNodesNotInLayout lists operator-owned gateway GarageNodes that report status.inLayout == false — they have lost the capacity:nil layout role that keeps S3 sig-auth data replicated locally (#209), so signed requests can fail with "No such key". Drives the GatewayLayoutDegraded condition. Empty when every gateway node holds its role.
gatewayReadyReplicas integer format: "int32" GatewayReadyReplicas is the number of ready gateway-tier pods.
gatewayReplicas integer format: "int32" GatewayReplicas is the desired gateway-tier replica count.
health object Health contains cluster health information.
health.available boolean Available indicates if quorum is available.
health.connectedNodes integer ConnectedNodes is the number of currently connected nodes.
health.healthy boolean Healthy indicates if all nodes are connected.
health.knownNodes integer KnownNodes is the number of nodes seen in cluster.
health.partitions integer Partitions is the total partitions in layout.
health.partitionsAllOk integer PartitionsAllOK is partitions with all nodes connected.
health.partitionsQuorum integer PartitionsQuorum is partitions with quorum connectivity.
health.status string Status is the overall cluster status.
health.storageNodes integer StorageNodes is the number of storage nodes in layout.
health.storageNodesOk integer StorageNodesOK is the number of connected storage nodes.
lastOperation object LastOperation records the result of the most recently triggered operational annotation.
lastOperation.error string Error contains the error message when Succeeded is false.
lastOperation.succeeded boolean Succeeded indicates the operation completed without error.
lastOperation.triggeredAt string format: "date-time" TriggeredAt is when the operation was triggered.
lastOperation.type string Type is the operation type.
layoutDiagnosis string LayoutDiagnosis is a one-line, human-readable summary of the most severe active health condition (quorum at risk, remote clusters stale, federation misconfigured). Empty when the cluster is healthy. Surfaced as a printcolumn so kubectl get gc shows the actionable problem at a glance.
layoutHistory object LayoutHistory contains layout version history.
layoutHistory.currentVersion integer format: "int64" CurrentVersion is the current layout version.
layoutHistory.minAck integer format: "int64" MinAck is the minimum acknowledged layout version by all nodes.
layoutHistory.versions array of object max items: 64 Versions contains at most 64 current, draining, and recent historical layout versions for diagnosis. Controller safety decisions read Garage's complete live layout history instead of relying on this bounded projection.
layoutHistory.versions[].gatewayNodes integer GatewayNodes is the number of gateway nodes in this version.
layoutHistory.versions[].status string Status is the version status (Current, Draining, Historical).
layoutHistory.versions[].storageNodes integer StorageNodes is the number of storage nodes in this version.
layoutHistory.versions[].version integer format: "int64" Version is the layout version number.
layoutPreview object LayoutPreview shows what would change if staged layout is applied.
layoutPreview.dataTransferEstimate string DataTransferEstimate is a human-readable estimate of data movement.
layoutPreview.nodesAdded array of string NodesAdded shows node IDs that would be added to the layout.
layoutPreview.nodesModified array of string NodesModified shows node IDs with changed configuration.
layoutPreview.nodesRemoved array of string NodesRemoved shows node IDs that would be removed from the layout.
layoutPreview.partitionTransfers integer format: "int32" PartitionTransfers is the estimated number of partition transfers.
layoutPreview.zonesAffected array of string ZonesAffected shows which zones would be affected by the changes.
layoutVersion integer format: "int64" LayoutVersion is the current layout version.
layoutWriter object LayoutWriter reports the layout role the controller is currently enforcing for this site. Nil until the controller first records it.
layoutWriter.role string required; enum: ["Writer", "Follower"] Role is the role the controller is currently enforcing.
lifecycleStatus object LifecycleStatus contains the status of bucket lifecycle operations. Deprecated: never populated by the operator. It will be removed in the next API version.
lifecycleStatus.lastCompleted string format: "date-time" LastCompleted is when the last lifecycle worker run completed.
nodes array of object Nodes contains status information for each node. Deprecated: never populated by the operator. It will be removed in the next API version.
nodes[].capacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" Capacity is the storage capacity of the node.
nodes[].connected boolean Connected indicates if the node is connected to the cluster.
nodes[].dataDiskAvailable integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" DataDiskAvailable is the available space on data disk.
nodes[].dataDiskTotal integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" DataDiskTotal is the total space on data disk.
nodes[].gateway boolean Gateway indicates if the node is gateway-only.
nodes[].metadataDiskAvailable integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" MetadataDiskAvailable is the available space on metadata disk.
nodes[].metadataDiskTotal integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" MetadataDiskTotal is the total space on metadata disk.
nodes[].nodeId string NodeID is the public key of the node.
nodes[].podName string PodName is the name of the pod running this node.
nodes[].tier string Tier is "storage" or "gateway" depending on which tier this node belongs to.
nodes[].version string Version is the Garage version running on this node.
nodes[].zone string Zone is the zone assignment of the node.
observedGeneration integer format: "int64" ObservedGeneration is the last observed generation.
pendingGatewayTombstones array of string PendingGatewayTombstones lists stale gateway layout entries pending removal. Populated when gateway tombstone cleanup detects orphaned entries but cannot remove them automatically (e.g. layoutManagement.autoApply is false).
phase string enum: ["Pending", "Creating", "Running", "Ready", "Degraded", "Updating", "Deleting", "Failed", "Unknown"] Phase represents the current phase of the cluster.
readyReplicas integer format: "int32" ReadyReplicas is the number of ready Garage pods.
redundancy object Redundancy reports block-resync progress and the last full-redundancy proof. Absent on clusters without a storage tier, on connectTo clusters, and until the controller first observes Garage.
redundancy.coordination object Coordination is what this site last saw of other sites' repairs. It serializes proofs across a federation. Absent on a cluster that is not federated.
redundancy.coordination.lastRemoteRepairAt string format: "date-time" LastRemoteRepairAt is when a blocks repair on a remote storage node was last seen starting or running, or when this site started watching.
redundancy.coordination.lastRemoteRepairNodeId string pattern: "^[0-9a-f]{64}$" LastRemoteRepairNodeID is the remote node of that repair.
redundancy.coordination.remoteRepairWorkerIds map of integer RemoteRepairWorkerIDs maps each remote storage node ID to the highest Block repair worker ID seen on it.
redundancy.deferredNodes array of object max items: 256 DeferredNodes lists owned storage nodes the current proof skipped. Down and NotReporting nodes are retried once they are back, no sooner than retryAfter.
redundancy.deferredNodes[].nodeId string required; pattern: "^[0-9a-f]{64}$" NodeID is the full Garage node ID.
redundancy.deferredNodes[].reason string required; enum: ["Down", "NotReporting", "RepairFailed"] Reason says why the node was skipped.
redundancy.deferredNodes[].retryAfter string format: "date-time" RetryAfter is the earliest time the operator retries the node. Absent for RepairFailed, which only a new verify-redundancy value retries.
redundancy.deferredNodes[].since string required; format: "date-time" Since is when the node was skipped.
redundancy.lastProgressAt string format: "date-time" LastProgressAt is the last time remaining work decreased (a resync or table sync queue shrank, a repair scan advanced, or the proof moved to a later step). It moves forward in steps of at least one minute.
redundancy.nodes array of object max items: 256 Nodes holds per-node progress for every current storage node and every other node that reports block errors, sorted by nodeId.
redundancy.nodes[].blockErrors integer format: "int32" BlockErrors is the node's number of blocks with resync errors.
redundancy.nodes[].blockRepairProgress string max length: 64 BlockRepairProgress is Garage's progress string for the exact verification repair worker on this node while it runs.
redundancy.nodes[].metadataQueueLength integer format: "int64" MetadataQueueLength is the sum of the Merkle-updater and insert queues.
redundancy.nodes[].metadataSyncPartitions integer format: "int32" MetadataSyncPartitions is the sum over tables of partitions left in the current full-sync pass. It is 0 between passes.
redundancy.nodes[].nodeId string required; pattern: "^[0-9a-f]{64}$" NodeID is the full Garage node ID.
redundancy.nodes[].observed boolean required Observed is false when the node did not answer this pass; the counters then keep their previous values.
redundancy.nodes[].resyncIdle boolean ResyncIdle is true when every enabled resync worker is idle.
redundancy.nodes[].resyncQueueLength integer format: "int64" ResyncQueueLength is the node's block resync queue, including delayed rechecks.
redundancy.progressObservedAt string format: "date-time" ProgressObservedAt is when nodes[] was last rewritten. Progress is rewritten at most once per minute unless another redundancy field changes in the same pass, and only when a value changed.
redundancy.scope string enum: ["Cluster", "Local"] Scope is Cluster when every storage role of the layout runs at this site, and Local when other sites run some of them; the proof covers only this site's local storage nodes.
redundancy.storageNodes object StorageNodes counts the layout's storage roles for this site.
redundancy.storageNodes.local integer required; format: "int32"; min: 0 Local is the number of storage roles that run at this site.
redundancy.storageNodes.remote integer required; format: "int32"; min: 0 Remote is the number of storage roles that run at other sites.
redundancy.storageNodes.total integer required; format: "int32"; min: 0 Total is the number of storage roles across all sites.
redundancy.storageNodes.verified integer required; format: "int32"; min: 0 Verified is the number of local storage nodes the current or last proof has completed.
redundancy.verification object Verification is the proof state. Absent on a federated site without spec.layoutManagement.siteRole.
redundancy.verification.completedNodeIds array of string max items: 256 CompletedNodeIDs are the owned storage nodes that finished this proof, sorted.
redundancy.verification.currentNodeId string pattern: "^[0-9a-f]{64}$" CurrentNodeID is the owned storage node whose turn it is. Repairs run on one storage node at a time.
redundancy.verification.evidence object Evidence is the internal proof state. Its shape may change between operator releases; an unrecognized shape restarts the current node.
redundancy.verification.evidence.blockErrorsBaseline integer format: "int64" BlockErrorsBaseline is the block-error count at the start of the current 30-minute window used to detect a growing count.
redundancy.verification.evidence.blockErrorsBaselineAt string format: "date-time" BlockErrorsBaselineAt is when the current block-error window opened.
redundancy.verification.evidence.idleSince string format: "date-time" IdleSince is the first pass, after the tables launch, at which the current node's sync workers were idle and its metadata queues empty.
redundancy.verification.evidence.launches integer format: "int32"; min: 0; max: 3 Launches counts the launches of the current node's stage. After three the node is deferred as RepairFailed.
redundancy.verification.evidence.nodeStage string enum: ["Tables", "Blocks", "Pause"] NodeStage is the current node's step.
redundancy.verification.evidence.pauseUntil string format: "date-time" PauseUntil ends the pause after the current node finished.
redundancy.verification.evidence.peerDownSeen boolean PeerDownSeen is true when some storage node was down during the current node's table sync. Sync errors are then expected; the node is rechecked with a tables-only pass once every node is up.
redundancy.verification.evidence.quietSince string format: "date-time" QuietSince starts the final quiet period.
redundancy.verification.evidence.repairWorkerId integer format: "int64" RepairWorkerID is the blocks repair worker adopted on the current node.
redundancy.verification.evidence.resyncErrorBaselines map of integer ResyncErrorBaselines is the persistent-error counter of every block resync worker on the owned nodes when the quiet period started.
redundancy.verification.evidence.skipTables boolean SkipTables is true for a proof started by a layout change: Garage's settled layout history already proves a full table sync on every node.
redundancy.verification.evidence.stageLaunchedAt string format: "date-time" StageLaunchedAt is when the current node's repair was launched.
redundancy.verification.evidence.syncErrorBaselines map of integer SyncErrorBaselines is the errors counter of each of the five " sync" workers of the current node at the tables launch.
redundancy.verification.evidence.tablesRecheckNodeIds array of string max items: 256 TablesRecheckNodeIDs are completed nodes whose table sync ran while a peer was down; each gets a tables-only pass once every node is up.
redundancy.verification.evidence.workerBaseline integer format: "int64" WorkerBaseline is the current node's highest worker ID at the launch. A lower maximum later means Garage restarted.
redundancy.verification.layoutVersion integer format: "int64"; min: 0 LayoutVersion is the Garage layout version last observed.
redundancy.verification.phase string required; enum: ["Idle", "Pending", "SyncingMetadata", "ScanningBlocks", "Settling", "Partial", "Verified"] Phase is the proof step.
redundancy.verification.phaseStartedAt string format: "date-time" PhaseStartedAt is when Phase was entered.
redundancy.verification.requestToken string max length: 253 RequestToken is the last handled value of the garage.rajsingh.info/verify-redundancy annotation.
redundancy.verification.startedAt string format: "date-time" StartedAt is when the current proof attempt began.
redundancy.verification.topologyHash string max length: 64 TopologyHash fingerprints the ID, zone and capacity of every storage role in the current layout. A change after the baseline starts a proof; tag-only layout changes and Pod restarts do not change it.
redundancy.verification.trigger string enum: ["Requested", "LayoutChanged", "NodeChanged"] Trigger is what started the current proof. Absent while Idle.
redundancy.verification.verifiedAt string format: "date-time" VerifiedAt is when the last proof completed. It survives later proofs and outages, so it records the last time full redundancy was proven.
remoteClusters array of object RemoteClusters contains status of remote clusters in the federation.
remoteClusters[].connected boolean Connected indicates if we can reach this cluster.
remoteClusters[].healthyNodes integer HealthyNodes is the number of healthy nodes.
remoteClusters[].lastSeen string format: "date-time" LastSeen is when we last successfully connected.
remoteClusters[].name string Name is the cluster name.
remoteClusters[].nodes integer Nodes is the number of nodes in this cluster.
remoteClusters[].zone string Zone is the cluster's zone.
replicas integer required; format: "int32" Replicas is the total number of Garage pods targeted by this cluster (storage + gateway tiers combined).
resyncQueueLength integer format: "int64" ResyncQueueLength is the total block resync queue depth across all nodes. Absent means not observed (Admin API unreachable, or a node that can hold blocks did not answer; silent capacityless gateways are ignored). 0 means observed and drained.
scaleReplicas integer format: "int32" ScaleReplicas is the actual number of non-terminating Pods in the workload projected through the requested API version's scale subresource. For storage and unified clusters this is only the Auto-managed default StatefulSet/PVC group; node-local pools, Manual GarageNodes, and unified gateways are excluded. A gateway-only hub object carries its gateway Pod count solely to preserve the legacy v1beta1 Scale projection; v1beta2 gateway-only Scale updates are rejected.
scaleSelector string ScaleSelector is the serialized exact selector for the Pods counted by ScaleReplicas. It normally selects the default storage group; on a gateway-only hub object it selects the gateway Pods for legacy v1beta1 Scale reads. It is kept separate from the aggregate Selector so hidden workloads cannot make /scale fail to converge.
scrubStatus object ScrubStatus contains the status of data scrub operations. Deprecated: never populated by the operator. It will be removed in the next API version.
scrubStatus.corruptedBlocks integer format: "int32" CorruptedBlocks is the number of corrupted blocks found in the last scrub.
scrubStatus.lastCompleted string format: "date-time" LastCompleted is when the last scrub completed.
scrubStatus.nextRun string format: "date-time" NextRun is when the next scrub is scheduled to run.
scrubStatus.nodeStatuses array of object NodeStatuses contains per-node scrub status.
scrubStatus.nodeStatuses[].errorsFound integer format: "int32" ErrorsFound is the number of errors found on this node.
scrubStatus.nodeStatuses[].itemsChecked integer format: "int64" ItemsChecked is the number of items checked.
scrubStatus.nodeStatuses[].nodeId string NodeID is the node identifier.
scrubStatus.nodeStatuses[].progress integer Progress percentage (0-100).
scrubStatus.nodeStatuses[].running boolean Running indicates if scrub is running on this node.
scrubStatus.paused boolean Paused indicates if the scrub is paused.
scrubStatus.progress string Progress is a human-readable progress description.
scrubStatus.running boolean Running indicates if a scrub is currently running on any node.
scrubStatus.tranquilityLevel integer TranquilityLevel is the current tranquility setting.
selector string required Selector is the aggregate serialized label selector for pods managed by this cluster. It is not used by the scale subresource.
stagedLayoutVersion integer format: "int64" StagedLayoutVersion is the staged layout version pending application.
stagedRoles integer format: "int32" StagedRoles is the number of roles in the staged layout.
storageDrain object StorageDrain records the single cluster-wide positive-capacity removal and block-migration proof. It excludes every other layout mutation until the exact actor completes its Kubernetes handoff.
storageDrain.actor object required Actor is the exact object authorized to advance this transaction.
storageDrain.actor.apiVersion string required APIVersion is the actor's Kubernetes API version.
storageDrain.actor.kind string required; enum: ["GarageCluster", "GarageNode"] Kind is GarageCluster for a cluster-wide Drain deletion or GarageNode for one logical storage member's permanent role removal.
storageDrain.actor.name string required Name is the actor's Kubernetes object name.
storageDrain.actor.namespace string required Namespace is the actor's Kubernetes namespace.
storageDrain.actor.uid string required UID is the immutable Kubernetes UID of the actor incarnation.
storageDrain.completedAt string format: "date-time" CompletedAt is set only after exact repair workers completed cleanly and every enabled block-resync worker passed the terminal safety checks. The transaction remains active until Actor completes its Kubernetes handoff.
storageDrain.errorCount integer required; format: "int64" ErrorCount is the aggregate number of block resync errors.
storageDrain.layoutVersion integer required; format: "int64" LayoutVersion is the current Garage layout version observed with these verification processes and queue counters.
storageDrain.managedPodUids map of string ManagedPodUIDs fingerprints the exact locally managed Garage processes observed when this proof revision started. Any pod replacement invalidates worker-ID baselines because Garage worker counters can restart from zero. Keys are full Garage node IDs and values are Kubernetes Pod UIDs.
storageDrain.queueLength integer required; format: "int64" QueueLength is the observed aggregate block-resync queue depth. It is informational: Garage also queues future garbage collection, so readiness is based on completed repair workers and idle resync workers instead.
storageDrain.quietSince string format: "date-time" QuietSince starts after every exact repair worker completes without errors and resync-worker error baselines are recorded. The operator waits through Garage's maximum known delayed-resync interval, then requires every exact resync worker idle and error-free before a process may be stopped.
storageDrain.removedStorageNodeIds array of string required RemovedStorageNodeIDs is the sorted positive-capacity subset whose removal requires block-migration proof. Recording it before Apply keeps the safety gate durable across controller crashes and Admin API failures.
storageDrain.repairBaselines map of integer RepairBaselines records each storage node's highest worker ID before the operator launches a transaction-specific Blocks repair. It is persisted before launch so a crash cannot lose ownership of the resulting worker.
storageDrain.repairWorkerIds map of integer RepairWorkerIDs records the exact post-baseline Blocks repair worker whose clean completion was observed on each source and destination process in VerificationNodeIDs.
storageDrain.requiresEmptyQueue boolean required RequiresEmptyQueue is true when at least one verification process is not proven to use this GarageCluster's authoritative RPC timeout. In that case the normally informational future-work queue must also become empty.
storageDrain.resyncErrorBaselines map of integer ResyncErrorBaselines records the cumulative error counter of every exact enabled block-resync worker after all repair scans complete. Any increase restarts the repair transaction.
storageDrain.roleRemovalNodeIds array of string required RoleRemovalNodeIDs is the sorted set of every exact Garage layout role this actor is authorized to remove, including capacityless gateway roles in a unified cluster Drain.
storageDrain.startedAt string required; format: "date-time" StartedAt records when the pre-Apply removal intent became durable.
storageDrain.targetHash string required TargetHash fingerprints both normalized target sets. Every status update compares both transactionId and targetHash so a stale reconcile cannot overwrite a newer target revision owned by the same actor.
storageDrain.transactionId string required TransactionID distinguishes separate drains owned by the same object UID.
storageDrain.unavailableSourceNodeIds array of string UnavailableSourceNodeIDs is the sorted subset of removedStorageNodeIds whose processes and local disks were explicitly acknowledged as permanently lost. Those sources cannot run the normal Blocks scan; the terminal proof instead covers every surviving positive-capacity destination after an administrator removes the exact dead role through Garage's recovery workflow. Data present only on a listed source may be lost.
storageDrain.verificationNodeIds array of string VerificationNodeIDs is the sorted union of removed source processes and current positive-capacity destinations covered by this transaction's completed block-repair scans.
storageReadyReplicas integer format: "int32" StorageReadyReplicas is the aggregate number of storage identities that are connected and committed in Garage's layout.
storageReplicas integer format: "int32" StorageReplicas is the aggregate desired/current storage identity count across the default group, ordinary Manual GarageNodes, and node-local pools. Use ScaleReplicas for the narrow Kubernetes Scale projection.
storageRollout object StorageRollout is the controller-owned durable record for the single managed storage/gateway pod currently being replaced. Nil when no parent-controlled rollout handoff is active.
storageRollout.clusterGeneration integer format: "int64" ClusterGeneration is the most recent recovery-safe GarageCluster spec generation published into this actor's desired workload template.
storageRollout.desiredConfigHash string required DesiredConfigHash is the rendered Garage configuration revision.
storageRollout.desiredPodSpecHash string required DesiredPodSpecHash is the operator-computed pod template revision.
storageRollout.garageNodeGeneration integer format: "int64" GarageNodeGeneration is the exact actor's most recently published workload-safe spec generation, including the generated GarageNode behind a node-local-pool actor.
storageRollout.garageNodeId string required GarageNodeID is the exact Garage identity reported by the selected actor before its Pod is deleted. A replacement must rediscover this same identity; a new ID under the same Kubernetes objects is never accepted as a handoff.
storageRollout.garageNodeName string GarageNodeName identifies a StatefulSet-backed PVC, SMB, or gateway actor. Mutually exclusive with NodeLocalPoolName and KubernetesNodeName.
storageRollout.garageNodeUid string required GarageNodeUID anchors the actor to one immutable GarageNode incarnation. It is recorded for StatefulSet and node-local-pool actors alike.
storageRollout.kubernetesNodeName string KubernetesNodeName identifies the Kubernetes Node represented by a node-local-pool actor.
storageRollout.kubernetesNodeUid string KubernetesNodeUID anchors a node-local-pool actor to the Kubernetes Node incarnation whose HostPath storage was validated. Empty for StatefulSets.
storageRollout.nodeLocalPoolName string NodeLocalPoolName identifies a spec.storage.nodeLocalPools entry.
storageRollout.persistentVolumeClaims array of object PersistentVolumeClaims anchors a StatefulSet-backed actor to every exact PVC mounted by the Pod selected for replacement. Recreated/deleting claims fail closed so controller-incarnation recovery cannot bind empty storage or silently create a new Garage identity under a reused claim name. Empty for node-local-pool HostPath actors.
storageRollout.persistentVolumeClaims[].name string required Name is the namespaced PVC referenced by the selected Pod.
storageRollout.persistentVolumeClaims[].uid string required UID is the exact Kubernetes PVC incarnation that contains the actor's metadata/data at selection time.
storageRollout.previousPodUid string required PreviousPodUID is persisted before the OnDelete pod is deleted. Recovery never accepts this UID as the completed replacement.
storageRollout.recoveryPodName string RecoveryPodName and RecoveryPodUID identify the one failed replacement durably selected for retry deletion. They are written before DELETE and retained until that exact UID is absent, making the operation idempotent across manager and API failures. Both are empty when no retry deletion is pending.
storageRollout.recoveryPodUid string
storageRollout.recoveryRequest string RecoveryRequest is the last recover-storage-rollout annotation nonce the controller durably consumed before deleting a failed replacement again.
storageRollout.retiredWorkloadUids array of string max items: 32 RetiredWorkloadUIDs records workload-controller incarnations that were replaced behind a scheduling fence. Late Pods from these exact UIDs remain identifiable without trusting reused names; node-local-pool recovery waits for them to disappear rather than deleting healthy non-candidate members. Recovery fails closed before a 33rd retired controller incarnation so this exact old-Pod exclusion set remains bounded in parent status.
storageRollout.statefulSetWorkloadRecreationSafe boolean StatefulSetWorkloadRecreationSafe records that the selected StatefulSet's volumeClaimTemplate retention policy does not delete claims when the StatefulSet is deleted. It is false for node-local-pool actors and causes missing StatefulSet recovery to fail closed when claim retention was unsafe.
storageRollout.workloadFenced boolean WorkloadFenced is true after a replacement StatefulSet/DaemonSet UID was CAS-adopted but before that controller was allowed to schedule its first Pod (replicas=0 for StatefulSet, impossible nodeSelector for DaemonSet).
storageRollout.workloadUid string required WorkloadUID is the exact StatefulSet or DaemonSet controller incarnation authorized to create and replace this actor's Pod.
storageStats object StorageStats contains cluster-wide storage statistics.
storageStats.availableCapacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" AvailableCapacity is the available storage across all nodes.
storageStats.healthyPartitions integer format: "int32" HealthyPartitions is the number of partitions with full redundancy.
storageStats.totalCapacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" TotalCapacity is the total storage capacity across all nodes.
storageStats.totalPartitions integer format: "int32" TotalPartitions is the total number of partitions in the layout.
storageStats.usedCapacity integer or string pattern: "^(\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9])?)|(\.[0-9]+))))?$" UsedCapacity is the used storage across all nodes.
totalNodes integer TotalNodes is the total nodes across all clusters (local + remote). Deprecated: never populated by the operator. It will be removed in the next API version.
unreachablePeers array of string UnreachablePeers lists peers that have been continuously down beyond the sustained-unreachable threshold, each as " (down )". Drives the PeerUnreachable condition. Empty when all peers are reachable.
workerCount integer format: "int32" WorkerCount is the total number of background workers. Deprecated: never populated by the operator. It will be removed in the next API version.
workers object Workers contains detailed information about background workers. Deprecated: never populated by the operator. It will be removed in the next API version.
workers.busy integer format: "int32" Busy is the number of busy/active workers.
workers.errored integer format: "int32" Errored is the number of workers with errors.
workers.errors array of object Errors contains details about worker errors.
workers.errors[].consecutiveErrors integer format: "int32" ConsecutiveErrors is the count of consecutive errors.
workers.errors[].lastError string LastError is the last error message.
workers.errors[].lastErrorSecsAgo integer format: "int64" LastErrorSecsAgo is seconds since the last error.
workers.errors[].name string Name is the worker name.
workers.errors[].workerId integer format: "int64" WorkerID is the worker identifier.
workers.idle integer format: "int32" Idle is the number of idle workers.
workers.total integer format: "int32" Total is the total number of background workers.
workers.variables map of string Variables contains runtime worker configuration variables.
workersFailed integer format: "int32" WorkersFailed is the number of failed workers. Deprecated: never populated by the operator. It will be removed in the next API version.