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- |
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 |
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- |
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- |
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 |
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 |
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 ". |
|
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 "
|