mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Adds Windows build information as a label on the node
This commit is contained in:
		@@ -230,6 +230,10 @@ func (kl *Kubelet) initialNode(ctx context.Context) (*v1.Node, error) {
 | 
				
			|||||||
			Unschedulable: !kl.registerSchedulable,
 | 
								Unschedulable: !kl.registerSchedulable,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if err := addOSSpecificLabels(node); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nodeTaints := make([]v1.Taint, 0)
 | 
						nodeTaints := make([]v1.Taint, 0)
 | 
				
			||||||
	if len(kl.registerWithTaints) > 0 {
 | 
						if len(kl.registerWithTaints) > 0 {
 | 
				
			||||||
		taints := make([]v1.Taint, len(kl.registerWithTaints))
 | 
							taints := make([]v1.Taint, len(kl.registerWithTaints))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								pkg/kubelet/kubelet_node_status_others.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								pkg/kubelet/kubelet_node_status_others.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					// +build !windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2019 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package kubelet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func addOSSpecificLabels(n *v1.Node) error {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								pkg/kubelet/kubelet_node_status_windows.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								pkg/kubelet/kubelet_node_status_windows.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					// +build windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2019 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package kubelet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/kubelet/winstats"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func addOSSpecificLabels(n *v1.Node) error {
 | 
				
			||||||
 | 
						osInfo, err := winstats.GetOSInfo()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n.Labels[v1.LabelWindowsBuild] = osInfo.GetBuild()
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -78,19 +78,14 @@ func (p *perfCounterNodeStatsClient) startMonitoring() error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kernelVersion, err := getKernelVersion()
 | 
						osInfo, err := GetOSInfo()
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	osImageVersion, err := getOSImageVersion()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p.nodeInfo = nodeInfo{
 | 
						p.nodeInfo = nodeInfo{
 | 
				
			||||||
		kernelVersion:               kernelVersion,
 | 
							kernelVersion:               osInfo.GetPatchVersion(),
 | 
				
			||||||
		osImageVersion:              osImageVersion,
 | 
							osImageVersion:              osInfo.ProductName,
 | 
				
			||||||
		memoryPhysicalCapacityBytes: memory,
 | 
							memoryPhysicalCapacityBytes: memory,
 | 
				
			||||||
		startTime:                   time.Now(),
 | 
							startTime:                   time.Now(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,96 +20,60 @@ package winstats
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"unsafe"
 | 
						"golang.org/x/sys/windows/registry"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"golang.org/x/sys/windows"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getCurrentVersionVal gets value of specified key from registry.
 | 
					type OSInfo struct {
 | 
				
			||||||
func getCurrentVersionVal(key string) (string, error) {
 | 
						BuildNumber, ProductName string
 | 
				
			||||||
	var h windows.Handle
 | 
						MajorVersion, MinorVersion, UBR uint64
 | 
				
			||||||
	if err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
 | 
					 | 
				
			||||||
		windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
 | 
					 | 
				
			||||||
		0,
 | 
					 | 
				
			||||||
		windows.KEY_READ,
 | 
					 | 
				
			||||||
		&h); err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer windows.RegCloseKey(h)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var buf [128]uint16
 | 
					 | 
				
			||||||
	var typ uint32
 | 
					 | 
				
			||||||
	n := uint32(len(buf) * int(unsafe.Sizeof(buf[0]))) // api expects array of bytes, not uint16
 | 
					 | 
				
			||||||
	if err := windows.RegQueryValueEx(h,
 | 
					 | 
				
			||||||
		windows.StringToUTF16Ptr(key),
 | 
					 | 
				
			||||||
		nil,
 | 
					 | 
				
			||||||
		&typ,
 | 
					 | 
				
			||||||
		(*byte)(unsafe.Pointer(&buf[0])),
 | 
					 | 
				
			||||||
		&n); err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return windows.UTF16ToString(buf[:]), nil
 | 
					// GetOSInfo reads Windows version information from the registry
 | 
				
			||||||
}
 | 
					func GetOSInfo() (*OSInfo, error) {
 | 
				
			||||||
 | 
						k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
 | 
				
			||||||
// getVersionRevision gets revision from UBR registry.
 | 
					 | 
				
			||||||
func getVersionRevision() (uint16, error) {
 | 
					 | 
				
			||||||
	revisionString, err := getCurrentVersionVal("UBR")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						defer k.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	revision, err := windows.UTF16FromString(revisionString)
 | 
						buildNumber, _, err := k.GetStringValue("CurrentBuildNumber")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return revision[0], nil
 | 
						majorVersionNumber, _, err := k.GetIntegerValue("CurrentMajorVersionNumber")
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getKernelVersion gets the version of windows kernel.
 | 
					 | 
				
			||||||
func getKernelVersion() (string, error) {
 | 
					 | 
				
			||||||
	// Get CurrentBuildNumber.
 | 
					 | 
				
			||||||
	buildNumber, err := getCurrentVersionVal("CurrentBuildNumber")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get CurrentMajorVersionNumber.
 | 
						minorVersionNumber, _, err := k.GetIntegerValue("CurrentMinorVersionNumber")
 | 
				
			||||||
	majorVersionNumberString, err := getCurrentVersionVal("CurrentMajorVersionNumber")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	majorVersionNumber, err := windows.UTF16FromString(majorVersionNumberString)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get CurrentMinorVersionNumber.
 | 
						revision, _, err := k.GetIntegerValue("UBR")
 | 
				
			||||||
	minorVersionNumberString, err := getCurrentVersionVal("CurrentMinorVersionNumber")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	minorVersionNumber, err := windows.UTF16FromString(minorVersionNumberString)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get UBR.
 | 
						productName, _, err := k.GetStringValue("ProductName")
 | 
				
			||||||
	revision, err := getVersionRevision()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return nil, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return fmt.Sprintf("%d.%d.%s.%d", majorVersionNumber[0], minorVersionNumber[0], buildNumber, revision), nil
 | 
						return &OSInfo{
 | 
				
			||||||
 | 
							BuildNumber:  buildNumber,
 | 
				
			||||||
 | 
							ProductName:  productName,
 | 
				
			||||||
 | 
							MajorVersion: majorVersionNumber,
 | 
				
			||||||
 | 
							MinorVersion: minorVersionNumber,
 | 
				
			||||||
 | 
							UBR:          revision,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getOSImageVersion gets the osImage name and version.
 | 
					func (o *OSInfo) GetPatchVersion() string {
 | 
				
			||||||
func getOSImageVersion() (string, error) {
 | 
						return fmt.Sprintf("%d.%d.%s.%d", o.MajorVersion, o.MinorVersion, o.BuildNumber, o.UBR)
 | 
				
			||||||
	productName, err := getCurrentVersionVal("ProductName")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return productName, nil
 | 
					func (o *OSInfo) GetBuild() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf("%d.%d.%s", o.MajorVersion, o.MinorVersion, o.BuildNumber)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,8 @@ const (
 | 
				
			|||||||
	LabelOSStable   = "kubernetes.io/os"
 | 
						LabelOSStable   = "kubernetes.io/os"
 | 
				
			||||||
	LabelArchStable = "kubernetes.io/arch"
 | 
						LabelArchStable = "kubernetes.io/arch"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LabelWindowsBuild = "node.kubernetes.io/windows-build"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// LabelNamespaceSuffixKubelet is an allowed label namespace suffix kubelets can self-set ([*.]kubelet.kubernetes.io/*)
 | 
						// LabelNamespaceSuffixKubelet is an allowed label namespace suffix kubelets can self-set ([*.]kubelet.kubernetes.io/*)
 | 
				
			||||||
	LabelNamespaceSuffixKubelet = "kubelet.kubernetes.io"
 | 
						LabelNamespaceSuffixKubelet = "kubelet.kubernetes.io"
 | 
				
			||||||
	// LabelNamespaceSuffixNode is an allowed label namespace suffix kubelets can self-set ([*.]node.kubernetes.io/*)
 | 
						// LabelNamespaceSuffixNode is an allowed label namespace suffix kubelets can self-set ([*.]node.kubernetes.io/*)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user