Рубрики
Uncategorized

Написание плагина Kubectl с PowerShell

Чем все больше и больше я использую рабочую нагрузку на Kubernetes с помощью Azure Kubernetes Service. Больше, я использую также выигрыш … Tagged с PowerShell, Azure, Kubernetes, DevOps.

Чем все больше и больше я использую рабочую нагрузку на Kubernetes с помощью Azure Kubernetes Service. Больше я использую также контейнеры Windows.

Если вы управляете kubectl, вы можете быть иногда разочарованы, так как вам нужно печатать различные команды для выполнения некоторых задач или использовать сложные выражения с -JsonPath, чтобы извлечь необходимую информацию. Что если вы смогли немного автоматизировать это? С 1.12 Kubernetes, Kubectl поддерживает добавление подкомандов для автоматизации задач; Кобектл плагин.

Плагины Kubectl являются исполняемыми файлами, идентифицируемыми с помощью префикса «kubectl-». Файл должен быть расположен на вашем пути (/usr/bin/path, например, в Linux или в любом каталоге, присутствующем в переменной среды пути в Windows).

Создание плагина Kubectl просто, так как библиотека или компонент не требуется. Каждый язык программирования может быть использован. Единственное условие-это префикс «kubeclt-«. Когда вы звоните в плагин из Kubectl, вам просто нужно опустить префикс имени файла плагина. Например, если имя файла является kubectl-mycmd, имя плагина будет MyCmd, и вы можете позвонить ему, используя:

kubectl mycmd

Плагин может работать с аргументами. Вы можете передать аргументы в плагин после имени плагина.

kubectl mycmd Arg1 Arg2 ... ArgN

Как вы понимаете, черта в имени файла преобразуется в космос, поэтому kubectl-my-cmd переводится в Kubectl мой cmd (Но вы должны избегать этого, поскольку это путает пользователей, если ваши аргументы поддержки плагинов). Если вы хотите добавить Dash в имя плагина (не имя файла), вам нужно использовать подчеркивание, файл kubeclt-my_cmd переводится в Kubectl my-cmd.

На Linux, как вы можете использовать PowerShell для создания плагина Kubectl?

Если вы используете PowerShell в течение долгого времени, я имею в виду, что вы начали использовать PowerShell в Windows, вы можете подумать, что не можете сделать исполняемый файл сценария PowerShell. Это по дизайну. Но на Linux все по -другому. Выполнение унаследовано не расширением файла, а разрешениями файла, называемых режимами, где x представляет выполнение. Таким образом, изменения атрибута доступа достаточно, чтобы разрешить выполнение файла.

sudo chmod +x ./kubectl-mycmd

Но как сказать, что мы хотим, чтобы сценарий был выполнен PowerShell. В Windows вы можете использовать pwsh.exe -f или powershell.exe -f. Но на платформе Linux есть еще один вариант, который вы можете использовать! Инструкция, чтобы указать, какой процессор сценария использовать с файлом.

Давайте создадим простой плагин. Создайте файл с именем kubectl-psversion

#! /usr/bin/pwsh

write-host "Version $($psversiontable.PSVersion)"

Измените атрибут выполнения

sudo chmod +x ./kubectl-psversion

и переместить файл в/usr/local/bin

sudo mv ./kubectl-psversion /usr/local/bin

А теперь вы можете использовать плагин

Kubectl psversion 

Отображение версии PowerShell, установленной в настоящее время на вашей рабочей станции, не полезно для вашей ежедневной работы с Kubernetes.

Я спросил себя, с какими задачами у вас есть самые трудоемкие задачи? Например, получение информации о стручках в простой таблице. Мне часто нужно собирать состояние, имя, узлы и количество перезапуска для всех стручков в пространстве имен. Как это сделать? Во -первых, стандартный выход Kubectl может быть трудно анализировать. Надеемся, что есть еще два способа получить эту информацию Yaml и JSON. PowerShell очень хорошо обрабатывает JSON. Он преобразует документ JSON в объект PSCustomOmobject, с которым вы можете иметь дело. Чтобы собрать информацию, вам нужно о капсулах, которые вы можете использовать

$Podslist = (kubectl get pods -o json) | convertfrom-Json

Но как мы можем справиться с пространствами имен? Имя пространства имен должно быть необязательным аргументом для плагина. Kubectl не поддерживает именованные параметры, только позиционные параметры (arg1 arg2 arg3…). Сценарий PowerShell должен справиться с этим. Обычно для функций и модулей это не лучшая практика, но другого выбора нет.

param(
    [parameter(Position=0)]
    [string]
    $namespace
)

Если пространство имен не передается в плагин, следует использовать пространство имен по умолчанию.

    if (!($PSBoundParameters.ContainsKey('namespace'))){
        $namespace ="default"
    }

Собрать все вещи вместе, создайте файл с именем kubectl-podsinfops (не kubectl-podsinfops.ps1)

#! /usr/bin/pwsh

param(
    [parameter(Position=0)]
    [string]
    $namespace
)

try {
    if (!($PSBoundParameters.ContainsKey('namespace'))){
        $namespace ="default"
    }
    $Podslist = (kubectl get pods --namespace $namespace -o json) | convertfrom-Json
    $PodsArrayList = [System.Collections.ArrayList]::new()
    foreach ($pod in $Podslist.items) {
         [void]$PodsArrayList.Add([pscustomobject]@{ 
            PodName                 =   $pod.metadata.name
            Status                  =   $pod.status.phase
            restartCount            =   $pod.status.containerStatuses[0].restartCount
            StartTime               =   $pod.status.startTime
            image                   =   $pod.status.containerStatuses[0].image
            Node                    =   $pod.spec.nodeName 
            NodeType                =   $pod.spec.nodeSelector
        })
    }
    $PodsArrayList  | Format-Table -AutoSize
}
catch {
     "An error occurred that could not be resolved."
}

Сделайте исполняемый файл

sudo chmod +x ./kubectl-podsinfops

Переместите его на свой путь

sudo mv ./kubectl-podsinfops  /usr/local/bin

Теперь вы можете использовать плагин, Kubectl Podsinfop, для пространства имен по умолчанию и кубект -Podsinfop MyNamespace для конкретного пространства имен.

А как насчет Windows?

Существует две основные проблемы, файлы PowerShell не являются прямыми исполняемыми делами и расширения имени файла. Чтобы решить первую проблему, вам нужно использовать файл .bat, чтобы вызвать свой скрипт PowerShell. Первый шаг Создайте папку для плагина и добавьте ее в переменную среды пути.

Затем создайте свой скрипт здесь, но не назовите его kubectl-xxx, используйте еще одно соглашение о именованиях, например, k8splugin-scriptname.ps1. В плагине каталога создайте kubectl-podinfops.bat и добавьте эту команду.

@echo off 
pwsh.exe  -file "x:\pathTo\K8splugin-podinfosps.ps1" %1

Теперь вы можете использовать плагин, kubectl podinfops.bat. Но подождите, есть немного больше, вы можете опустить .dat имени файла, Kubectl Podinfops.

Создать плагины для kubectl просто. Плагины работают на Linux и Windows. Теперь вы знаете, как вы можете использовать свои навыки PowerShell для автоматизации ваших задач Kubectl.

Оригинал: «https://dev.to/omiossec/writing-kubectl-plugin-with-powershell-4c25»