Azure Kubernetes Powershell Scripts

Mass resources change

Необходимо добавить 10% по памяти всем всем всем деплойментам

$deployments = kubectl get deployments -o json | ConvertFrom-Json | Select-Object -ExpandProperty items

foreach($deployment in $deployments) {
    # $deployment = $deployments |? { $_.metadata.name -eq 'users-api' }
    foreach($container in $deployment.spec.template.spec.containers) {
        # $container = $deployment.spec.template.spec.containers[0]
        if (-not $container.resources.requests.memory) {
            Write-Host "$($($deployment.metadata.name)) has no memory requests - skipping" -ForegroundColor Cyan
            continue
        }
        if (-not $container.resources.limits.memory) {
            Write-Host "$($($deployment.metadata.name)) has no memory limits - skipping" -ForegroundColor Cyan
            continue
        }
        if ($container.resources.requests.memory.Contains('Gi') -or $container.resources.limits.memory.Contains('Gi')) {
            Write-Host "$($($deployment.metadata.name)) has big memory requests of $($($container.resources.requests.memory)) - skipping" -ForegroundColor Cyan
            continue
        }

        $requestsCurrent = [int]$container.resources.requests.memory.Replace('Gi', '000').Replace('Mi', '')
        $requestsDesired = [math]::Ceiling( $requestsCurrent * 1.1 / 10 ) * 10

        $limitsCurrent = [int]$container.resources.limits.memory.Replace('Mi', '')
        $limitsDesired = [math]::Ceiling( $limitsCurrent * 1.1 / 10 ) * 10

        # Write-Host "$($deployment.metadata.name) requests $requestsCurrent > $requestsDesired limits $limitsCurrent > $limitsDesired"

        $patch = @{
            spec = @{
                template = @{
                    spec = @{
                        containers = @(
                            @{
                                name = $container.name
                                resources = @{
                                    requests = @{
                                        memory = "$($requestsDesired)Mi"
                                    }
                                    limits = @{
                                        memory = "$($limitsDesired)Mi"
                                        cpu = $null
                                    }
                                }
                            }
                        )
                    }
                }
            }
        } | ConvertTo-Json -Compress -Depth 100
        Write-Host "kubectl patch deployment $($deployment.metadata.name) -p '$patch'"
    }
}

Примечание: это скрипт который на деле ничего не меняет и просто генерит команды для каждого деплоймента, далее руками для самых больших и важных по ощущениям выполняем, глядим что бы применилось и что приложешька заработала, как набрались уверенности уже массово все применяем

Kubernetes Mass Node Affinity Change

This script was used to mass change of node affinity from "app" to "svc" while separating foreground and background workloads

kubectx test
kubens test2

$deployments = kubectl get deployments -o json | ConvertFrom-Json | Select-Object -ExpandProperty items

foreach($deployment in $deployments) {
    if ($deployment.metadata.name -in $('alliance-jobmob', 'chat-api-job-redis', 'employer-events-api', 'mailhog')) { continue }
    if ($deployment.metadata.name.ToLower() -notmatch 'mail|consumer|event|job') { continue }
    $affinity = $deployment.spec.template.spec.affinity
    if (-not $affinity) { continue }
    if ($affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0] -eq 'svc') { continue }
    $affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0] = 'svc'
    $patch = ConvertTo-Json -Compress -Depth 100 -InputObject @{
        spec = @{
            template = @{
                spec = @{
                    affinity = $affinity
                }
            }
        }
    }


    Write-Host "kubectl patch deployment $($deployment.metadata.name) -p '$patch'"
    Write-Host "kubectl rollout status deployment/$($deployment.metadata.name) --timeout=1m"
    Write-Host ""
}

$cronjobs = kubectl get cronjobs -o json | ConvertFrom-Json | Select-Object -ExpandProperty items
foreach($cronjob in $cronjobs) {
    $affinity = $cronjob.spec.jobTemplate.spec.template.spec.affinity
    if (-not $affinity) { continue }
    if ($affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0] -eq 'svc') { continue }
    $affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0] = 'svc'
    $patch = ConvertTo-Json -Compress -Depth 100 -InputObject @{
        spec = @{
            jobTemplate = @{
                spec = @{
                    template = @{
                        spec = @{
                            affinity = $affinity
                        }
                    }
                }
            }
        }
    }

    Write-Host "kubectl patch cronjob $($cronjob.metadata.name) -p '$patch'"
}