staging/provisioning/windows/kubeproxystart.ps1 (92 lines of code) (raw):

$Global:ClusterConfiguration = ConvertFrom-Json ((Get-Content "c:\k\kubeclusterconfig.json" -ErrorAction Stop) | out-string) $KubeproxyFeatureGates = $Global:ClusterConfiguration.Kubernetes.Kubeproxy.FeatureGates # This is the initial feature list passed in from aks-engine $KubernetesVersion = $Global:ClusterConfiguration.Kubernetes.Source.Release # comparison function for 2 semantic versions # returns 1 if Version1 > Version 2, -1 if Version1 < Version2, and 0 if equal function Compare-SemanticVersion { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0)] [string]$Version1, [Parameter(Mandatory=$true, Position=1)] [string]$Version2 ) $version1Parts = $Version1.Split(".") $version2Parts = $Version2.Split(".") $maxCount = 0 if ($version1Parts.Count > $version2Parts.Count) { $maxCount = $version1Parts.Count } else { $maxCount = $version2Parts.Count } for ($i = 0; $i -lt $maxCount; $i++) { $version1Part = if ($i -lt $version1Parts.Count) { [int]$version1Parts[$i] } else { 0 } $version2Part = if ($i -lt $version2Parts.Count) { [int]$version2Parts[$i] } else { 0 } if ($version1Part -lt $version2Part) { return -1 } elseif ($version1Part -gt $version2Part) { return 1 } } return 0 } $KubeNetwork = "azure" if ($Global:ClusterConfiguration.Cni.Name -eq "kubenet") { $KubeNetwork = "l2bridge" } $env:KUBE_NETWORK = $KubeNetwork $global:HNSModule = "c:\k\hns.v2.psm1" $global:KubeDir = $Global:ClusterConfiguration.Install.Destination $global:KubeproxyArgList = @("--v=3", "--proxy-mode=kernelspace", "--hostname-override=$env:computername", "--kubeconfig=$KubeDir\config") if ($Global:ClusterConfiguration.Kubernetes.Kubeproxy.ConfigArgs) { Write-Host "Customized args: $($Global:ClusterConfiguration.Kubernetes.Kubeproxy.ConfigArgs)" $global:KubeproxyArgList += $Global:ClusterConfiguration.Kubernetes.Kubeproxy.ConfigArgs } $hnsNetwork = Get-HnsNetwork | ? Name -EQ $KubeNetwork while (!$hnsNetwork) { Write-Host "$(Get-Date -Format o) Waiting for Network [$KubeNetwork] to be created . . ." Start-Sleep 10 $hnsNetwork = Get-HnsNetwork | ? Name -EQ $KubeNetwork } # enable WinDsr if WinDsr feature gate is enabled if ($KubeproxyFeatureGates -contains "WinDSR=true") { $global:KubeproxyArgList += @("--enable-dsr=true") } $featureGateArgs = "" foreach ($feature in $KubeproxyFeatureGates) { # IPv6DualStack is removed from the Kubernetes FeatureFlag set # in 1.25.0 and has been enabled by default since 1.21.0. There are # some other places in CSE that depend on the feature flag being part # of the config so this change is just to remove it from kube-proxy's # list of args so it doesn't crash at startup. # https://github.com/kubernetes/kubernetes/blob/ef70d260f3d036fc22b30538576bbf6b36329995/pkg/features/kube_features.go#L945 if (($feature -like "IPv6DualStack=*") -and ((Compare-SemanticVersion -Version1 $KubernetesVersion -Version2 "1.25.0") -ge 0)) { continue } if ($featureGateArgs -ne "") { $featureGateArgs += "," } $featureGateArgs += $feature } if ($featureGateArgs -ne "") { $global:KubeproxyArgList += @("--feature-gates=" + $featureGateArgs) } # # cleanup the persisted policy lists # Import-Module $global:HNSModule # Workaround for https://github.com/kubernetes/kubernetes/pull/68923 in < 1.14, # and https://github.com/kubernetes/kubernetes/pull/78612 for <= 1.15 Get-HnsPolicyList | Remove-HnsPolicyList # Use run-process.cs to set process priority class as 'AboveNormal' # Load a signed version of runprocess.dll if it exists for Azure SysLock compliance # otherwise load class from cs file (for CI/testing) if (Test-Path "$global:KubeDir\runprocess.dll") { [System.Reflection.Assembly]::LoadFrom("$global:KubeDir\runprocess.dll") } else { Add-Type -Path "$global:KubeDir\run-process.cs" } $exe = "$global:KubeDir\kube-proxy.exe" $args = $global:KubeproxyArgList -join " " [RunProcess.exec]::RunProcess($exe, $args, [System.Diagnostics.ProcessPriorityClass]::AboveNormal)