diff --git a/charts/graylog/README.md b/charts/graylog/README.md index dc4cdb1..13c5810 100644 --- a/charts/graylog/README.md +++ b/charts/graylog/README.md @@ -626,6 +626,9 @@ These values affect Graylog, DataNode, and MongoDB. | `graylog.readinessProbe.successThreshold` | Success threshold for the readiness probe. | `1` | | `graylog.podDisruptionBudget.enabled` | Enable PodDisruptionBudget. | `false` | | `graylog.podDisruptionBudget.minAvailable` | Minimum available pods during disruption. | `1` | +| `graylog.podSecurityContext` | Pod-level security context for the Graylog StatefulSet. Free-form; set to `null` to omit, `{}` restores defaults.|
runAsUser: 1100
runAsGroup: 1100
runAsNonRoot: true
fsGroup: 1100
seccompProfile:
  type: RuntimeDefault
| +| `graylog.initContainerSecurityContext` | Container security context for the Graylog init containers. Free-form; set to `null` to omit, `{}` restores defaults.|
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
  drop: ["ALL"]
seccompProfile:
  type: RuntimeDefault
| +| `graylog.containerSecurityContext` | Container security context for the `graylog-app` container. Free-form; set to `null` to omit, `{}` restores defaults.|
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
  drop: ["ALL"]
  add: ["NET_BIND_SERVICE"]
seccompProfile:
  type: RuntimeDefault
| | `graylog.podAnnotations` | Additional pod annotations. | `{}` | | `graylog.nodeSelector` | Node selector for scheduling. | `{}` | | `graylog.tolerations` | Tolerations for scheduling. | `[]` | @@ -725,6 +728,8 @@ These values affect Graylog, DataNode, and MongoDB. | `datanode.readinessProbe.successThreshold` | Success threshold for the readiness probe. | `1` | | `datanode.podDisruptionBudget.enabled` | Enable PodDisruptionBudget. | `false` | | `datanode.podDisruptionBudget.minAvailable` | Minimum available pods during disruption. | `2` | +| `datanode.podSecurityContext` | Pod-level security context for the DataNode StatefulSet. Free-form; set to `null` to omit, `{}` restores defaults.|
fsGroup: 999
fsGroupChangePolicy: "OnRootMismatch"
seccompProfile:
  type: RuntimeDefault
| +| `datanode.containerSecurityContext` | Container security context for the `graylog-datanode` container. Free-form; set to `null` to omit, `{}` restores defaults.|
allowPrivilegeEscalation: false
capabilities:
  drop: ["ALL"]
  add: ["CHOWN", "DAC_OVERRIDE", "FOWNER", "SETUID", "SETGID"]
seccompProfile:
  type: RuntimeDefault
