mirror of
				https://github.com/siderolabs/talos.git
				synced 2025-10-31 00:11:36 +01:00 
			
		
		
		
	fix: don't use runtime-specs Mount struct in machine config
First of all, it breaks our backwards compatibility promises and breaks documentation generation. Upstream `specs.Mount` might change at any time. The issue was that containerd 1.7.x brings in new `specs.Mount` which contains extra fields which don't have `omitempty` for YAML, so machinery always generates them which confuses old Talos versions. Use a copy of the upstream struct with proper YAML tags, and also provide a special trick to make sure if the upstream struct changes, we have a chance to update our copy of the struct. Also this fixes docs and JSON schema. Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
This commit is contained in:
		
							parent
							
								
									d1b27926c2
								
							
						
					
					
						commit
						7bb205ebe2
					
				| @ -96,11 +96,9 @@ func (suite *KubeletConfigSuite) TestReconcile() { | ||||
| 						}, | ||||
| 						KubeletExtraMounts: []v1alpha1.ExtraMount{ | ||||
| 							{ | ||||
| 								Mount: specs.Mount{ | ||||
| 									Destination: "/tmp", | ||||
| 									Source:      "/var", | ||||
| 									Type:        "tmpfs", | ||||
| 								}, | ||||
| 								Destination: "/tmp", | ||||
| 								Source:      "/var", | ||||
| 								Type:        "tmpfs", | ||||
| 							}, | ||||
| 						}, | ||||
| 						KubeletExtraConfig: v1alpha1.Unstructured{ | ||||
|  | ||||
| @ -1353,7 +1353,59 @@ | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "ExtraMount": { | ||||
|       "properties": {}, | ||||
|       "properties": { | ||||
|         "destination": { | ||||
|           "type": "string", | ||||
|           "title": "destination", | ||||
|           "description": "Destination is the absolute path where the mount will be placed in the container.\n", | ||||
|           "markdownDescription": "Destination is the absolute path where the mount will be placed in the container.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eDestination is the absolute path where the mount will be placed in the container.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "type": { | ||||
|           "type": "string", | ||||
|           "title": "type", | ||||
|           "description": "Type specifies the mount kind.\n", | ||||
|           "markdownDescription": "Type specifies the mount kind.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eType specifies the mount kind.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "source": { | ||||
|           "type": "string", | ||||
|           "title": "source", | ||||
|           "description": "Source specifies the source path of the mount.\n", | ||||
|           "markdownDescription": "Source specifies the source path of the mount.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eSource specifies the source path of the mount.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "options": { | ||||
|           "items": { | ||||
|             "type": "string" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "options", | ||||
|           "description": "Options are fstab style mount options.\n", | ||||
|           "markdownDescription": "Options are fstab style mount options.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eOptions are fstab style mount options.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "uidMappings": { | ||||
|           "items": { | ||||
|             "$ref": "#/$defs/LinuxIDMapping" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "uidMappings", | ||||
|           "description": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.\n", | ||||
|           "markdownDescription": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eUID/GID mappings used for changing file owners w/o calling chown, fs should support it.\u003c/p\u003e\n\n\u003cp\u003eEvery mount point could have its own mapping.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "gidMappings": { | ||||
|           "items": { | ||||
|             "$ref": "#/$defs/LinuxIDMapping" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "gidMappings", | ||||
|           "description": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.\n", | ||||
|           "markdownDescription": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eUID/GID mappings used for changing file owners w/o calling chown, fs should support it.\u003c/p\u003e\n\n\u003cp\u003eEvery mount point could have its own mapping.\u003c/p\u003e\n" | ||||
|         } | ||||
|       }, | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
| @ -1771,6 +1823,33 @@ | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "LinuxIDMapping": { | ||||
|       "properties": { | ||||
|         "containerID": { | ||||
|           "type": "integer", | ||||
|           "title": "containerID", | ||||
|           "description": "ContainerID is the starting UID/GID in the container.\n", | ||||
|           "markdownDescription": "ContainerID is the starting UID/GID in the container.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eContainerID is the starting UID/GID in the container.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "hostID": { | ||||
|           "type": "integer", | ||||
|           "title": "hostID", | ||||
|           "description": "HostID is the starting UID/GID on the host to be mapped to ‘ContainerID’.\n", | ||||
|           "markdownDescription": "HostID is the starting UID/GID on the host to be mapped to 'ContainerID'.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eHostID is the starting UID/GID on the host to be mapped to \u0026lsquo;ContainerID\u0026rsquo;.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "size": { | ||||
|           "type": "integer", | ||||
|           "title": "size", | ||||
|           "description": "Size is the number of IDs to be mapped.\n", | ||||
|           "markdownDescription": "Size is the number of IDs to be mapped.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eSize is the number of IDs to be mapped.\u003c/p\u003e\n" | ||||
|         } | ||||
|       }, | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "LoggingConfig": { | ||||
|       "properties": { | ||||
|         "destinations": { | ||||
|  | ||||
| @ -9,7 +9,6 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	specs "github.com/opencontainers/runtime-spec/specs-go" | ||||
| 	"github.com/siderolabs/crypto/x509" | ||||
| 	"github.com/siderolabs/go-pointer" | ||||
| 	"gopkg.in/yaml.v3" | ||||
| @ -475,15 +474,13 @@ func clusterEndpointExample2() *Endpoint { | ||||
| func kubeletExtraMountsExample() []ExtraMount { | ||||
| 	return []ExtraMount{ | ||||
| 		{ | ||||
| 			specs.Mount{ | ||||
| 				Source:      "/var/lib/example", | ||||
| 				Destination: "/var/lib/example", | ||||
| 				Type:        "bind", | ||||
| 				Options: []string{ | ||||
| 					"bind", | ||||
| 					"rshared", | ||||
| 					"rw", | ||||
| 				}, | ||||
| 			Source:      "/var/lib/example", | ||||
| 			Destination: "/var/lib/example", | ||||
| 			Type:        "bind", | ||||
| 			Options: []string{ | ||||
| 				"bind", | ||||
| 				"rshared", | ||||
| 				"rw", | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| @ -383,7 +383,33 @@ func (k *KubeletConfig) ExtraArgs() map[string]string { | ||||
| 
 | ||||
| // ExtraMounts implements the config.Provider interface. | ||||
| func (k *KubeletConfig) ExtraMounts() []specs.Mount { | ||||
| 	return xslices.Map(k.KubeletExtraMounts, func(m ExtraMount) specs.Mount { return m.Mount }) | ||||
| 	// use the intermediate type which is assignable to specs.Mount so that | ||||
| 	// we can be sure that `specs.Mount` and `Mount` have exactly same fields. | ||||
| 	// | ||||
| 	// as in Go []T1 is not assignable to []T2, even if T1 and T2 are assignable, we cannot | ||||
| 	// use direct conversion of Mount and specs.Mount | ||||
| 	type mountConverter struct { | ||||
| 		Destination string | ||||
| 		Type        string | ||||
| 		Source      string | ||||
| 		Options     []string | ||||
| 		UIDMappings []specs.LinuxIDMapping | ||||
| 		GIDMappings []specs.LinuxIDMapping | ||||
| 	} | ||||
| 
 | ||||
| 	return xslices.Map(k.KubeletExtraMounts, | ||||
| 		func(m ExtraMount) specs.Mount { | ||||
| 			return specs.Mount(func() mountConverter { | ||||
| 				return mountConverter{ | ||||
| 					Destination: m.Destination, | ||||
| 					Type:        m.Type, | ||||
| 					Source:      m.Source, | ||||
| 					Options:     m.Options, | ||||
| 					UIDMappings: xslices.Map(m.UIDMappings, func(m LinuxIDMapping) specs.LinuxIDMapping { return specs.LinuxIDMapping(m) }), | ||||
| 					GIDMappings: xslices.Map(m.GIDMappings, func(m LinuxIDMapping) specs.LinuxIDMapping { return specs.LinuxIDMapping(m) }), | ||||
| 				} | ||||
| 			}()) | ||||
| 		}) | ||||
| } | ||||
| 
 | ||||
| // ExtraConfig implements the config.Provider interface. | ||||
|  | ||||
| @ -27,7 +27,6 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/dustin/go-humanize" | ||||
| 	"github.com/opencontainers/runtime-spec/specs-go" | ||||
| 	"github.com/siderolabs/crypto/x509" | ||||
| 	"github.com/siderolabs/go-blockdevice/blockdevice/util/disk" | ||||
| 	"gopkg.in/yaml.v3" | ||||
| @ -492,26 +491,44 @@ type ClusterConfig struct { | ||||
| 	AllowSchedulingOnControlPlanes *bool `yaml:"allowSchedulingOnControlPlanes,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // LinuxIDMapping represents the Linux ID mapping. | ||||
| type LinuxIDMapping struct { | ||||
| 	//   description: | | ||||
| 	//     ContainerID is the starting UID/GID in the container. | ||||
| 	ContainerID uint32 `yaml:"containerID"` | ||||
| 	//   description: | | ||||
| 	//     HostID is the starting UID/GID on the host to be mapped to 'ContainerID'. | ||||
| 	HostID uint32 `yaml:"hostID"` | ||||
| 	//   description: | | ||||
| 	//     Size is the number of IDs to be mapped. | ||||
| 	Size uint32 `yaml:"size"` | ||||
| } | ||||
| 
 | ||||
| // ExtraMount wraps OCI Mount specification. | ||||
| type ExtraMount struct { | ||||
| 	specs.Mount `yaml:",inline"` | ||||
| } | ||||
| 	//   description: | | ||||
| 	//     Destination is the absolute path where the mount will be placed in the container. | ||||
| 	Destination string `yaml:"destination"` | ||||
| 	//   description: | | ||||
| 	//     Type specifies the mount kind. | ||||
| 	Type string `yaml:"type,omitempty"` | ||||
| 	//   description: | | ||||
| 	//     Source specifies the source path of the mount. | ||||
| 	Source string `yaml:"source,omitempty"` | ||||
| 	//   description: | | ||||
| 	//     Options are fstab style mount options. | ||||
| 	Options []string `yaml:"options,omitempty"` | ||||
| 
 | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *ExtraMount) DeepCopyInto(out *ExtraMount) { | ||||
| 	*out = *in | ||||
| } | ||||
| 
 | ||||
| // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtraMount. | ||||
| func (in *ExtraMount) DeepCopy() *ExtraMount { | ||||
| 	if in == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	out := new(ExtraMount) | ||||
| 	in.DeepCopyInto(out) | ||||
| 
 | ||||
| 	return out | ||||
| 	//   description: | | ||||
| 	//     UID/GID mappings used for changing file owners w/o calling chown, fs should support it. | ||||
| 	// | ||||
| 	//     Every mount point could have its own mapping. | ||||
| 	UIDMappings []LinuxIDMapping `yaml:"uidMappings,omitempty"` | ||||
| 	//   description: | | ||||
| 	//     UID/GID mappings used for changing file owners w/o calling chown, fs should support it. | ||||
| 	// | ||||
| 	//     Every mount point could have its own mapping. | ||||
| 	GIDMappings []LinuxIDMapping `yaml:"gidMappings,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // MachineControlPlaneConfig machine specific configuration options. | ||||
|  | ||||
| @ -545,6 +545,49 @@ func (ClusterConfig) Doc() *encoder.Doc { | ||||
| 	return doc | ||||
| } | ||||
| 
 | ||||
| func (LinuxIDMapping) Doc() *encoder.Doc { | ||||
| 	doc := &encoder.Doc{ | ||||
| 		Type:        "LinuxIDMapping", | ||||
| 		Comments:    [3]string{"" /* encoder.HeadComment */, "LinuxIDMapping represents the Linux ID mapping." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 		Description: "LinuxIDMapping represents the Linux ID mapping.", | ||||
| 		AppearsIn: []encoder.Appearance{ | ||||
| 			{ | ||||
| 				TypeName:  "ExtraMount", | ||||
| 				FieldName: "uidMappings", | ||||
| 			}, | ||||
| 			{ | ||||
| 				TypeName:  "ExtraMount", | ||||
| 				FieldName: "gidMappings", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Fields: []encoder.Doc{ | ||||
| 			{ | ||||
| 				Name:        "containerID", | ||||
| 				Type:        "uint32", | ||||
| 				Note:        "", | ||||
| 				Description: "ContainerID is the starting UID/GID in the container.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "ContainerID is the starting UID/GID in the container." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "hostID", | ||||
| 				Type:        "uint32", | ||||
| 				Note:        "", | ||||
| 				Description: "HostID is the starting UID/GID on the host to be mapped to 'ContainerID'.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "HostID is the starting UID/GID on the host to be mapped to 'ContainerID'." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "size", | ||||
| 				Type:        "uint32", | ||||
| 				Note:        "", | ||||
| 				Description: "Size is the number of IDs to be mapped.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "Size is the number of IDs to be mapped." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	return doc | ||||
| } | ||||
| 
 | ||||
| func (ExtraMount) Doc() *encoder.Doc { | ||||
| 	doc := &encoder.Doc{ | ||||
| 		Type:        "ExtraMount", | ||||
| @ -556,7 +599,50 @@ func (ExtraMount) Doc() *encoder.Doc { | ||||
| 				FieldName: "extraMounts", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Fields: []encoder.Doc{}, | ||||
| 		Fields: []encoder.Doc{ | ||||
| 			{ | ||||
| 				Name:        "destination", | ||||
| 				Type:        "string", | ||||
| 				Note:        "", | ||||
| 				Description: "Destination is the absolute path where the mount will be placed in the container.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "Destination is the absolute path where the mount will be placed in the container." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "type", | ||||
| 				Type:        "string", | ||||
| 				Note:        "", | ||||
| 				Description: "Type specifies the mount kind.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "Type specifies the mount kind." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "source", | ||||
| 				Type:        "string", | ||||
| 				Note:        "", | ||||
| 				Description: "Source specifies the source path of the mount.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "Source specifies the source path of the mount." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "options", | ||||
| 				Type:        "[]string", | ||||
| 				Note:        "", | ||||
| 				Description: "Options are fstab style mount options.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "Options are fstab style mount options." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "uidMappings", | ||||
| 				Type:        "[]LinuxIDMapping", | ||||
| 				Note:        "", | ||||
| 				Description: "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "UID/GID mappings used for changing file owners w/o calling chown, fs should support it." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Name:        "gidMappings", | ||||
| 				Type:        "[]LinuxIDMapping", | ||||
| 				Note:        "", | ||||
| 				Description: "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
| 				Comments:    [3]string{"" /* encoder.HeadComment */, "UID/GID mappings used for changing file owners w/o calling chown, fs should support it." /* encoder.LineComment */, "" /* encoder.FootComment */}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	doc.AddExample("", kubeletExtraMountsExample()) | ||||
| @ -3833,6 +3919,7 @@ func GetConfigurationDoc() *encoder.FileDoc { | ||||
| 			MachineConfig{}.Doc(), | ||||
| 			MachineSeccompProfile{}.Doc(), | ||||
| 			ClusterConfig{}.Doc(), | ||||
| 			LinuxIDMapping{}.Doc(), | ||||
| 			ExtraMount{}.Doc(), | ||||
| 			MachineControlPlaneConfig{}.Doc(), | ||||
| 			MachineControllerManagerConfig{}.Doc(), | ||||
|  | ||||
| @ -987,6 +987,37 @@ func (in *ExtraHost) DeepCopy() *ExtraHost { | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *ExtraMount) DeepCopyInto(out *ExtraMount) { | ||||
| 	*out = *in | ||||
| 	if in.Options != nil { | ||||
| 		in, out := &in.Options, &out.Options | ||||
| 		*out = make([]string, len(*in)) | ||||
| 		copy(*out, *in) | ||||
| 	} | ||||
| 	if in.UIDMappings != nil { | ||||
| 		in, out := &in.UIDMappings, &out.UIDMappings | ||||
| 		*out = make([]LinuxIDMapping, len(*in)) | ||||
| 		copy(*out, *in) | ||||
| 	} | ||||
| 	if in.GIDMappings != nil { | ||||
| 		in, out := &in.GIDMappings, &out.GIDMappings | ||||
| 		*out = make([]LinuxIDMapping, len(*in)) | ||||
| 		copy(*out, *in) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtraMount. | ||||
| func (in *ExtraMount) DeepCopy() *ExtraMount { | ||||
| 	if in == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	out := new(ExtraMount) | ||||
| 	in.DeepCopyInto(out) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *FeaturesConfig) DeepCopyInto(out *FeaturesConfig) { | ||||
| 	*out = *in | ||||
| @ -1378,6 +1409,22 @@ func (in *KubernetesTalosAPIAccessConfig) DeepCopy() *KubernetesTalosAPIAccessCo | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *LinuxIDMapping) DeepCopyInto(out *LinuxIDMapping) { | ||||
| 	*out = *in | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LinuxIDMapping. | ||||
| func (in *LinuxIDMapping) DeepCopy() *LinuxIDMapping { | ||||
| 	if in == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	out := new(LinuxIDMapping) | ||||
| 	in.DeepCopyInto(out) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *LoggingConfig) DeepCopyInto(out *LoggingConfig) { | ||||
| 	*out = *in | ||||
|  | ||||
| @ -113,15 +113,14 @@ kubelet: | ||||
| 
 | ||||
|     # # The `extraMounts` field is used to add additional mounts to the kubelet container. | ||||
|     # extraMounts: | ||||
|     #     - destination: /var/lib/example | ||||
|     #       type: bind | ||||
|     #       source: /var/lib/example | ||||
|     #     - destination: /var/lib/example # Destination is the absolute path where the mount will be placed in the container. | ||||
|     #       type: bind # Type specifies the mount kind. | ||||
|     #       source: /var/lib/example # Source specifies the source path of the mount. | ||||
|     #       # Options are fstab style mount options. | ||||
|     #       options: | ||||
|     #         - bind | ||||
|     #         - rshared | ||||
|     #         - rw | ||||
|     #       uidmappings: [] | ||||
|     #       gidmappings: [] | ||||
| 
 | ||||
|     # # The `extraConfig` field is used to provide kubelet configuration overrides. | ||||
|     # extraConfig: | ||||
| @ -654,6 +653,26 @@ allowSchedulingOnControlPlanes: true | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| --- | ||||
| ## LinuxIDMapping | ||||
| LinuxIDMapping represents the Linux ID mapping. | ||||
| 
 | ||||
| Appears in: | ||||
| 
 | ||||
| - <code><a href="#extramount">ExtraMount</a>.uidMappings</code> | ||||
| - <code><a href="#extramount">ExtraMount</a>.gidMappings</code> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| | Field | Type | Description | Value(s) | | ||||
| |-------|------|-------------|----------| | ||||
| |`containerID` |uint32 |ContainerID is the starting UID/GID in the container.  | | | ||||
| |`hostID` |uint32 |HostID is the starting UID/GID on the host to be mapped to 'ContainerID'.  | | | ||||
| |`size` |uint32 |Size is the number of IDs to be mapped.  | | | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| --- | ||||
| ## ExtraMount | ||||
| ExtraMount wraps OCI Mount specification. | ||||
| @ -665,18 +684,26 @@ Appears in: | ||||
| 
 | ||||
| 
 | ||||
| {{< highlight yaml >}} | ||||
| - destination: /var/lib/example | ||||
|   type: bind | ||||
|   source: /var/lib/example | ||||
| - destination: /var/lib/example # Destination is the absolute path where the mount will be placed in the container. | ||||
|   type: bind # Type specifies the mount kind. | ||||
|   source: /var/lib/example # Source specifies the source path of the mount. | ||||
|   # Options are fstab style mount options. | ||||
|   options: | ||||
|     - bind | ||||
|     - rshared | ||||
|     - rw | ||||
|   uidmappings: [] | ||||
|   gidmappings: [] | ||||
| {{< /highlight >}} | ||||
| 
 | ||||
| 
 | ||||
| | Field | Type | Description | Value(s) | | ||||
| |-------|------|-------------|----------| | ||||
| |`destination` |string |Destination is the absolute path where the mount will be placed in the container.  | | | ||||
| |`type` |string |Type specifies the mount kind.  | | | ||||
| |`source` |string |Source specifies the source path of the mount.  | | | ||||
| |`options` |[]string |Options are fstab style mount options.  | | | ||||
| |`uidMappings` |[]<a href="#linuxidmapping">LinuxIDMapping</a> |<details><summary>UID/GID mappings used for changing file owners w/o calling chown, fs should support it.</summary><br />Every mount point could have its own mapping.</details>  | | | ||||
| |`gidMappings` |[]<a href="#linuxidmapping">LinuxIDMapping</a> |<details><summary>UID/GID mappings used for changing file owners w/o calling chown, fs should support it.</summary><br />Every mount point could have its own mapping.</details>  | | | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| --- | ||||
| @ -763,15 +790,14 @@ extraArgs: | ||||
| 
 | ||||
| # # The `extraMounts` field is used to add additional mounts to the kubelet container. | ||||
| # extraMounts: | ||||
| #     - destination: /var/lib/example | ||||
| #       type: bind | ||||
| #       source: /var/lib/example | ||||
| #     - destination: /var/lib/example # Destination is the absolute path where the mount will be placed in the container. | ||||
| #       type: bind # Type specifies the mount kind. | ||||
| #       source: /var/lib/example # Source specifies the source path of the mount. | ||||
| #       # Options are fstab style mount options. | ||||
| #       options: | ||||
| #         - bind | ||||
| #         - rshared | ||||
| #         - rw | ||||
| #       uidmappings: [] | ||||
| #       gidmappings: [] | ||||
| 
 | ||||
| # # The `extraConfig` field is used to provide kubelet configuration overrides. | ||||
| # extraConfig: | ||||
| @ -803,15 +829,14 @@ extraArgs: | ||||
| {{< /highlight >}}</details> | | | ||||
| |`extraMounts` |[]<a href="#extramount">ExtraMount</a> |<details><summary>The `extraMounts` field is used to add additional mounts to the kubelet container.</summary>Note that either `bind` or `rbind` are required in the `options`.</details> <details><summary>Show example(s)</summary>{{< highlight yaml >}} | ||||
| extraMounts: | ||||
|     - destination: /var/lib/example | ||||
|       type: bind | ||||
|       source: /var/lib/example | ||||
|     - destination: /var/lib/example # Destination is the absolute path where the mount will be placed in the container. | ||||
|       type: bind # Type specifies the mount kind. | ||||
|       source: /var/lib/example # Source specifies the source path of the mount. | ||||
|       # Options are fstab style mount options. | ||||
|       options: | ||||
|         - bind | ||||
|         - rshared | ||||
|         - rw | ||||
|       uidmappings: [] | ||||
|       gidmappings: [] | ||||
| {{< /highlight >}}</details> | | | ||||
| |`extraConfig` |Unstructured |<details><summary>The `extraConfig` field is used to provide kubelet configuration overrides.</summary><br />Some fields are not allowed to be overridden: authentication and authorization, cgroups<br />configuration, ports, etc.</details> <details><summary>Show example(s)</summary>{{< highlight yaml >}} | ||||
| extraConfig: | ||||
|  | ||||
| @ -1353,7 +1353,59 @@ | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "ExtraMount": { | ||||
|       "properties": {}, | ||||
|       "properties": { | ||||
|         "destination": { | ||||
|           "type": "string", | ||||
|           "title": "destination", | ||||
|           "description": "Destination is the absolute path where the mount will be placed in the container.\n", | ||||
|           "markdownDescription": "Destination is the absolute path where the mount will be placed in the container.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eDestination is the absolute path where the mount will be placed in the container.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "type": { | ||||
|           "type": "string", | ||||
|           "title": "type", | ||||
|           "description": "Type specifies the mount kind.\n", | ||||
|           "markdownDescription": "Type specifies the mount kind.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eType specifies the mount kind.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "source": { | ||||
|           "type": "string", | ||||
|           "title": "source", | ||||
|           "description": "Source specifies the source path of the mount.\n", | ||||
|           "markdownDescription": "Source specifies the source path of the mount.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eSource specifies the source path of the mount.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "options": { | ||||
|           "items": { | ||||
|             "type": "string" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "options", | ||||
|           "description": "Options are fstab style mount options.\n", | ||||
|           "markdownDescription": "Options are fstab style mount options.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eOptions are fstab style mount options.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "uidMappings": { | ||||
|           "items": { | ||||
|             "$ref": "#/$defs/LinuxIDMapping" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "uidMappings", | ||||
|           "description": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.\n", | ||||
|           "markdownDescription": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eUID/GID mappings used for changing file owners w/o calling chown, fs should support it.\u003c/p\u003e\n\n\u003cp\u003eEvery mount point could have its own mapping.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "gidMappings": { | ||||
|           "items": { | ||||
|             "$ref": "#/$defs/LinuxIDMapping" | ||||
|           }, | ||||
|           "type": "array", | ||||
|           "title": "gidMappings", | ||||
|           "description": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.\n", | ||||
|           "markdownDescription": "UID/GID mappings used for changing file owners w/o calling chown, fs should support it.\n\nEvery mount point could have its own mapping.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eUID/GID mappings used for changing file owners w/o calling chown, fs should support it.\u003c/p\u003e\n\n\u003cp\u003eEvery mount point could have its own mapping.\u003c/p\u003e\n" | ||||
|         } | ||||
|       }, | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
| @ -1771,6 +1823,33 @@ | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "LinuxIDMapping": { | ||||
|       "properties": { | ||||
|         "containerID": { | ||||
|           "type": "integer", | ||||
|           "title": "containerID", | ||||
|           "description": "ContainerID is the starting UID/GID in the container.\n", | ||||
|           "markdownDescription": "ContainerID is the starting UID/GID in the container.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eContainerID is the starting UID/GID in the container.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "hostID": { | ||||
|           "type": "integer", | ||||
|           "title": "hostID", | ||||
|           "description": "HostID is the starting UID/GID on the host to be mapped to ‘ContainerID’.\n", | ||||
|           "markdownDescription": "HostID is the starting UID/GID on the host to be mapped to 'ContainerID'.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eHostID is the starting UID/GID on the host to be mapped to \u0026lsquo;ContainerID\u0026rsquo;.\u003c/p\u003e\n" | ||||
|         }, | ||||
|         "size": { | ||||
|           "type": "integer", | ||||
|           "title": "size", | ||||
|           "description": "Size is the number of IDs to be mapped.\n", | ||||
|           "markdownDescription": "Size is the number of IDs to be mapped.", | ||||
|           "x-intellij-html-description": "\u003cp\u003eSize is the number of IDs to be mapped.\u003c/p\u003e\n" | ||||
|         } | ||||
|       }, | ||||
|       "additionalProperties": false, | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "LoggingConfig": { | ||||
|       "properties": { | ||||
|         "destinations": { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user