You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by js...@apache.org on 2026/04/20 19:27:02 UTC

(airflow) branch chart/v1-2x-test updated: [chart/v1-2x-test] Fix Helm chart image volume schema validation (#65409) (#65568)

This is an automated email from the ASF dual-hosted git repository.

jscheffl pushed a commit to branch chart/v1-2x-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/chart/v1-2x-test by this push:
     new 62c223dc636 [chart/v1-2x-test] Fix Helm chart image volume schema validation (#65409) (#65568)
62c223dc636 is described below

commit 62c223dc63656d1cccf0a7f66dd0df124f4b1be7
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Mon Apr 20 21:26:54 2026 +0200

    [chart/v1-2x-test] Fix Helm chart image volume schema validation (#65409) (#65568)
    
    (cherry picked from commit df421a3a17b0dab36698106c494a72c40031fccc)
    
    Co-authored-by: Subham <su...@gmail.com>
---
 chart/values.schema.json                  | 232 +++++++++++++++++++++++-------
 scripts/ci/prek/vendor_k8s_json_schema.py |   2 +-
 2 files changed, 178 insertions(+), 56 deletions(-)

diff --git a/chart/values.schema.json b/chart/values.schema.json
index da245664137..6ee2b521723 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -12298,6 +12298,32 @@
             "type": "object",
             "additionalProperties": false
         },
+        "io.k8s.api.core.v1.AppArmorProfile": {
+            "description": "AppArmorProfile defines a pod or container's AppArmor settings.",
+            "properties": {
+                "localhostProfile": {
+                    "description": "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\".",
+                    "type": "string"
+                },
+                "type": {
+                    "description": "type indicates which kind of AppArmor profile will be applied. Valid options are:\n  Localhost - a profile pre-loaded on the node.\n  RuntimeDefault - the container runtime's default profile.\n  Unconfined - no AppArmor enforcement.",
+                    "type": "string"
+                }
+            },
+            "required": [
+                "type"
+            ],
+            "type": "object",
+            "x-kubernetes-unions": [
+                {
+                    "discriminator": "type",
+                    "fields-to-discriminateBy": {
+                        "localhostProfile": "LocalhostProfile"
+                    }
+                }
+            ],
+            "additionalProperties": false
+        },
         "io.k8s.api.core.v1.AzureDiskVolumeSource": {
             "description": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.",
             "properties": {
@@ -12397,14 +12423,16 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "drop": {
                     "description": "Removed capabilities",
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -12418,7 +12446,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "path": {
                     "description": "path is Optional: Used as the mounted root, rather than the full Ceph tree, default is /",
@@ -12507,7 +12536,7 @@
             "description": "ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.",
             "properties": {
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -12526,7 +12555,7 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -12549,10 +12578,11 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -12576,10 +12606,11 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -12598,14 +12629,16 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "command": {
                     "description": "Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. 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 [...]
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "env": {
                     "description": "List of environment variables to set in the container. Cannot be updated.",
@@ -12613,6 +12646,10 @@
                         "$ref": "#/definitions/io.k8s.api.core.v1.EnvVar"
                     },
                     "type": "array",
+                    "x-kubernetes-list-map-keys": [
+                        "name"
+                    ],
+                    "x-kubernetes-list-type": "map",
                     "x-kubernetes-patch-merge-key": "name",
                     "x-kubernetes-patch-strategy": "merge"
                 },
@@ -12621,7 +12658,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.EnvFromSource"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "image": {
                     "description": "Container image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.",
@@ -12711,6 +12749,10 @@
                         "$ref": "#/definitions/io.k8s.api.core.v1.VolumeDevice"
                     },
                     "type": "array",
+                    "x-kubernetes-list-map-keys": [
+                        "devicePath"
+                    ],
+                    "x-kubernetes-list-type": "map",
                     "x-kubernetes-patch-merge-key": "devicePath",
                     "x-kubernetes-patch-strategy": "merge"
                 },
@@ -12720,6 +12762,10 @@
                         "$ref": "#/definitions/io.k8s.api.core.v1.VolumeMount"
                     },
                     "type": "array",
+                    "x-kubernetes-list-map-keys": [
+                        "mountPath"
+                    ],
+                    "x-kubernetes-list-type": "map",
                     "x-kubernetes-patch-merge-key": "mountPath",
                     "x-kubernetes-patch-strategy": "merge"
                 },
@@ -12793,7 +12839,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -12804,7 +12851,7 @@
             "properties": {
                 "fieldRef": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.ObjectFieldSelector",
-                    "description": "Required: Selects a field of the pod: only annotations, labels, name and namespace are supported."
+                    "description": "Required: Selects a field of the pod: only annotations, labels, name, namespace and uid are supported."
                 },
                 "mode": {
                     "description": "Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.",
@@ -12839,7 +12886,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -12943,7 +12991,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -12970,14 +13019,16 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "wwids": {
                     "description": "wwids Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.",
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -13133,7 +13184,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.HTTPHeader"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "path": {
                     "description": "Path to access on the HTTP server.",
@@ -13181,13 +13233,17 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "ip": {
                     "description": "IP address of the host file entry.",
                     "type": "string"
                 }
             },
+            "required": [
+                "ip"
+            ],
             "type": "object",
             "additionalProperties": false
         },
@@ -13246,7 +13302,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "readOnly": {
                     "description": "readOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.",
@@ -13269,6 +13326,21 @@
             "type": "object",
             "additionalProperties": false
         },
+        "io.k8s.api.core.v1.ImageVolumeSource": {
+            "description": "ImageVolumeSource represents a image volume resource.",
+            "properties": {
+                "pullPolicy": {
+                    "description": "Policy for pulling OCI objects. Possible values are: Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the p [...]
+                    "type": "string"
+                },
+                "reference": {
+                    "description": "Required: Image or artifact reference to be used. Behaves in the same way as pod.spec.containers[*].image. Pull secrets will be assembled in the same way as for the container image by looking up node credentials, SA image pull secrets, and pod spec image pull secrets. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload control [...]
+                    "type": "string"
+                }
+            },
+            "type": "object",
+            "additionalProperties": false
+        },
         "io.k8s.api.core.v1.KeyToPath": {
             "description": "Maps a string key to a path within a volume.",
             "properties": {
@@ -13384,7 +13456,7 @@
             "description": "LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.",
             "properties": {
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 }
             },
@@ -13423,7 +13495,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.PreferredSchedulingTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "requiredDuringSchedulingIgnoredDuringExecution": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector",
@@ -13441,7 +13514,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "required": [
@@ -13467,7 +13541,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "required": [
@@ -13485,14 +13560,16 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "matchFields": {
                     "description": "A list of node selector requirements by node's fields.",
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -13526,7 +13603,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "dataSource": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference",
@@ -13549,7 +13627,7 @@
                     "type": "string"
                 },
                 "volumeAttributesClassName": {
-                    "description": "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 value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to em [...]
+                    "description": "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 value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to em [...]
                     "type": "string"
                 },
                 "volumeMode": {
@@ -13626,14 +13704,16 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "requiredDuringSchedulingIgnoredDuringExecution": {
                     "description": "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. al [...]
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -13647,7 +13727,7 @@
                     "description": "A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods."
                 },
                 "matchLabelKeys": {
-                    "description": "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.  [...]
+                    "description": "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.  [...]
                     "items": {
                         "type": "string"
                     },
@@ -13655,7 +13735,7 @@
                     "x-kubernetes-list-type": "atomic"
                 },
                 "mismatchLabelKeys": {
-                    "description": "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 e [...]
+                    "description": "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 e [...]
                     "items": {
                         "type": "string"
                     },
@@ -13671,7 +13751,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "topologyKey": {
                     "description": "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.",
@@ -13692,14 +13773,16 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "requiredDuringSchedulingIgnoredDuringExecution": {
                     "description": "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 intersecte [...]
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -13708,6 +13791,10 @@
         "io.k8s.api.core.v1.PodSecurityContext": {
             "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext.  Field values of container.securityContext take precedence over field values of PodSecurityContext.",
             "properties": {
+                "appArmorProfile": {
+                    "$ref": "#/definitions/io.k8s.api.core.v1.AppArmorProfile",
+                    "description": "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."
+                },
                 "fsGroup": {
                     "description": "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:\n\n1. 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----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume. Note that this field cannot b [...]
                     "format": "int64",
@@ -13740,19 +13827,25 @@
                     "description": "The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows."
                 },
                 "supplementalGroups": {
-                    "description": "A list of groups applied to the first process run in each container, in addition to the container's primary GID, the fsGroup (if specified), and group memberships defined in the container image for the uid of the container process. If unspecified, no additional groups are added to any container. Note that group memberships defined in the container image for the uid of the container process are still effective, even if they are not included in this list [...]
+                    "description": "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 [...]
                     "items": {
                         "format": "int64",
                         "type": "integer"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
+                },
+                "supplementalGroupsPolicy": {
+                    "description": "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.",
+                    "type": "string"
                 },
                 "sysctls": {
                     "description": "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.",
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.Sysctl"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "windowsOptions": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions",
@@ -13866,11 +13959,12 @@
                     "type": "integer"
                 },
                 "sources": {
-                    "description": "sources is the list of volume projections",
+                    "description": "sources is the list of volume projections. Each entry in this list handles one source.",
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.VolumeProjection"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "type": "object",
@@ -13931,7 +14025,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "pool": {
                     "description": "pool is the rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it",
@@ -13963,6 +14058,10 @@
                 "name": {
                     "description": "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.",
                     "type": "string"
+                },
+                "request": {
+                    "description": "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.",
+                    "type": "string"
                 }
             },
             "required": [
@@ -14131,7 +14230,7 @@
             "description": "SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.",
             "properties": {
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -14150,7 +14249,7 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -14173,10 +14272,11 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "name": {
-                    "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
+                    "description": "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",
                     "type": "string"
                 },
                 "optional": {
@@ -14200,7 +14300,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "optional": {
                     "description": "optional field specify whether the Secret or its keys must be defined",
@@ -14221,6 +14322,10 @@
                     "description": "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.",
                     "type": "boolean"
                 },
+                "appArmorProfile": {
+                    "$ref": "#/definitions/io.k8s.api.core.v1.AppArmorProfile",
+                    "description": "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."
+                },
                 "capabilities": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.Capabilities",
                     "description": "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."
@@ -14230,7 +14335,7 @@
                     "type": "boolean"
                 },
                 "procMount": {
-                    "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. Note that this field cannot be set when spec.os.name is windows.",
+                    "description": "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. This requires the ProcMountType feature flag to be enabled. Note that this field cannot be set when spec.os.name is windows.",
                     "type": "string"
                 },
                 "readOnlyRootFilesystem": {
@@ -14418,7 +14523,7 @@
                     "type": "integer"
                 },
                 "minDomains": {
-                    "description": "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 minD [...]
+                    "description": "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 minD [...]
                     "format": "int32",
                     "type": "integer"
                 },
@@ -14568,6 +14673,10 @@
                     "$ref": "#/definitions/io.k8s.api.core.v1.HostPathVolumeSource",
                     "description": "hostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath"
                 },
+                "image": {
+                    "$ref": "#/definitions/io.k8s.api.core.v1.ImageVolumeSource",
+                    "description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't pres [...]
+                },
                 "iscsi": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.ISCSIVolumeSource",
                     "description": "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md"
@@ -14654,7 +14763,7 @@
                     "type": "string"
                 },
                 "mountPropagation": {
-                    "description": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.",
+                    "description": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. When RecursiveReadOnly is set to IfPossible or to Enabled, MountPropagation must be None or unspecified (which defaults to None).",
                     "type": "string"
                 },
                 "name": {
@@ -14665,6 +14774,10 @@
                     "description": "Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.",
                     "type": "boolean"
                 },
+                "recursiveReadOnly": {
+                    "description": "RecursiveReadOnly specifies whether read-only mounts should be handled recursively.\n\nIf ReadOnly is false, this field has no meaning and must be unspecified.\n\nIf ReadOnly is true, and this field is set to Disabled, the mount is not made recursively read-only.  If this field is set to IfPossible, the mount is made recursively read-only, if it is supported by the container runtime.  If this field is set to Enabled, the mount is made recursively read- [...]
+                    "type": "string"
+                },
                 "subPath": {
                     "description": "Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).",
                     "type": "string"
@@ -14682,7 +14795,7 @@
             "additionalProperties": false
         },
         "io.k8s.api.core.v1.VolumeProjection": {
-            "description": "Projection that may be projected along with other supported volume types",
+            "description": "Projection that may be projected along with other supported volume types. Exactly one of these fields must be set.",
             "properties": {
                 "clusterTrustBundle": {
                     "$ref": "#/definitions/io.k8s.api.core.v1.ClusterTrustBundleProjection",
@@ -14810,7 +14923,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "required": [
@@ -14880,7 +14994,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "matchLabels": {
                     "additionalProperties": {
@@ -14910,7 +15025,8 @@
                     "items": {
                         "type": "string"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 }
             },
             "required": [
@@ -14984,6 +15100,7 @@
                         "type": "string"
                     },
                     "type": "array",
+                    "x-kubernetes-list-type": "set",
                     "x-kubernetes-patch-strategy": "merge"
                 },
                 "generateName": {
@@ -15007,7 +15124,8 @@
                     "items": {
                         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry"
                     },
-                    "type": "array"
+                    "type": "array",
+                    "x-kubernetes-list-type": "atomic"
                 },
                 "name": {
                     "description": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names",
@@ -15023,6 +15141,10 @@
                         "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference"
                     },
                     "type": "array",
+                    "x-kubernetes-list-map-keys": [
+                        "uid"
+                    ],
+                    "x-kubernetes-list-type": "map",
                     "x-kubernetes-patch-merge-key": "uid",
                     "x-kubernetes-patch-strategy": "merge"
                 },
diff --git a/scripts/ci/prek/vendor_k8s_json_schema.py b/scripts/ci/prek/vendor_k8s_json_schema.py
index b7949d91172..197a796183b 100755
--- a/scripts/ci/prek/vendor_k8s_json_schema.py
+++ b/scripts/ci/prek/vendor_k8s_json_schema.py
@@ -32,7 +32,7 @@ from common_prek_utils import AIRFLOW_ROOT_PATH
 
 K8S_DEFINITIONS = (
     "https://raw.githubusercontent.com/yannh/kubernetes-json-schema"
-    "/master/v1.29.0-standalone-strict/_definitions.json"
+    "/master/v1.31.0-standalone-strict/_definitions.json"
 )
 VALUES_SCHEMA_FILE = AIRFLOW_ROOT_PATH / "chart/values.schema.json"