diff --git a/components/kubelet/action.pb.go b/components/kubelet/action.pb.go index d2e7157..7df2a17 100644 --- a/components/kubelet/action.pb.go +++ b/components/kubelet/action.pb.go @@ -7,12 +7,11 @@ package kubelet import ( - reflect "reflect" - unsafe "unsafe" - api "github.com/Azure/AKSFlexNode/components/api" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" ) const ( @@ -1175,6 +1174,9 @@ type StartKubeletServiceSpec struct { xxx_hidden_NodeLabels map[string]string `protobuf:"bytes,3,rep,name=node_labels,json=nodeLabels" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` xxx_hidden_KubeletConfig *KubeletConfig `protobuf:"bytes,4,opt,name=kubelet_config,json=kubeletConfig"` xxx_hidden_RegisterWithTaints []string `protobuf:"bytes,5,rep,name=register_with_taints,json=registerWithTaints"` + xxx_hidden_NodeIp *string `protobuf:"bytes,6,opt,name=node_ip,json=nodeIp"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1239,6 +1241,16 @@ func (x *StartKubeletServiceSpec) GetRegisterWithTaints() []string { return nil } +func (x *StartKubeletServiceSpec) GetNodeIp() string { + if x != nil { + if x.xxx_hidden_NodeIp != nil { + return *x.xxx_hidden_NodeIp + } + return "" + } + return "" +} + func (x *StartKubeletServiceSpec) SetControlPlane(v *ControlPlane) { x.xxx_hidden_ControlPlane = v } @@ -1259,6 +1271,11 @@ func (x *StartKubeletServiceSpec) SetRegisterWithTaints(v []string) { x.xxx_hidden_RegisterWithTaints = v } +func (x *StartKubeletServiceSpec) SetNodeIp(v string) { + x.xxx_hidden_NodeIp = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 5, 6) +} + func (x *StartKubeletServiceSpec) HasControlPlane() bool { if x == nil { return false @@ -1280,6 +1297,13 @@ func (x *StartKubeletServiceSpec) HasKubeletConfig() bool { return x.xxx_hidden_KubeletConfig != nil } +func (x *StartKubeletServiceSpec) HasNodeIp() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 5) +} + func (x *StartKubeletServiceSpec) ClearControlPlane() { x.xxx_hidden_ControlPlane = nil } @@ -1292,16 +1316,20 @@ func (x *StartKubeletServiceSpec) ClearKubeletConfig() { x.xxx_hidden_KubeletConfig = nil } +func (x *StartKubeletServiceSpec) ClearNodeIp() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 5) + x.xxx_hidden_NodeIp = nil +} + type StartKubeletServiceSpec_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - ControlPlane *ControlPlane - NodeAuthInfo *NodeAuthInfo - NodeLabels map[string]string - KubeletConfig *KubeletConfig - // Taints to register the node with via --register-with-taints. - // Each entry must use the kubelet taint format: "key=value:Effect" or "key:Effect". + ControlPlane *ControlPlane + NodeAuthInfo *NodeAuthInfo + NodeLabels map[string]string + KubeletConfig *KubeletConfig RegisterWithTaints []string + NodeIp *string } func (b0 StartKubeletServiceSpec_builder) Build() *StartKubeletServiceSpec { @@ -1313,6 +1341,10 @@ func (b0 StartKubeletServiceSpec_builder) Build() *StartKubeletServiceSpec { x.xxx_hidden_NodeLabels = b.NodeLabels x.xxx_hidden_KubeletConfig = b.KubeletConfig x.xxx_hidden_RegisterWithTaints = b.RegisterWithTaints + if b.NodeIp != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 5, 6) + x.xxx_hidden_NodeIp = b.NodeIp + } return m0 } @@ -1811,14 +1843,15 @@ const file_components_kubelet_action_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a?\n" + "\x11EvictionHardEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xe5\x03\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xfe\x03\n" + "\x17StartKubeletServiceSpec\x12N\n" + "\rcontrol_plane\x18\x01 \x01(\v2).aks.flex.components.kubelet.ControlPlaneR\fcontrolPlane\x12O\n" + "\x0enode_auth_info\x18\x02 \x01(\v2).aks.flex.components.kubelet.NodeAuthInfoR\fnodeAuthInfo\x12e\n" + "\vnode_labels\x18\x03 \x03(\v2D.aks.flex.components.kubelet.StartKubeletServiceSpec.NodeLabelsEntryR\n" + "nodeLabels\x12Q\n" + "\x0ekubelet_config\x18\x04 \x01(\v2*.aks.flex.components.kubelet.KubeletConfigR\rkubeletConfig\x120\n" + - "\x14register_with_taints\x18\x05 \x03(\tR\x12registerWithTaints\x1a=\n" + + "\x14register_with_taints\x18\x05 \x03(\tR\x12registerWithTaints\x12\x17\n" + + "\anode_ip\x18\x06 \x01(\tR\x06nodeIp\x1a=\n" + "\x0fNodeLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x1b\n" + diff --git a/components/kubelet/action.proto b/components/kubelet/action.proto index 3412dbc..d5aed06 100644 --- a/components/kubelet/action.proto +++ b/components/kubelet/action.proto @@ -70,6 +70,7 @@ message StartKubeletServiceSpec { map node_labels = 3; KubeletConfig kubelet_config = 4; repeated string register_with_taints = 5; + string node_ip = 6; } message StartKubeletServiceStatus { diff --git a/components/kubelet/v20260301/assets/20-flex-node-node-config.conf b/components/kubelet/v20260301/assets/20-flex-node-node-config.conf index d0d4cb6..6eda7e5 100644 --- a/components/kubelet/v20260301/assets/20-flex-node-node-config.conf +++ b/components/kubelet/v20260301/assets/20-flex-node-node-config.conf @@ -4,5 +4,5 @@ # You may create a higher-numbered drop-in (e.g. 90-custom-node-config.conf) # to append or override individual env vars. [Service] -Environment="KUBELET_NODE_CONFIG_ARGS=--node-labels={{.NodeLabels}} --v={{.Verbosity}} --client-ca-file={{.ClientCAFile}}{{range .ClusterDNS}} --cluster-dns={{.}}{{end}}{{if .RegisterWithTaints}} --register-with-taints={{.RegisterWithTaints}}{{end}}" +Environment="KUBELET_NODE_CONFIG_ARGS=--node-labels={{.NodeLabels}} --v={{.Verbosity}} --client-ca-file={{.ClientCAFile}}{{range .ClusterDNS}} --cluster-dns={{.}}{{end}}{{if .RegisterWithTaints}} --register-with-taints={{.RegisterWithTaints}}{{end}}{{if .NodeIP}} --node-ip={{.NodeIP}}{{end}}" Environment="KUBELET_TUNING_ARGS=--eviction-hard={{.EvictionHard}} --kube-reserved={{.KubeReserved}} --image-gc-high-threshold={{.ImageGCHighThreshold}} --image-gc-low-threshold={{.ImageGCLowThreshold}} --max-pods={{.MaxPods}}" diff --git a/components/kubelet/v20260301/kubelet_service.go b/components/kubelet/v20260301/kubelet_service.go index 9c39570..aa2b539 100644 --- a/components/kubelet/v20260301/kubelet_service.go +++ b/components/kubelet/v20260301/kubelet_service.go @@ -81,6 +81,7 @@ func (s *startKubeletServiceAction) ensureSystemdUnit( "ImageGCHighThreshold": kubeletConfig.GetImageGcHighThreshold(), "ImageGCLowThreshold": kubeletConfig.GetImageGcLowThreshold(), "MaxPods": kubeletConfig.GetMaxPods(), + "NodeIP": spec.GetNodeIp(), }) if err != nil { return err diff --git a/pkg/bootstrapper/components.go b/pkg/bootstrapper/components.go index d87b1e6..aa847f8 100644 --- a/pkg/bootstrapper/components.go +++ b/pkg/bootstrapper/components.go @@ -77,6 +77,15 @@ func ptr[T any](value T) *T { return &value } +// ptrOrNil returns nil if value is the zero value for T, otherwise returns a pointer to value. +func ptrOrNil[T comparable](value T) *T { + var zero T + if value == zero { + return nil + } + return &value +} + func componentAction(name string) *api.Metadata { return api.Metadata_builder{Name: &name}.Build() } @@ -298,6 +307,7 @@ var startKubelet resolveActionFunc[*kubelet.StartKubeletService] = func( ClusterDns: []string{cfg.Node.Kubelet.DNSServiceIP}, MaxPods: ptr(int32(cfg.Node.MaxPods)), }.Build(), + NodeIp: ptrOrNil(cfg.Node.Kubelet.NodeIP), }.Build() return kubelet.StartKubeletService_builder{ diff --git a/pkg/config/structs.go b/pkg/config/structs.go index 824238b..1bd1794 100644 --- a/pkg/config/structs.go +++ b/pkg/config/structs.go @@ -136,6 +136,7 @@ type KubeletConfig struct { DNSServiceIP string `json:"dnsServiceIP"` // Cluster DNS service IP (default: 10.0.0.10 for AKS) ServerURL string `json:"serverURL"` // Kubernetes API server URL CACertData string `json:"caCertData"` // Base64-encoded CA certificate data + NodeIP string `json:"nodeIP"` // IP address to advertise as the node's primary IP (--node-ip kubelet flag) } // PathsConfig holds file system paths used by the agent for Kubernetes and CNI configurations.