97 lines
4.1 KiB
PowerShell
97 lines
4.1 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Assists with preparing a Windows VM prior to calling kubeadm join
|
|
|
|
.DESCRIPTION
|
|
This script assists with joining a Windows node to a cluster.
|
|
- Downloads Kubernetes binaries (kubelet, kubeadm) at the version specified
|
|
- Registers wins as a service in order to run kube-proxy and cni as DaemonSets.
|
|
- Registers kubelet as an nssm service. More info on nssm: https://nssm.cc/
|
|
|
|
.PARAMETER KubernetesVersion
|
|
Kubernetes version to download and use
|
|
|
|
.EXAMPLE
|
|
PS> .\PrepareNode.ps1 -KubernetesVersion v1.17.0
|
|
|
|
#>
|
|
|
|
Param(
|
|
[parameter(Mandatory = $true, HelpMessage="Kubernetes version to use")]
|
|
[string] $KubernetesVersion = 'v1.18.5'
|
|
)
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
function DownloadFile($destination, $source) {
|
|
Write-Host("Downloading $source to $destination")
|
|
curl.exe --silent --fail -Lo $destination $source
|
|
|
|
if (!$?) {
|
|
Write-Error "Download $source failed"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
if (!$KubernetesVersion.StartsWith("v")) {
|
|
$KubernetesVersion = "v" + $KubernetesVersion
|
|
}
|
|
Write-Host "Using Kubernetes version: $KubernetesVersion"
|
|
$global:Powershell = (Get-Command powershell).Source
|
|
$global:PowershellArgs = "-ExecutionPolicy Bypass -NoProfile"
|
|
$global:KubernetesPath = "$env:SystemDrive\k"
|
|
$global:StartKubeletScript = "$global:KubernetesPath\StartKubelet.ps1"
|
|
$global:NssmInstallDirectory = "$env:ProgramFiles\nssm"
|
|
$kubeletBinPath = "$global:KubernetesPath\kubelet.exe"
|
|
|
|
mkdir -force "$global:KubernetesPath"
|
|
$env:Path += ";$global:KubernetesPath"
|
|
[Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)
|
|
|
|
DownloadFile $kubeletBinPath https://dl.k8s.io/$KubernetesVersion/bin/windows/amd64/kubelet.exe
|
|
DownloadFile "$global:KubernetesPath\kubeadm.exe" https://dl.k8s.io/$KubernetesVersion/bin/windows/amd64/kubeadm.exe
|
|
DownloadFile "$global:KubernetesPath\wins.exe" https://github.com/rancher/wins/releases/download/v0.0.4/wins.exe
|
|
|
|
# Create host network to allow kubelet to schedule hostNetwork pods
|
|
Write-Host "Creating Docker host network"
|
|
docker network create -d nat host
|
|
|
|
Write-Host "Registering wins service"
|
|
wins.exe srv app run --register
|
|
start-service rancher-wins
|
|
|
|
mkdir -force C:\var\log\kubelet
|
|
mkdir -force C:\var\lib\kubelet\etc\kubernetes
|
|
mkdir -force C:\etc\kubernetes\pki
|
|
New-Item -path C:\var\lib\kubelet\etc\kubernetes\pki -type SymbolicLink -value C:\etc\kubernetes\pki\
|
|
|
|
$StartKubeletFileContent = '$FileContent = Get-Content -Path "/var/lib/kubelet/kubeadm-flags.env"
|
|
$global:KubeletArgs = $FileContent.Trim("KUBELET_KUBEADM_ARGS=`"")
|
|
|
|
$cmd = "C:\k\kubelet.exe $global:KubeletArgs --cert-dir=$env:SYSTEMDRIVE\var\lib\kubelet\pki --config=/var/lib/kubelet/config.yaml --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --hostname-override=$(hostname) --pod-infra-container-image=`"mcr.microsoft.com/k8s/core/pause:1.2.0`" --enable-debugging-handlers --cgroups-per-qos=false --enforce-node-allocatable=`"`" --network-plugin=cni --resolv-conf=`"`" --log-dir=/var/log/kubelet --logtostderr=false --image-pull-progress-deadline=20m"
|
|
|
|
Invoke-Expression $cmd'
|
|
Set-Content -Path $global:StartKubeletScript -Value $StartKubeletFileContent
|
|
|
|
Write-Host "Installing nssm"
|
|
$arch = "win32"
|
|
if ([Environment]::Is64BitOperatingSystem) {
|
|
$arch = "win64"
|
|
}
|
|
|
|
mkdir -Force $global:NssmInstallDirectory
|
|
DownloadFile nssm.zip https://k8stestinfrabinaries.blob.core.windows.net/nssm-mirror/nssm-2.24.zip
|
|
tar C $global:NssmInstallDirectory -xvf .\nssm.zip --strip-components 2 */$arch/*.exe
|
|
Remove-Item -Force .\nssm.zip
|
|
|
|
$env:path += ";$global:NssmInstallDirectory"
|
|
$newPath = "$global:NssmInstallDirectory;" +
|
|
[Environment]::GetEnvironmentVariable("PATH", [EnvironmentVariableTarget]::Machine)
|
|
|
|
[Environment]::SetEnvironmentVariable("PATH", $newPath, [EnvironmentVariableTarget]::Machine)
|
|
|
|
Write-Host "Registering kubelet service"
|
|
nssm install kubelet $global:Powershell $global:PowershellArgs $global:StartKubeletScript
|
|
nssm set kubelet DependOnService docker
|
|
|
|
New-NetFirewallRule -Name kubelet -DisplayName 'kubelet' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 10250
|