| | `datanode.podAnnotations` | Additional pod annotations. | `{}` | | `datanode.nodeSelector` | Node selector for scheduling datanode pods. | `{}` | | `datanode.tolerations` | Tolerations for scheduling. | `[]` | diff --git a/charts/graylog/values.schema.json b/charts/graylog/values.schema.json index 54b4b12..f1a748b 100644 --- a/charts/graylog/values.schema.json +++ b/charts/graylog/values.schema.json @@ -10,7 +10,7 @@ "oneOf": [ { "type": "string", - "enum": [ "aws", "aws-managed-sc", "azure", "gcp", "microk8s", "" ] + "enum": [ "aws", "azure", "gcp", "microk8s", "" ] }, { "type": "null" } ] @@ -29,16 +29,18 @@ }, "global": { "type": "object", + "description": "Values shared across the Graylog, Data Node, and MongoDB workloads.", "properties": { "imagePullSecrets": { "type": "array", + "description": "Image pull secret references used by all workloads to pull from private registries.", "items": { "type": "object", - "properties": { "name": { "type": "string" } }, + "properties": { "name": { "type": "string", "description": "Name of the imagePullSecret." } }, "required": ["name"] } }, - "storageClass": { "type": "string" }, + "storageClass": { "type": "string", "description": "Default StorageClass to apply to PersistentVolumeClaims when a workload does not set its own." }, "existingSecretName": { "type": "string", "description": "Name of existing Graylog secret containing GRAYLOG_MONGODB_URI, GRAYLOG_ROOT_USERNAME, GRAYLOG_PASSWORD_SECRET, and GRAYLOG_ROOT_PASSWORD_SHA2" } } }, @@ -46,52 +48,57 @@ "type": "object", "description": "Graylog application values", "properties": { - "enabled": { "type": "boolean", "default": true }, - "enterprise": { "type": "boolean", "default": true }, - "replicas": { "type": "integer" }, + "enabled": { "type": "boolean", "default": true, "description": "Deploy the Graylog server StatefulSet." }, + "enterprise": { "type": "boolean", "default": true, "description": "Use the Graylog Enterprise image and features. Set to false for Graylog Open." }, + "replicas": { "type": "integer", "minimum": 0, "description": "Number of Graylog server replicas (StatefulSet pods)." }, "service": { "type": "object", + "description": "Kubernetes Service exposing the Graylog server.", "properties": { - "nameOverride": { "type": "string" }, - "type": { "type": "string" }, + "nameOverride": { "type": "string", "description": "Override the generated name of the Graylog Service." }, + "type": { "type": "string", "enum": [ "ClusterIP", "NodePort", "LoadBalancer", "ExternalName" ], "description": "Kubernetes Service type." }, "ports": { "type": "object", + "description": "Ports exposed by the Graylog Service.", "properties": { - "app": { "type": "integer" }, - "metrics": { "type": "integer" } + "app": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Port for the Graylog web interface and REST API." }, + "metrics": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Port exposing Graylog Prometheus metrics." } } }, "metrics": { "type": "object", + "description": "Prometheus metrics exporter settings.", "properties": { - "enabled": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Expose the Prometheus metrics port on the Service." } } } } }, "inputs": { "type": "array", + "description": "Graylog input ports to open on the Service. This only exposes the port; it does not create the input in Graylog.", "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "port": { "type": "integer" }, - "targetPort": { "type": "integer" }, - "protocol": { "type": "string" } + "name": { "type": "string", "description": "Name of the input port (used as the Service port name)." }, + "port": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Service port to expose." }, + "targetPort": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Container port the input listens on." }, + "protocol": { "type": "string", "enum": [ "TCP", "UDP" ], "description": "Network protocol for the port (TCP or UDP)." } }, "required": [ "name", "port", "protocol" ] } }, "plugins": { "type": "array", + "description": "Graylog plugins to install at startup. Each entry must provide exactly one source: image, existingClaim, or url.", "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "image": { "type": "string" }, - "existingClaim": { "type": "string" }, - "url": { "type": "string" }, - "checksum": { "type": "string" } + "name": { "type": "string", "description": "Plugin name (used to label the plugin volume/artifact)." }, + "image": { "type": "string", "description": "Container image that provides the plugin .jar (mounted via an init container)." }, + "existingClaim": { "type": "string", "description": "Name of an existing PVC that contains the plugin .jar." }, + "url": { "type": "string", "description": "URL to download the plugin .jar from." }, + "checksum": { "type": "string", "description": "Expected checksum of the downloaded plugin, verified after download (requires url)." } }, "required": [ "name" ], "oneOf": [ @@ -127,128 +134,141 @@ "type": "object", "description": "Graylog server configuration. These values can be found in server.conf", "properties": { - "rootUsername": { "type": "string" }, - "rootPassword": { "type": "string" }, - "customSecretPepper": { "type": "string" }, - "timezone": { "type": "string" }, - "selfSignedStartup": { "type": "string" }, - "serverJavaOpts": { "type": "string" }, + "rootUsername": { "type": "string", "description": "Username of the initial (root) Graylog admin user (server.conf: root_username)." }, + "rootPassword": { "type": "string", "description": "Password for the initial admin user. Leave empty to auto-generate a randomized value." }, + "customSecretPepper": { "type": "string", "description": "Secret used to salt/encrypt stored passwords (server.conf: password_secret). Auto-generated when empty; must be stable across all nodes." }, + "timezone": { "type": "string", "description": "Default timezone for the root user (server.conf: root_timezone), e.g. UTC or Europe/Berlin." }, + "selfSignedStartup": { "type": "string", "enum": [ "true", "false" ], "description": "Generate a self-signed certificate on startup when no TLS material is provided." }, + "serverJavaOpts": { "type": "string", "description": "JVM options for the Graylog server process (sets the base -Xms/-Xmx heap)." }, "extraServerJavaOpts": { "type": "array", + "description": "Additional JVM options appended to the Graylog server command.", "items": { "type": "string" } }, - "leaderElectionMode": { "type": "string" }, - "contentPacksAutoInstall": { "type": "string" }, - "isCloud": { "type": "string" }, + "leaderElectionMode": { "type": "string", "enum": [ "automatic", "static" ], "description": "Leader election mode (server.conf: leader_election_mode)." }, + "contentPacksAutoInstall": { "type": "string", "enum": [ "true", "false" ], "description": "Automatically install bundled content packs on startup." }, + "isCloud": { "type": "string", "enum": [ "true", "false" ], "description": "Enable Graylog Cloud mode (server.conf: is_cloud)." }, "tls": { "type": "object", + "description": "TLS settings for the Graylog HTTP interface.", "properties": { - "enabled": { "type": "boolean" }, - "secretName": { "type": "string" }, - "keyPassword": { "type": "string" }, - "updateKeyStore": { "type": "boolean" }, - "keyStorePass": { "type": "string" } + "enabled": { "type": "boolean", "description": "Enable TLS on the Graylog HTTP interface." }, + "secretName": { "type": "string", "description": "Name of the TLS Secret containing the certificate and private key." }, + "keyPassword": { "type": "string", "description": "Password protecting the private key, if any." }, + "updateKeyStore": { "type": "boolean", "description": "Import the provided certificate into the Java keystore on startup." }, + "keyStorePass": { "type": "string", "description": "Password for the Java keystore." } } }, "mongodb": { "type": "object", + "description": "MongoDB connection settings for the Graylog server.", "properties": { - "customUri": { "type": "string" }, - "maxConnections": { "type": "string" }, - "versionProbeAttempts": { "type": "string" } + "customUri": { "type": "string", "description": "Full MongoDB connection URI overriding the generated one (server.conf: mongodb_uri)." }, + "maxConnections": { "type": "string", "description": "Maximum size of the MongoDB connection pool (server.conf: mongodb_max_connections)." }, + "versionProbeAttempts": { "type": "string", "description": "Number of attempts to probe the MongoDB version on startup (0 = retry indefinitely; server.conf: mongodb_version_probe_attempts)." } } }, "messageJournal": { "type": "object", + "description": "On-disk message journal settings buffering messages before processing.", "properties": { - "enabled": { "type": "string" }, - "flushAge": { "type": "string" }, - "flushInterval": { "type": "string" }, - "maxAge": { "type": "string" }, - "segmentAge": { "type": "string" }, - "segmentSize": { "type": "string" } + "enabled": { "type": "string", "enum": [ "true", "false" ], "description": "Enable the on-disk message journal (server.conf: message_journal_enabled)." }, + "flushAge": { "type": "string", "description": "Maximum age before journal data is flushed to disk (server.conf: message_journal_flush_age)." }, + "flushInterval": { "type": "string", "description": "Number of messages written before the journal is flushed to disk (server.conf: message_journal_flush_interval)." }, + "maxAge": { "type": "string", "description": "Maximum age of messages retained in the journal (server.conf: message_journal_max_age)." }, + "segmentAge": { "type": "string", "description": "Maximum age of a journal segment before a new one is created (server.conf: message_journal_segment_age)." }, + "segmentSize": { "type": "string", "description": "Maximum size of a journal segment before a new one is created (server.conf: message_journal_segment_size)." } } }, "network": { "type": "object", + "description": "HTTP interface network settings for the Graylog server.", "properties": { - "connectTimeout": { "type": "string" }, - "enableCors": { "type": "string" }, - "enableGzip": { "type": "string" }, - "maxHeaderSize": { "type": "string" }, - "readTimeout": { "type": "string" }, - "threadPoolSize": { "type": "string" }, - "externalUri": { "type": "string" } + "connectTimeout": { "type": "string", "description": "HTTP client connect timeout, e.g. \"5s\" (server.conf: http_connect_timeout)." }, + "enableCors": { "type": "string", "enum": [ "true", "false" ], "description": "Enable CORS headers on the HTTP interface (server.conf: http_enable_cors)." }, + "enableGzip": { "type": "string", "enum": [ "true", "false" ], "description": "Enable gzip compression of HTTP responses (server.conf: http_enable_gzip)." }, + "maxHeaderSize": { "type": "string", "description": "Maximum size of an HTTP request header in bytes (server.conf: http_max_header_size)." }, + "readTimeout": { "type": "string", "description": "HTTP client read timeout, e.g. \"10s\" (server.conf: http_read_timeout)." }, + "threadPoolSize": { "type": "string", "description": "Size of the HTTP worker thread pool (server.conf: http_thread_pool_size)." }, + "externalUri": { "type": "string", "description": "Public URI clients use to reach the Graylog web interface/API (server.conf: http_external_uri)." } } }, "performance": { "type": "object", + "description": "Processing and output performance tuning for the Graylog server.", "properties": { - "asyncEventbusProcessors": { "type": "string" }, - "autoRestartInputs": { "type": "string" }, - "inputBufferProcessors": { "type": "string" }, - "inputBufferRingSize": { "type": "string" }, - "inputBufferWaitStrategy": { "type": "string" }, - "jobSchedulerConcurrencyLimits": { "type": "string" }, - "outputBatchSize": { "type": "string" }, - "outputFaultCountThreshold": { "type": "string" }, - "outputFaultPenaltySeconds": { "type": "string" }, - "outputFlushInterval": { "type": "string" }, - "outputBufferProcessorThreadsCorePoolSize": { "type": "string" }, - "outputBufferProcessors": { "type": "string" }, - "processBufferProcessors": { "type": "string" } + "asyncEventbusProcessors": { "type": "string", "description": "Number of threads dedicated to dispatching internal events (server.conf: async_eventbus_processors)." }, + "autoRestartInputs": { "type": "string", "enum": [ "true", "false" ], "description": "Automatically restart failed inputs (server.conf: auto_restart_inputs)." }, + "inputBufferProcessors": { "type": "string", "description": "Number of input buffer processor threads (server.conf: inputbuffer_processors)." }, + "inputBufferRingSize": { "type": "string", "description": "Size of the input buffer ring; must be a power of two (server.conf: inputbuffer_ring_size)." }, + "inputBufferWaitStrategy": { "type": "string", "enum": [ "blocking", "sleeping", "yielding", "busy_spinning" ], "description": "Disruptor wait strategy for the input buffer (server.conf: inputbuffer_wait_strategy)." }, + "jobSchedulerConcurrencyLimits": { "type": "string", "description": "Concurrency limits for the job scheduler. Empty uses the Graylog default." }, + "outputBatchSize": { "type": "string", "description": "Maximum number of messages written to the search backend in a single batch (server.conf: output_batch_size)." }, + "outputFaultCountThreshold": { "type": "string", "description": "Number of faults an output may accumulate before it is paused (server.conf: output_fault_count_threshold)." }, + "outputFaultPenaltySeconds": { "type": "string", "description": "Seconds to wait before retrying an output that hit the fault threshold (server.conf: output_fault_penalty_seconds)." }, + "outputFlushInterval": { "type": "string", "description": "Maximum seconds between two batches written to the search backend (server.conf: output_flush_interval)." }, + "outputBufferProcessorThreadsCorePoolSize": { "type": "string", "description": "Core pool size for output buffer processor threads (server.conf: outputbuffer_processor_threads_core_pool_size)." }, + "outputBufferProcessors": { "type": "string", "description": "Number of output buffer processor threads (server.conf: outputbuffer_processors). Empty uses the Graylog default." }, + "processBufferProcessors": { "type": "string", "description": "Number of process buffer processor threads (server.conf: processbuffer_processors). Empty uses the Graylog default." } } }, "email": { "type": "object", + "description": "Outbound email (SMTP) transport settings for notifications.", "properties": { - "enabled": { "type": "string" }, - "senderAddress": { "type": "string" }, - "hostname": { "type": "string" }, - "port": { "type": "string" }, - "socketConnectionTimeout": { "type": "string" }, - "socketTimeout": { "type": "string" }, - "useAuth": { "type": "string" }, - "useSsl": { "type": "string" }, - "useTls": { "type": "string" }, - "webInterfaceUrl": { "type": "string" } + "enabled": { "type": "string", "enum": [ "true", "false" ], "description": "Enable the email transport (server.conf: transport_email_enabled)." }, + "senderAddress": { "type": "string", "description": "From address for emails sent by Graylog (server.conf: transport_email_from_email)." }, + "hostname": { "type": "string", "description": "SMTP server hostname (server.conf: transport_email_hostname)." }, + "port": { "type": "string", "description": "SMTP server port (server.conf: transport_email_port)." }, + "socketConnectionTimeout": { "type": "string", "description": "SMTP socket connection timeout, e.g. \"10s\"." }, + "socketTimeout": { "type": "string", "description": "SMTP socket read timeout, e.g. \"10s\"." }, + "useAuth": { "type": "string", "enum": [ "true", "false" ], "description": "Authenticate against the SMTP server (server.conf: transport_email_use_auth)." }, + "useSsl": { "type": "string", "enum": [ "true", "false" ], "description": "Connect to the SMTP server using SSL (server.conf: transport_email_use_ssl)." }, + "useTls": { "type": "string", "enum": [ "true", "false" ], "description": "Use STARTTLS when connecting to the SMTP server (server.conf: transport_email_use_tls)." }, + "webInterfaceUrl": { "type": "string", "description": "Base URL of the Graylog web interface used in email links (server.conf: transport_email_web_interface_url)." } } }, "plugins": { "type": "object", + "description": "Graylog plugin system settings.", "properties": { - "enabled": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Enable the Graylog plugin system (mount the plugins volume and load installed plugins)." } } }, "geolocation": { "type": "object", + "description": "IP geolocation processing settings.", "properties": { - "enabled": { "type": "boolean" }, + "enabled": { "type": "boolean", "description": "Enable the Geolocation Processor." }, "maxmindGeoIp": { "type": "object", + "description": "MaxMind GeoIP database settings.", "properties": { - "enabled": { "type": "boolean" }, - "accountId": { "type": ["string", "integer", "null"] }, - "licenseKey": { "type": ["string", "null"] }, - "cronSchedule": { "type": "string" }, - "postInstallRun": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Enable the MaxMind GeoIP update CronJob." }, + "accountId": { "type": ["string", "integer", "null"], "description": "MaxMind account ID used to download databases." }, + "licenseKey": { "type": ["string", "null"], "description": "MaxMind license key used to download databases." }, + "cronSchedule": { "type": "string", "description": "Cron schedule for periodic GeoIP database updates." }, + "postInstallRun": { "type": "boolean", "description": "Run a database download immediately after install via a post-install Helm hook Job." } } }, "mmdbSources": { "type": "object", + "description": "Sources for the initial geolocation database asset fetch.", "properties": { "city": { "type": "object", + "description": "Source for the GeoLite2-City.mmdb database.", "properties": { - "url": { "type": ["string", "null"] }, - "checksum": { "type": ["string", "null"] } + "url": { "type": ["string", "null"], "description": "GeoLite2-City.mmdb URL (only used for the initial asset fetch)." }, + "checksum": { "type": ["string", "null"], "description": "GeoLite2-City.mmdb checksum (only used for the initial asset fetch)." } } }, "asn": { "type": "object", + "description": "Source for the GeoLite2-ASN.mmdb database.", "properties": { - "url": { "type": ["string", "null"] }, - "checksum": { "type": ["string", "null"] } + "url": { "type": ["string", "null"], "description": "GeoLite2-ASN.mmdb URL (only used for the initial asset fetch)." }, + "checksum": { "type": ["string", "null"], "description": "GeoLite2-ASN.mmdb checksum (only used for the initial asset fetch)." } } } } @@ -257,25 +277,29 @@ }, "init": { "type": "object", + "description": "Init-container behavior for the Graylog server.", "properties": { "assetFetch": { "type": "object", + "description": "Fetching of assets (plugins and geolocation databases) during init.", "properties": { - "enabled": { "type": "boolean" }, - "skipChecksum": { "type": "boolean" }, - "allowHttp": { "type": "boolean" }, + "enabled": { "type": "boolean", "description": "Enable fetching assets during init." }, + "skipChecksum": { "type": "boolean", "description": "Skip checksum verification of fetched assets." }, + "allowHttp": { "type": "boolean", "description": "Allow fetching assets over plain HTTP." }, "plugins": { "type": "object", + "description": "Plugin asset fetch settings.", "properties": { - "enabled": { "type": "boolean" }, - "baseUrl": { "type": ["string", "null"] } + "enabled": { "type": "boolean", "description": "Fetch plugin assets during init." }, + "baseUrl": { "type": ["string", "null"], "description": "Base URL to fetch plugin assets from." } } }, "geolocation": { "type": "object", + "description": "Geolocation asset fetch settings.", "properties": { - "enabled": { "type": "boolean" }, - "baseUrl": { "type": ["string", "null"] } + "enabled": { "type": "boolean", "description": "Fetch geolocation databases during init." }, + "baseUrl": { "type": ["string", "null"], "description": "Base URL to fetch geolocation databases from." } } } } @@ -286,15 +310,17 @@ }, "image": { "type": "object", + "description": "Graylog server container image settings.", "properties": { - "repository": { "type": "string" }, - "tag": { "type": "string" }, - "imagePullPolicy": { "type": "string" }, + "repository": { "type": "string", "description": "Image repository. Leave empty to use the chart default for the selected edition." }, + "tag": { "type": "string", "description": "Image tag. Leave empty to use the chart appVersion / .Values.version." }, + "imagePullPolicy": { "type": "string", "enum": [ "Always", "IfNotPresent", "Never" ], "description": "Image pull policy." }, "imagePullSecrets": { "type": "array", + "description": "Image pull secret references for the Graylog server image.", "items": { "type": "object", - "properties": { "name": { "type": "string" } }, + "properties": { "name": { "type": "string", "description": "Name of the imagePullSecret." } }, "required": ["name"] } } @@ -302,84 +328,96 @@ }, "updateStrategy": { "type": "object", + "description": "StatefulSet update strategy for the Graylog server.", "properties": { - "type": { "type": ["string", "null"] }, + "type": { "type": ["string", "null"], "enum": [ "RollingUpdate", "OnDelete", null ], "description": "Update strategy type." }, "rollingUpdate": { "type": "object", + "description": "Tuning for the RollingUpdate strategy.", "properties": { - "maxUnavailable": { "type": [ "string", "integer", "null" ] }, - "partition": { "type": [ "string", "null" ] } + "maxUnavailable": { "type": [ "string", "integer", "null" ], "description": "Maximum number of pods that can be unavailable during the update." }, + "partition": { "type": [ "string", "null" ], "description": "Ordinal at which to partition the rolling update; pods with a lower ordinal are not updated." } } } } }, "resources": { "type": "object", + "description": "Compute resource requests and limits for the Graylog server container.", "properties": { "limits": { "type": "object", + "description": "Resource limits.", "properties": { - "cpu": { "type": "string" }, - "memory": { "type": "string" } + "cpu": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "CPU limit (e.g. \"2\" or \"500m\")." }, + "memory": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Memory limit (e.g. \"2Gi\")." } } }, "requests": { "type": "object", + "description": "Resource requests.", "properties": { - "cpu": { "type": "string" }, - "memory": { "type": "string" } + "cpu": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "CPU request (e.g. \"1\" or \"500m\")." }, + "memory": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Memory request (e.g. \"1Gi\")." } } } } }, "persistence": { "type": "object", + "description": "Persistent storage for the Graylog server.", "properties": { - "enabled": { "type": "boolean" }, - "storageClass": { "type": [ "string", "null" ] }, - "volumeNameOverride": { "type": [ "string", "null" ] }, - "existingClaim": { "type": [ "string", "null" ] }, - "mountPath": { "type": [ "string", "null" ] }, - "accessModes": { "type": "array" }, - "size": { "type": [ "string", "null" ] }, + "enabled": { "type": "boolean", "description": "Use a PersistentVolumeClaim for Graylog data. If false, an emptyDir is used." }, + "storageClass": { "type": [ "string", "null" ], "description": "StorageClass for the PVC. Falls back to global.storageClass when unset." }, + "volumeNameOverride": { "type": [ "string", "null" ], "description": "Bind the PVC to a specific PersistentVolume by name." }, + "existingClaim": { "type": [ "string", "null" ], "description": "Use an existing PVC instead of creating one." }, + "mountPath": { "type": [ "string", "null" ], "description": "Path where the volume is mounted in the container." }, + "accessModes": { "type": "array", "description": "PVC access modes (e.g. ReadWriteOnce)." }, + "size": { "type": [ "string", "null" ], "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Requested size of the PVC (e.g. \"10Gi\")." }, "annotations": { - "type": "object" + "type": "object", + "description": "Annotations added to the PVC." }, "labels": { - "type": "object" + "type": "object", + "description": "Labels added to the PVC." }, "selector": { - "type": "object" + "type": "object", + "description": "Label selector used to bind the PVC to a matching PersistentVolume." } } }, "livenessProbe": { "type": "object", + "description": "Liveness probe for the Graylog server container.", "properties": { - "enabled": { "type": "boolean" }, - "initialDelaySeconds": { "type": "integer" }, - "periodSeconds": { "type": "integer" }, - "timeoutSeconds": { "type": "integer" }, - "failureThreshold": { "type": "integer" }, - "successThreshold": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Enable the liveness probe." }, + "initialDelaySeconds": { "type": "integer", "minimum": 0, "description": "Seconds to wait after container start before the first probe." }, + "periodSeconds": { "type": "integer", "minimum": 1, "description": "How often (in seconds) to perform the probe." }, + "timeoutSeconds": { "type": "integer", "minimum": 1, "description": "Seconds after which the probe times out." }, + "failureThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive failures before the probe is considered failed." }, + "successThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive successes before the probe is considered successful." } } }, "readinessProbe": { "type": "object", + "description": "Readiness probe for the Graylog server container.", "properties": { - "enabled": { "type": "boolean" }, - "initialDelaySeconds": { "type": "integer" }, - "periodSeconds": { "type": "integer" }, - "timeoutSeconds": { "type": "integer" }, - "failureThreshold": { "type": "integer" }, - "successThreshold": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Enable the readiness probe." }, + "initialDelaySeconds": { "type": "integer", "minimum": 0, "description": "Seconds to wait after container start before the first probe." }, + "periodSeconds": { "type": "integer", "minimum": 1, "description": "How often (in seconds) to perform the probe." }, + "timeoutSeconds": { "type": "integer", "minimum": 1, "description": "Seconds after which the probe times out." }, + "failureThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive failures before the probe is considered failed." }, + "successThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive successes before the probe is considered successful." } } }, "podDisruptionBudget": { "type": "object", + "description": "PodDisruptionBudget for the Graylog server.", "properties": { - "enabled": { "type": "boolean" }, - "minAvailable": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Create a PodDisruptionBudget." }, + "minAvailable": { "type": "integer", "minimum": 0, "description": "Minimum number of pods that must remain available during voluntary disruptions." } } }, "podSecurityContext": { @@ -395,17 +433,21 @@ "description": "Container securityContext applied to the graylog-app container. Set to null to omit it entirely ({} is coalesced back to the chart defaults)." }, "podAnnotations": { - "type": "object" + "type": "object", + "description": "Annotations added to the Graylog server pods." }, "nodeSelector": { - "type": "object" + "type": "object", + "description": "Node selector for scheduling the Graylog server pods." }, "tolerations": { "type": "array", + "description": "Tolerations for scheduling the Graylog server pods.", "items": { "type": "object" } }, "affinity": { - "type": "object" + "type": "object", + "description": "Affinity rules for scheduling the Graylog server pods." }, "extraEnv": { "type": "array", @@ -416,19 +458,21 @@ }, "datanode": { "type": "object", - "description": "Graylog Datanode configuration", + "description": "Graylog DataNode configuration", "properties": { - "enabled": { "type": "boolean" }, - "replicas": { "type": "integer" }, + "enabled": { "type": "boolean", "description": "Deploy the Graylog Data Node StatefulSet." }, + "replicas": { "type": "integer", "minimum": 0, "description": "Number of Data Node replicas (StatefulSet pods)." }, "service": { "type": "object", + "description": "Kubernetes Service exposing the Data Node.", "properties": { "ports": { "type": "object", + "description": "Ports exposed by the Data Node Service.", "properties": { - "api": { "type": "integer" }, - "data": { "type": "integer" }, - "config": { "type": "integer" } + "api": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "Data Node REST API port." }, + "data": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "OpenSearch data/transport HTTP port." }, + "config": { "type": "integer", "minimum": 1, "maximum": 65535, "description": "OpenSearch cluster/transport port." } } } } @@ -442,31 +486,34 @@ }, "config": { "type": "object", + "description": "Graylog Data Node configuration (rendered into datanode.conf).", "properties": { - "nodeIdFile": { "type": "string" }, - "opensearchHeap": { "type": "string" }, - "javaOpts": { "type": "string" }, - "skipPreflightChecks": { "type": "string" }, - "nodeSearchCacheSize": { "type": "string" }, - "s3ClientDefaultSecretKey": { "type": "string" }, - "s3ClientDefaultAccessKey": { "type": "string" }, - "s3ClientDefaultEndpoint": { "type": "string" }, - "s3ClientDefaultRegion": { "type": "string" }, - "s3ClientDefaultProtocol": { "type": "string" }, - "s3ClientDefaultPathStyleAccess": { "type": "string" } + "nodeIdFile": { "type": "string", "description": "Path to the file storing the Data Node's node ID (datanode.conf: node_id_file). Defaults to /var/lib/graylog-datanode/node-id when empty." }, + "opensearchHeap": { "type": "string", "description": "Heap size for the embedded OpenSearch process, e.g. \"2g\" (datanode.conf: opensearch_heap)." }, + "javaOpts": { "type": "string", "description": "JVM options for the Data Node process itself (sets -Xms/-Xmx heap)." }, + "skipPreflightChecks": { "type": "string", "enum": [ "true", "false" ], "description": "Skip Data Node preflight checks on startup (datanode.conf: skip_preflight_checks)." }, + "nodeSearchCacheSize": { "type": "string", "description": "Size of the OpenSearch search cache used for tiered/remote data, e.g. \"10gb\" (datanode.conf: node_search_cache_size)." }, + "s3ClientDefaultSecretKey": { "type": "string", "description": "Secret key for the default S3 client used by data tiering/snapshots (datanode.conf: s3_client_default_secret_key). Stored in a Secret." }, + "s3ClientDefaultAccessKey": { "type": "string", "description": "Access key for the default S3 client used by data tiering/snapshots (datanode.conf: s3_client_default_access_key). Stored in a Secret." }, + "s3ClientDefaultEndpoint": { "type": "string", "description": "Endpoint for the default S3 client, e.g. an S3-compatible host (datanode.conf: s3_client_default_endpoint)." }, + "s3ClientDefaultRegion": { "type": "string", "description": "Region for the default S3 client (datanode.conf: s3_client_default_region)." }, + "s3ClientDefaultProtocol": { "type": "string", "enum": [ "http", "https" ], "description": "Protocol used to reach the S3 endpoint (datanode.conf: s3_client_default_protocol)." }, + "s3ClientDefaultPathStyleAccess": { "type": "string", "enum": [ "true", "false" ], "description": "Use path-style access for the S3 client; required by some S3-compatible stores (datanode.conf: s3_client_default_path_style_access)." } } }, "image": { "type": "object", + "description": "Graylog Data Node container image settings.", "properties": { - "repository": { "type": "string" }, - "tag": { "type": "string" }, - "imagePullPolicy": { "type": "string" }, + "repository": { "type": "string", "description": "Image repository. Leave empty to use the chart default." }, + "tag": { "type": "string", "description": "Image tag. Leave empty to use the chart appVersion / .Values.version." }, + "imagePullPolicy": { "type": "string", "enum": [ "Always", "IfNotPresent", "Never" ], "description": "Image pull policy." }, "imagePullSecrets": { "type": "array", + "description": "Image pull secret references for the Data Node image.", "items": { "type": "object", - "properties": { "name": { "type": "string" } }, + "properties": { "name": { "type": "string", "description": "Name of the imagePullSecret." } }, "required": ["name"] } } @@ -474,80 +521,95 @@ }, "updateStrategy": { "type": "object", + "description": "StatefulSet update strategy for the Data Node.", "properties": { - "type": { "type": ["string", "null"] }, + "type": { "type": ["string", "null"], "enum": [ "RollingUpdate", "OnDelete", null ], "description": "Update strategy type." }, "rollingUpdate": { "type": "object", + "description": "Tuning for the RollingUpdate strategy.", "properties": { - "maxUnavailable": { "type": [ "string", "integer", "null" ] }, - "partition": { "type": [ "string", "null" ] } + "maxUnavailable": { "type": [ "string", "integer", "null" ], "description": "Maximum number of pods that can be unavailable during the update." }, + "partition": { "type": [ "string", "null" ], "description": "Ordinal at which to partition the rolling update; pods with a lower ordinal are not updated." } } } } }, "resources": { "type": "object", + "description": "Compute resource requests and limits for the Data Node container.", "properties": { "limits": { "type": "object", + "description": "Resource limits.", "properties": { - "cpu": { "type": "string" }, - "memory": { "type": "string" } + "cpu": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "CPU limit (e.g. \"1\" or \"500m\")." }, + "memory": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Memory limit (e.g. \"5Gi\")." } } }, "requests": { "type": "object", + "description": "Resource requests.", "properties": { - "cpu": { "type": "string" }, - "memory": { "type": "string" } + "cpu": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "CPU request (e.g. \"500m\")." }, + "memory": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Memory request (e.g. \"3.5Gi\")." } } } } }, "persistence": { "type": "object", + "description": "Persistent storage for the Data Node.", "properties": { - "enabled": { "type": "boolean" }, + "enabled": { "type": "boolean", "description": "Use PersistentVolumeClaims for Data Node storage." }, "data": { "type": "object", + "description": "Volume holding OpenSearch data.", "properties": { - "enabled": { "type": "boolean" }, - "storageClass": { "type": "string" }, - "existingClaim": { "type": "string" }, - "mountPath": { "type": "string" }, - "accessModes": { "type": "array" }, - "size": { "type": "string" }, + "enabled": { "type": "boolean", "description": "Create the data PVC." }, + "storageClass": { "type": "string", "description": "StorageClass for the data PVC. Falls back to global.storageClass when unset." }, + "existingClaim": { "type": "string", "description": "Use an existing PVC instead of creating one." }, + "mountPath": { "type": "string", "description": "Path where the data volume is mounted in the container." }, + "accessModes": { "type": "array", "description": "PVC access modes (e.g. ReadWriteOnce)." }, + "size": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Requested size of the data PVC (e.g. \"8Gi\")." }, "annotations": { - "type": "object" + "type": "object", + "description": "Annotations added to the data PVC." }, "labels": { - "type": "object" + "type": "object", + "description": "Labels added to the data PVC." }, "selector": { - "type": "object" + "type": "object", + "description": "Label selector used to bind the data PVC to a matching PersistentVolume." }, "dataSource": { - "type": "object" + "type": "object", + "description": "VolumeSource to populate the data PVC from (e.g. a VolumeSnapshot)." } } }, "nativeLibs": { "type": "object", + "description": "Optional separate volume for OpenSearch native libraries.", "properties": { - "enabled": { "type": "boolean" }, - "storageClass": { "type": "string" }, - "existingClaim": { "type": "string" }, - "mountPath": { "type": "string" }, - "accessModes": { "type": "array" }, - "size": { "type": "string" }, + "enabled": { "type": "boolean", "description": "Create a dedicated PVC for native libraries." }, + "storageClass": { "type": "string", "description": "StorageClass for the native libs PVC. Falls back to global.storageClass when unset." }, + "existingClaim": { "type": "string", "description": "Use an existing PVC instead of creating one." }, + "mountPath": { "type": "string", "description": "Path where the native libs volume is mounted in the container." }, + "accessModes": { "type": "array", "description": "PVC access modes (e.g. ReadWriteOnce)." }, + "size": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Requested size of the native libs PVC (e.g. \"2Gi\")." }, "annotations": { - "type": "object" + "type": "object", + "description": "Annotations added to the native libs PVC." }, "labels": { - "type": "object" + "type": "object", + "description": "Labels added to the native libs PVC." }, "selector": { - "type": "object" + "type": "object", + "description": "Label selector used to bind the native libs PVC to a matching PersistentVolume." } } } @@ -555,31 +617,34 @@ }, "livenessProbe": { "type": "object", + "description": "Liveness probe for the Data Node container.", "properties": { - "enabled": { "type": "boolean" }, - "initialDelaySeconds": { "type": "integer" }, - "periodSeconds": { "type": "integer" }, - "timeoutSeconds": { "type": "integer" }, - "failureThreshold": { "type": "integer" }, - "successThreshold": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Enable the liveness probe." }, + "initialDelaySeconds": { "type": "integer", "minimum": 0, "description": "Seconds to wait after container start before the first probe." }, + "periodSeconds": { "type": "integer", "minimum": 1, "description": "How often (in seconds) to perform the probe." }, + "timeoutSeconds": { "type": "integer", "minimum": 1, "description": "Seconds after which the probe times out." }, + "failureThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive failures before the probe is considered failed." }, + "successThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive successes before the probe is considered successful." } } }, "readinessProbe": { "type": "object", + "description": "Readiness probe for the Data Node container.", "properties": { - "enabled": { "type": "boolean" }, - "initialDelaySeconds": { "type": "integer" }, - "periodSeconds": { "type": "integer" }, - "timeoutSeconds": { "type": "integer" }, - "failureThreshold": { "type": "integer" }, - "successThreshold": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Enable the readiness probe." }, + "initialDelaySeconds": { "type": "integer", "minimum": 0, "description": "Seconds to wait after container start before the first probe." }, + "periodSeconds": { "type": "integer", "minimum": 1, "description": "How often (in seconds) to perform the probe." }, + "timeoutSeconds": { "type": "integer", "minimum": 1, "description": "Seconds after which the probe times out." }, + "failureThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive failures before the probe is considered failed." }, + "successThreshold": { "type": "integer", "minimum": 1, "description": "Consecutive successes before the probe is considered successful." } } }, "podDisruptionBudget": { "type": "object", + "description": "PodDisruptionBudget for the Data Node.", "properties": { - "enabled": { "type": "boolean" }, - "minAvailable": { "type": "integer" } + "enabled": { "type": "boolean", "description": "Create a PodDisruptionBudget." }, + "minAvailable": { "type": "integer", "minimum": 0, "description": "Minimum number of pods that must remain available during voluntary disruptions." } } }, "podSecurityContext": { @@ -591,17 +656,21 @@ "description": "Container securityContext applied to the graylog-datanode container. Set to null to omit it entirely ({} is coalesced back to the chart defaults)." }, "podAnnotations": { - "type": "object" + "type": "object", + "description": "Annotations added to the Data Node pods." }, "nodeSelector": { - "type": "object" + "type": "object", + "description": "Node selector for scheduling the Data Node pods." }, "tolerations": { "type": "array", + "description": "Tolerations for scheduling the Data Node pods.", "items": { "type": "object" } }, "affinity": { - "type": "object" + "type": "object", + "description": "Affinity rules for scheduling the Data Node pods." }, "extraEnv": { "type": "array", @@ -612,51 +681,60 @@ }, "serviceAccount": { "type": "object", + "description": "ServiceAccount used by the Graylog server, with an optional RBAC Role.", "properties": { - "create": { "type": "boolean" }, - "automount": { "type": "boolean" }, - "annotations": { "type": "object" }, - "nameOverride": { "type": "string" }, + "create": { "type": "boolean", "description": "Create a ServiceAccount." }, + "automount": { "type": "boolean", "description": "Automatically mount the ServiceAccount API token." }, + "annotations": { "type": "object", "description": "Annotations added to the ServiceAccount." }, + "nameOverride": { "type": "string", "description": "Use an existing ServiceAccount with this name instead of the generated one." }, "role": { "type": "object", + "description": "Optional RBAC Role and RoleBinding for the ServiceAccount.", "properties": { - "create": { "type": "boolean" }, - "rules": { "type": "array" } + "create": { "type": "boolean", "description": "Create the Role and RoleBinding." }, + "rules": { "type": "array", "description": "RBAC policy rules for the Role." } } } } }, "ingress": { "type": "object", + "description": "Ingress resources for the Graylog web interface and forwarder.", "properties": { - "enabled": { "type": "boolean" }, + "enabled": { "type": "boolean", "description": "Create Ingress resources." }, "config": { "type": "object", + "description": "Shared Ingress configuration.", "properties": { "defaultBackend": { "type": "object", + "description": "Default backend configuration for the Ingress.", "properties": { - "enabled": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Configure a default backend for the Ingress." } } }, "tls": { "type": "object", + "description": "TLS configuration via cert-manager Issuer/ClusterIssuer.", "properties": { "clusterIssuer": { "type": "object", + "description": "Use a cert-manager ClusterIssuer.", "properties": { - "existingName": { "type": ["string", "null"] } + "existingName": { "type": ["string", "null"], "description": "Name of an existing cert-manager ClusterIssuer to use." } } }, "issuer": { "type": "object", + "description": "Use a cert-manager Issuer.", "properties": { - "existingName": { "type": ["string", "null"] }, + "existingName": { "type": ["string", "null"], "description": "Name of an existing cert-manager Issuer to use." }, "managed": { "type": "object", + "description": "Let the chart create a cert-manager Issuer (ACME/Let's Encrypt).", "properties": { - "enabled": { "type": "boolean" }, - "staging": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Create a managed Issuer." }, + "staging": { "type": "boolean", "description": "Use the Let's Encrypt staging environment." } } } } @@ -667,58 +745,64 @@ }, "web": { "type": "object", + "description": "Ingress for the Graylog web interface / REST API.", "properties": { - "enabled": { "type": "boolean" }, - "className": { "type": "string" }, - "annotations": { "type": "object" }, + "enabled": { "type": "boolean", "description": "Create the web Ingress." }, + "className": { "type": "string", "description": "IngressClass name." }, + "annotations": { "type": "object", "description": "Annotations added to the web Ingress." }, "hosts": { "type": "array", + "description": "Host rules for the web Ingress.", "items": { "type": "object", "properties": { - "host": { "type": "string" }, + "host": { "type": "string", "description": "Hostname for this rule." }, "paths": { "type": "array", + "description": "Path rules for the host.", "items": { "type": "object", "properties": { - "path": { "type": "string" }, - "pathType": { "type": "string" } + "path": { "type": "string", "description": "URL path." }, + "pathType": { "type": "string", "enum": [ "Prefix", "Exact", "ImplementationSpecific" ], "description": "Path matching type." } } } } } } }, - "tls": { "type": "array" } + "tls": { "type": "array", "description": "TLS blocks for the web Ingress." } } }, "forwarder": { "type": "object", + "description": "Ingress for the Graylog Forwarder.", "properties": { - "enabled": { "type": "boolean" }, - "className": { "type": "string" }, - "annotations": { "type": "object" }, + "enabled": { "type": "boolean", "description": "Create the forwarder Ingress." }, + "className": { "type": "string", "description": "IngressClass name." }, + "annotations": { "type": "object", "description": "Annotations added to the forwarder Ingress." }, "hosts": { "type": "array", + "description": "Host rules for the forwarder Ingress.", "items": { "type": "object", "properties": { - "host": { "type": "string" }, + "host": { "type": "string", "description": "Hostname for this rule." }, "paths": { "type": "array", + "description": "Path rules for the host.", "items": { "type": "object", "properties": { - "path": { "type": "string" }, - "pathType": { "type": "string" } + "path": { "type": "string", "description": "URL path." }, + "pathType": { "type": "string", "enum": [ "Prefix", "Exact", "ImplementationSpecific" ], "description": "Path matching type." } } } } } } }, - "tls": { "type": "array" } + "tls": { "type": "array", "description": "TLS blocks for the forwarder Ingress." } } } } @@ -729,38 +813,43 @@ "properties": { "communityResource": { "type": "object", + "description": "MongoDBCommunity custom resource settings.", "properties": { - "enabled": { "type": "boolean" } + "enabled": { "type": "boolean", "description": "Create a MongoDBCommunity custom resource (requires the MongoDB Kubernetes Operator)." } } }, - "version": { "type": "string" }, - "replicas": { "type": "integer" }, - "arbiters": { "type": "integer" }, + "version": { "type": "string", "description": "MongoDB server version." }, + "replicas": { "type": "integer", "minimum": 1, "description": "Number of MongoDB replica set members." }, + "arbiters": { "type": "integer", "minimum": 0, "description": "Number of arbiter members in the replica set." }, "persistence": { "type": "object", + "description": "Persistent storage for MongoDB.", "properties": { - "storageClass": { "type": "string" }, + "storageClass": { "type": "string", "description": "StorageClass for the MongoDB PVCs." }, "size": { "type": "object", + "description": "Volume sizes for MongoDB.", "properties": { - "data": { "type": "string" }, - "logs": { "type": "string" } + "data": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Size of the MongoDB data volume (e.g. \"10G\")." }, + "logs": { "type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?(m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$", "description": "Size of the MongoDB logs volume (e.g. \"2G\")." } } } } }, "serviceAccount": { "type": "object", + "description": "ServiceAccount used by the MongoDB pods, with an optional RBAC Role.", "properties": { - "create": { "type": "boolean" }, - "automount": { "type": "boolean" }, - "annotations": { "type": "object" }, - "nameOverride": { "type": "string" }, + "create": { "type": "boolean", "description": "Create a ServiceAccount." }, + "automount": { "type": "boolean", "description": "Automatically mount the ServiceAccount API token." }, + "annotations": { "type": "object", "description": "Annotations added to the ServiceAccount." }, + "nameOverride": { "type": "string", "description": "Use an existing ServiceAccount with this name instead of the generated one." }, "role": { "type": "object", + "description": "Optional RBAC Role and RoleBinding for the ServiceAccount.", "properties": { - "create": { "type": "boolean" }, - "rules": { "type": "array" } + "create": { "type": "boolean", "description": "Create the Role and RoleBinding." }, + "rules": { "type": "array", "description": "RBAC policy rules for the Role." } } } }