207 lines
8.8 KiB
PowerShell
207 lines
8.8 KiB
PowerShell
|
function Start-Minikube {
|
||
|
<#
|
||
|
.SYNOPSIS
|
||
|
Starts a Minikube Kubernetes cluster ready to host Alkami applications
|
||
|
|
||
|
.DESCRIPTION
|
||
|
Starts a Minikube Kubernetes cluster ready to host Alkami applications
|
||
|
|
||
|
.PARAMETER InstallDependencies
|
||
|
[switch] Will install all dependencies for running Minikube locally. Run this the first time starting Minikube.
|
||
|
|
||
|
.PARAMETER IncludeMetricsServer
|
||
|
[switch] Will include metrics server as part of the Minikube cluster.
|
||
|
|
||
|
.PARAMETER IncludeKibana
|
||
|
[switch] Will include Kibana as part of the Minikube cluster.
|
||
|
|
||
|
.PARAMETER IncludeArgoCD
|
||
|
[switch] Will include ArgoCD and Argo Rollouts as part of the Minikube cluster
|
||
|
|
||
|
.PARAMETER ForceReset
|
||
|
[switch] Will delete and recreate the entire minikube cluster. Required when wanting to edit the CPU and Memory allocation.
|
||
|
|
||
|
.PARAMETER Cpus
|
||
|
[uint32] Will set the Minikube CPU resource allocation to the specificed number of CPUs.
|
||
|
|
||
|
.PARAMETER Memory
|
||
|
[uint32] Will set the Minikube memory resource allocation to the specificed number of MegaBytes.
|
||
|
|
||
|
.PARAMETER IngressPort
|
||
|
[uint32] Will expose ingress traffic into the Minikube cluster on the specified port. Default: 10000
|
||
|
|
||
|
.EXAMPLE
|
||
|
Start-Minikube -InstallDependencies -IncludeMetricsServer -Cpus 6 -Memory 8 -IngressPort 7000
|
||
|
#>
|
||
|
[CmdletBinding()]
|
||
|
param(
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[switch]$InstallDependencies,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[switch]$IncludeMetricsServer,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[switch]$IncludeKibana,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[switch]$IncludeArgoCD,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[switch]$ForceReset,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[uint32]$Cpus = 5,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[uint32]$Memory = 6,
|
||
|
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[uint32]$IngressPort = 10000
|
||
|
)
|
||
|
|
||
|
$ErrorActionPreference = "Stop"
|
||
|
$logLead = (Get-LogLeadName)
|
||
|
$resourcesPath = Join-Path $PSScriptRoot "Resources"
|
||
|
$config = Get-MinikubeConfigurationInformation
|
||
|
|
||
|
if ($InstallDependencies.IsPresent) {
|
||
|
Install-MinikubeDependencies
|
||
|
}
|
||
|
|
||
|
if ($ForceReset.IsPresent) {
|
||
|
minikube delete
|
||
|
}
|
||
|
|
||
|
# Configure WSL memory usage.
|
||
|
$wslConfigPath = "${Env:HOMEPATH}\.wslconfig"
|
||
|
Write-Host "$logLead : Configuring WSL resource settings at: $wslConfigPath."
|
||
|
$memoryLimit = "$($Memory)GB"
|
||
|
$wslConfig = @"
|
||
|
[wsl2]
|
||
|
memory=$memoryLimit
|
||
|
swap=0
|
||
|
"@
|
||
|
|
||
|
Set-Content -Path $wslConfigPath -Value $wslConfig -Force
|
||
|
|
||
|
Restart-Wsl
|
||
|
|
||
|
[string]$certsDirectory= "$resourcesPath\cacerts\*"
|
||
|
|
||
|
[string]$miniKubeCertsDirectory = "${Env:HOMEPATH}\.minikube\certs"
|
||
|
|
||
|
if (!(Test-Path $miniKubeCertsDirectory))
|
||
|
{
|
||
|
New-Item $miniKubeCertsDirectory -ItemType Directory
|
||
|
}
|
||
|
|
||
|
Write-Host "$logLead : Copying CA Certs to minikube cert location: ${miniKubeCertsDirectory}"
|
||
|
|
||
|
Copy-item -Force -Recurse $certsDirectory -Destination $miniKubeCertsDirectory
|
||
|
|
||
|
# The wslconfig allocates memory for wsl. Docker desktop doesn't get all of that memory so minikube will need less than 1024 bytes per gig allocated to wsl.
|
||
|
$memoryBytes = $Memory * 800
|
||
|
|
||
|
minikube config set cpus $Cpus
|
||
|
minikube config set memory $memoryBytes
|
||
|
|
||
|
minikube start --driver=docker `
|
||
|
--embed-certs `
|
||
|
--addons dashboard `
|
||
|
--addons ingress `
|
||
|
--docker-opt=dns=10.0.16.42 `
|
||
|
--docker-opt=dns=10.0.16.43 `
|
||
|
--docker-opt=dns-search=corp.alkamitech.com `
|
||
|
--docker-opt=dns-search=fh.local `
|
||
|
--ports=$($IngressPort):443 `
|
||
|
--ports=32000:32000 `
|
||
|
--extra-config=kubelet.housekeeping-interval=10s
|
||
|
|
||
|
if ($IncludeMetricsServer.IsPresent) {
|
||
|
minikube addons enable metrics-server
|
||
|
}
|
||
|
|
||
|
Write-Host "$logLead : Copying Kerberos configuration file. (krb5.ini)"
|
||
|
Copy-Item (Join-Path $resourcesPath "\krb5.ini") -Destination "C:\ProgramData\MIT\Kerberos5" -Force
|
||
|
|
||
|
Write-Host "$logLead : Configuring Kerberos ticket cache location environment variable."
|
||
|
# Set env variable for current session
|
||
|
$Env:KRB5CCNAME = "c:\ProgramData\MIT\Kerberos5\krb5cc_0"
|
||
|
# Set env variable for future sessions
|
||
|
[System.Environment]::SetEnvironmentVariable('KRB5CCNAME','c:\ProgramData\MIT\Kerberos5\krb5cc_0', [System.EnvironmentVariableTarget]::Machine)
|
||
|
|
||
|
Write-Host "$logLead : Creating localhost namespace..."
|
||
|
|
||
|
kubectl create ns localhost
|
||
|
|
||
|
Write-Host "$logLead : Initializing Kubernetes secrets..."
|
||
|
|
||
|
Reset-MinikubeSecrets
|
||
|
|
||
|
Write-Host "$logLead : Configuring tls for ingress"
|
||
|
kubectl apply -f (Join-Path $resourcesPath "ingress-tls-secret.yaml")
|
||
|
|
||
|
$ingressDeploy = kubectl get deployment/ingress-nginx-controller -n ingress-nginx -o yaml | ConvertFrom-Yaml
|
||
|
|
||
|
Write-Host "$logLead : Updating Ingress Nginx with proxy forwarding enabled..."
|
||
|
$ingressDeets = kubectl get cm ingress-nginx-controller -n ingress-nginx -o yaml | ConvertFrom-Yaml
|
||
|
|
||
|
$ingressDeets.Data.Add('use-forwarded-headers', 'true')
|
||
|
$ingressDeets | ConvertTo-Yaml | kubectl apply -f -
|
||
|
|
||
|
Write-Host "$logLead : Deleting ingress nginx deployment"
|
||
|
kubectl delete deployment/ingress-nginx-controller -n ingress-nginx
|
||
|
|
||
|
$ingressDeploy.spec.template.spec.containers[0].args += "--default-ssl-certificate=ingress-nginx/ingress-tls-secret"
|
||
|
$ingressDeploy.metadata.Remove('managedFields')
|
||
|
$ingressDeploy.Remove('status')
|
||
|
$modifiedDeploy = $ingressDeploy | ConvertTo-Yaml
|
||
|
|
||
|
Write-Host "$logLead : Recreating ingress nginx deployment with default ssl certificiate"
|
||
|
$modifiedDeploy | kubectl apply -f -
|
||
|
|
||
|
Write-Host "$logLead : Waiting for ingress nginx controller to be healthy before proceeding..."
|
||
|
kubectl rollout status deployment/ingress-nginx-controller -n ingress-nginx
|
||
|
|
||
|
kubectl apply -f (Join-Path $resourcesPath "ingress-dashboard.yaml")
|
||
|
|
||
|
Write-Host "$logLead : Checking for local kubernetes configuration file path: ${$localK8sConfigurationPath}"
|
||
|
|
||
|
if (-not (Test-Path $config.localK8sConfigurationPath)) {
|
||
|
Write-Host "$logLead : Missing local kubernetes configuration file path. Creating..."
|
||
|
New-Item -path $HOME -name $config.localKubernetesConfigurationFolder -type "directory"
|
||
|
New-Item -path $config.localK8sConfigurationPath -name $config.localServiceVersionsFileName -type "file" -value "# Use this file to configure which services to install. You can copy any existing gitops values file for any environment - for example: https://bitbucket.corp.alkami.net/projects/AUTO/repos/alkami.gitops.kubernetes/browse/alkami-services/environments/tde/values.tde.yaml"
|
||
|
New-Item -path $config.localK8sConfigurationPath -name $config.localServiceCustomizationsFileName -type "file" -value "# Use this file to customize any service definitions via env variables etc. You can also exclude a service from being installed into your local environment (exclude: true)"
|
||
|
} else {
|
||
|
Write-Host "$logLead : Found existing local kubernetes configuration file path at: $localK8sConfigurationPath"
|
||
|
}
|
||
|
|
||
|
if (!(helm repo list | select-string proget)) {
|
||
|
Write-Host "$logLead : Missing helm repo configuration. Adding proget repo..."
|
||
|
helm repo add proget "https://packagerepo.orb.alkamitech.com/helm/helm-charts"
|
||
|
}
|
||
|
|
||
|
if ($IncludeArgoCD.IsPresent) {
|
||
|
Write-Host "$logLead : Adding ArgoCD helm repo configuration..."
|
||
|
helm repo add argo https://argoproj.github.io/argo-helm
|
||
|
helm repo add argo-rollouts https://argoproj.github.io/argo-helm
|
||
|
}
|
||
|
|
||
|
Write-Host "$logLead : Updating helm repos..."
|
||
|
helm repo update
|
||
|
|
||
|
Write-Host "$logLead : Installing alkami-local-dev helm chart..."
|
||
|
helm install alkami-local-dev --repo https://packagerepo.orb.alkamitech.com/helm/helm-charts $config.helmChartName -n localhost --create-namespace --dependency-update -f $config.localServiceVersionsFilePath -f $config.localServiceCustomizationsFilePath
|
||
|
|
||
|
if ($IncludeKibana.IsPresent) {
|
||
|
helm install alkami-dev-kibana --repo https://packagerepo.orb.alkamitech.com/helm/helm-charts alkami-dev-kibana --dependency-update
|
||
|
}
|
||
|
|
||
|
if ($IncludeArgoCD.IsPresent) {
|
||
|
$currentDate = (get-date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
|
||
|
helm install argocd argo/argo-cd -n argocd --create-namespace --set server.ingress.enabled=true --set server.ingress.hosts[0]=argocd.localhost.dev.alkami.net --set server.extraArgs[0]='--insecure' --set config.secret.extraArgs[1]='--disable-auth' --set configs.secret.argocdServerAdminPassword='$2y$10$CyYdVLTiR8OO2gGwkQsAeuwAFYeSOzPH6Kf/aan7fLau57fgVaUaq' --set configs.secret.argocdServerAdminPasswordMtime="$currentDate"
|
||
|
helm install argo-rollouts argo-rollouts/argo-rollouts -n argo-rollouts --create-namespace
|
||
|
}
|
||
|
}
|