Skip to content
This repository was archived by the owner on Oct 24, 2023. It is now read-only.

Commit fc72cb3

Browse files
committed
Adding WindowsNodeReset.ps1 script to reset/cleanup state for windox^C nodes
1 parent 880438e commit fc72cb3

File tree

7 files changed

+250
-6
lines changed

7 files changed

+250
-6
lines changed

parts/k8s/kuberneteswindowsfunctions.ps1

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function DownloadFileOverHttp
3232
Write-Log "Using cached version of $fileName - Copying file from $($search[0]) to $DestinationPath"
3333
Move-Item -Path $search[0] -Destination $DestinationPath -Force
3434
}
35-
else
35+
else
3636
{
3737
$secureProtocols = @()
3838
$insecureProtocols = @([System.Net.SecurityProtocolType]::SystemDefault, [System.Net.SecurityProtocolType]::Ssl3)
@@ -137,3 +137,19 @@ function Get-NetworkLogCollectionScripts {
137137
DownloadFileOverHttp -Url 'https://github.com/microsoft/SDN/raw/master/Kubernetes/windows/debug/stoppacketcapture.cmd' -DestinationPath 'c:\k\debug\stoppacketcapture.cmd'
138138
DownloadFileOverHttp -Url 'https://github.com/microsoft/SDN/raw/master/Kubernetes/windows/helper.psm1' -DestinationPath 'c:\k\debug\helper.psm1'
139139
}
140+
141+
function Register-NodeResetScriptTask {
142+
Write-Log "Creatingg a startup task to run windowsnodereset.ps1"
143+
144+
(Get-Content 'c:\AzureData\k8s\windowsnodereset.ps1') |
145+
Foreach-Object { $_ -replace '{{MasterSubnet}}', $global:MasterSubnet } |
146+
Foreach-Object { $_ -replace '{{NetworkMode}}', $global:NetworkMode } |
147+
Foreach-Object { $_ -replace '{{NetworkPlugin}}', $global:NetworkPlugin } |
148+
Out-File 'c:\k\windowsnodereset.ps1'
149+
150+
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File `"c:\k\windowsnodereset.ps1`""
151+
$principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount -RunLevel Highest
152+
$trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:05
153+
$definition = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Description "k8s-restart-job"
154+
Register-ScheduledTask -TaskName "k8s-restart-job" -InputObject $definition
155+
}

parts/k8s/kuberneteswindowssetup.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ try
315315
Write-Log "Update service failure actions"
316316
Update-ServiceFailureActions
317317

318+
Register-NodeResetScriptTask
319+
318320
if (Test-Path $CacheDir)
319321
{
320322
Write-Log "Removing aks-engine bits cache directory"

parts/k8s/windowskubeletfunc.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ New-NSSMService {
280280
& "$KubeDir\nssm.exe" set Kubelet AppRestartDelay 5000
281281
& "$KubeDir\nssm.exe" set Kubelet DependOnService docker
282282
& "$KubeDir\nssm.exe" set Kubelet Description Kubelet
283-
& "$KubeDir\nssm.exe" set Kubelet Start SERVICE_AUTO_START
283+
& "$KubeDir\nssm.exe" set Kubelet Start SERVICE_DEMAND_START
284284
& "$KubeDir\nssm.exe" set Kubelet ObjectName LocalSystem
285285
& "$KubeDir\nssm.exe" set Kubelet Type SERVICE_WIN32_OWN_PROCESS
286286
& "$KubeDir\nssm.exe" set Kubelet AppThrottle 1500
@@ -300,7 +300,7 @@ New-NSSMService {
300300
& "$KubeDir\nssm.exe" set Kubeproxy DisplayName Kubeproxy
301301
& "$KubeDir\nssm.exe" set Kubeproxy DependOnService Kubelet
302302
& "$KubeDir\nssm.exe" set Kubeproxy Description Kubeproxy
303-
& "$KubeDir\nssm.exe" set Kubeproxy Start SERVICE_AUTO_START
303+
& "$KubeDir\nssm.exe" set Kubeproxy Start SERVICE_DEMAND_START
304304
& "$KubeDir\nssm.exe" set Kubeproxy ObjectName LocalSystem
305305
& "$KubeDir\nssm.exe" set Kubeproxy Type SERVICE_WIN32_OWN_PROCESS
306306
& "$KubeDir\nssm.exe" set Kubeproxy AppThrottle 1500

parts/k8s/windowsnodereset.ps1

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<#
2+
.DESCRIPTION
3+
This script is intended to be run each time a windows nodes is restarted and performs
4+
cleanup actions to help ensure the node comes up cleanly.
5+
#>
6+
7+
$global:LogPath = "c:\k\windowsnodereset.log"
8+
$global:HNSModule = "c:\k\hns.psm1"
9+
10+
# Note: the following templated values are expanded kuberneteswindowsfunctions.ps1/Register-NodeResetScriptTask() not during template generation!
11+
$global:MasterSubnet = "{{MasterSubnet}}"
12+
$global:NetworkMode = "{{NetworkMode}}"
13+
$global:NetworkPlugin = "{{NetworkPlugin}}"
14+
15+
filter Timestamp { "$(Get-Date -Format o): $_" }
16+
17+
function Write-Log ($message) {
18+
$message | Timestamp | Tee-Object -FilePath $global:LogPath -Append
19+
}
20+
21+
Write-Log "Entering windowsnodecleanup.ps1"
22+
23+
Import-Module $global:HNSModule
24+
25+
#
26+
# Stop services
27+
#
28+
Write-Log "Stopping kubeproxy service"
29+
Stop-Service kubeproxy
30+
31+
Write-Log "Stopping kubelet service"
32+
Stop-Service kubelet
33+
34+
#
35+
# Perform cleanup
36+
#
37+
38+
$hnsNetwork = Get-HnsNetwork | Where-Object Name -EQ azure
39+
if ($hnsNetwork) {
40+
Write-Log "Cleaning up HNS network 'azure'..."
41+
42+
Write-Log "Cleaning up containers"
43+
docker ps -q | ForEach-Object { docker rm $_ -f }
44+
45+
Write-Log "Removing old HNS network"
46+
Remove-HnsNetwork $hnsNetwork
47+
48+
taskkill /IM azure-vnet.exe /f
49+
taskkill /IM azure-vnet-ipam.exe /f
50+
51+
$filesToRemove = @(
52+
"c:\k\azure-vnet.json",
53+
"c:\k\azure-vnet.json.lock",
54+
"c:\k\azure-vnet-ipam.json",
55+
"c:\k\azure-vnet-ipam.json.lock"
56+
)
57+
58+
foreach ($file in $filesToRemove) {
59+
if (Test-Path $file) {
60+
Write-Log "Deleting stale file at $file"
61+
Remove-Item $file
62+
}
63+
}
64+
}
65+
66+
#
67+
# Create required networks
68+
#
69+
70+
Write-Log "Cleaning up persisted HNS policy lists"
71+
# Workaround for https://github.com/kubernetes/kubernetes/pull/68923 in < 1.14,
72+
# and https://github.com/kubernetes/kubernetes/pull/78612 for <= 1.15
73+
Get-HnsPolicyList | Remove-HnsPolicyList
74+
75+
if ($global:NetworkPlugin -eq 'kubenet') {
76+
Write-Log "Creating new hns network: $($global:NetworkMode.ToLower())"
77+
$podCIDR = Get-PodCIDR
78+
$masterSubnetGW = Get-DefaultGateway $global:MasterSubnet
79+
New-HNSNetwork -Type $global:NetworkMode -AddressPrefix $podCIDR -Gateway $masterSubnetGW -Name $global:NetworkMode.ToLower() -Verbose
80+
Start-sleep 10
81+
}
82+
83+
84+
#
85+
# Start Services
86+
#
87+
Write-Log "Starting kubelet service"
88+
Start-Service kubelet
89+
90+
Write-Log "Starting kubeproxy service"
91+
Start-Service kubeproxy
92+
93+
Write-Log "Exiting windowsnodecleanup.ps1"

pkg/engine/const.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ const (
8989
kubernetesWindowsCniFunctionsPS1 = "k8s/windowscnifunc.ps1"
9090
kubernetesWindowsAzureCniFunctionsPS1 = "k8s/windowsazurecnifunc.ps1"
9191
kubernetesWindowsOpenSSHFunctionPS1 = "k8s/windowsinstallopensshfunc.ps1"
92+
kubernetesWindowsNodeResetPS1 = "k8s/windowsnodereset.ps1"
9293
)
9394

9495
// cloud-init (i.e. ARM customData) source file references

pkg/engine/template_generator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,7 @@ func getContainerServiceFuncMap(cs *api.ContainerService) template.FuncMap {
481481
kubernetesWindowsKubeletFunctionsPS1,
482482
kubernetesWindowsCniFunctionsPS1,
483483
kubernetesWindowsAzureCniFunctionsPS1,
484+
kubernetesWindowsNodeResetPS1,
484485
kubernetesWindowsOpenSSHFunctionPS1}
485486

486487
// Create a buffer, new zip

pkg/engine/templates_generated.go

Lines changed: 134 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)