
Se você trabalha com Kubernetes, provavelmente o kubectl é uma das ferramentas que você mais utiliza. Sempre que você gasta muito tempo trabalhando com uma ferramenta específica, vale a pena estudá-la bem e aprender a usá-la de forma eficiente.
Time traduziu o artigo de Daniel Weibel, onde você encontrará dicas e truques para uma utilização eficaz do kubectl. Isso também ajudará a entender melhor o funcionamento do Kubernetes.
Segundo o autor, o objetivo do artigo é tornar seu trabalho diário com Kubernetes não apenas mais eficiente, mas também mais agradável!
Introdução: o que é kubectl
Antes de aprender a usar o kubectl de forma mais eficiente, é necessário obter uma compreensão básica do que é e como funciona.
Do ponto de vista do usuário, o kubectl é um painel de controle que permite executar operações do Kubernetes.
Do ponto de vista técnico, o kubectl é um cliente da API do Kubernetes.
A API do Kubernetes é uma API REST HTTP. Esta API é a verdadeira interface do usuário do Kubernetes, através da qual ele é totalmente controlado. Isso significa que cada operação do Kubernetes é representada como um endpoint da API e pode ser executada através de uma solicitação HTTP a esse endpoint.
Portanto, a principal função do kubectl é executar solicitações HTTP à API do Kubernetes:

O Kubernetes é um sistema totalmente orientado a recursos. Isso significa que ele mantém o estado interno dos recursos, e todas as operações do Kubernetes são operações CRUD.
Você controla completamente o Kubernetes, gerenciando esses recursos, e o Kubernetes determina o que fazer com base no estado atual dos recursos. Por essa razão, o link para a API do Kubernetes é organizado como uma lista de tipos de recursos com operações relacionadas.
Vamos considerar um exemplo.
Suponha que você queira criar um recurso ReplicaSet. Para isso, você descreve o ReplicaSet em um arquivo chamado replicaset.yaml, em seguida, executa o comando:
$ kubectl create -f replicaset.yamlComo resultado, um recurso ReplicaSet será criado. Mas o que acontece nos bastidores?
No Kubernetes, há uma operação de criação de ReplicaSet. Como qualquer outra operação, ela é disponibilizada como um endpoint da API. O endpoint específico da API para essa operação é o seguinte:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsOs endpoints da API de todas as operações do Kubernetes podem ser encontrados na incluindo ). Para fazer a solicitação real ao endpoint, é necessário adicionar previamente o URL do servidor da API aos caminhos dos endpoints que estão listados na documentação da API.
Portanto, quando você executa o comando mencionado acima, o kubectl envia uma solicitação HTTP POST para o endpoint da API indicado. A definição do ReplicaSet que você mencionou no arquivo replicaset.yaml, é passada no corpo da solicitação.
É assim que o kubectl funciona para todos os comandos que interagem com o cluster Kubernetes. Em todos esses casos, o kubectl simplesmente envia solicitações HTTP para os endpoints da API Kubernetes correspondentes.
Observe que é possível gerenciar completamente o Kubernetes com uma ferramenta como curl, enviando manualmente solicitações HTTP para a API Kubernetes. O kubectl apenas facilita a utilização da API Kubernetes.
Esses são os fundamentos do que é o kubectl e como ele funciona. Mas há mais sobre a API Kubernetes que todo usuário do kubectl deve saber. Vamos dar uma rápida olhada no mundo interno do Kubernetes.
O mundo interno do Kubernetes
O Kubernetes consiste em um conjunto de componentes independentes que são executados como processos separados em nós do cluster. Alguns componentes operam nos nós principais, enquanto outros operam nos nós de trabalho, cada componente executa sua tarefa especial.
Aqui estão os componentes mais importantes nos nós principais:
- Na janela aberta, preencha os seguintes campos: — armazena definições de recursos ().
- Servidor API — fornece API e gerencia o armazenamento.
- Controlador de gerenciador — garante que os status dos recursos correspondam às especificações.
- Agendador — agenda pods nos nós de trabalho.
E aqui está um dos componentes mais importantes nos nós de trabalho:
- começou a usar — gerencia a execução de contêineres no nó de trabalho.
Para entender como esses componentes funcionam juntos, vejamos um exemplo.
Suponha que você acabou de executar kubectl create -f replicaset.yaml, após o qual o kubectl fez uma solicitação HTTP POST para (passando a definição do recurso ReplicaSet).
O que acontece no cluster?
- Após a execução,
kubectl create -f replicaset.yamlo servidor da API armazena a definição do seu recurso ReplicaSet no armazenamento:
- Em seguida, o controlador do ReplicaSet é iniciado no gerenciador de controladores, que lida com a criação, alteração e exclusão de recursos ReplicaSet:

- O controlador do ReplicaSet cria a definição do pod para cada réplica do ReplicaSet (de acordo com o modelo de pod na definição do ReplicaSet) e as armazena:

- Um planejador é iniciado para monitorar os pods que ainda não foram atribuídos a nenhum nó de trabalho:

- O planejador seleciona um nó de trabalho apropriado para cada pod e adiciona essa informação à definição do pod no armazenamento:

- No nó de trabalho ao qual um pod é atribuído, o Kubelet é iniciado e monitora os pods atribuídos a esse nó:

- O Kubelet lê a definição do pod do armazenamento e dá comandos para o ambiente de execução de contêineres, como o Docker, para iniciar os contêineres no nó:

Abaixo está a versão textual desta descrição.
Uma solicitação da API para o ponto final de criação do ReplicaSet é processada pelo servidor da API. O servidor da API autentica a solicitação e salva a definição do recurso ReplicaSet no armazenamento.
Esse evento aciona o controlador do ReplicaSet, que é um subprocesso do gerenciador de controladores. O controlador do ReplicaSet monitora a criação, atualização e exclusão de recursos ReplicaSet no armazenamento e é notificado sobre eventos quando isso ocorre.
A função do controlador do ReplicaSet é garantir que exista o número necessário de pods de réplica do ReplicaSet. No nosso exemplo, ainda não existem pods, portanto o controlador do ReplicaSet cria essas definições de pods (de acordo com o modelo de pod na definição do ReplicaSet) e as salva no armazenamento.
A criação de novos pods aciona o planejador, que monitora as definições de pods que ainda não foram agendadas para os nós de trabalho. O planejador seleciona um nó de trabalho apropriado para cada pod e atualiza as definições de pod no armazenamento.
Observe que até este momento nenhum código de carga de trabalho foi executado no cluster. Tudo o que foi feito até agora, — é criar e atualizar recursos no armazenamento no nó mestre.
O último evento aciona os Kubelets, que monitoram os pods agendados para seus nós de trabalho. O Kubelet do nó de trabalho, para o qual seus pods ReplicaSet estão definidos, deve instruir o ambiente de execução de contêineres, como o Docker, a baixar as imagens de contêiner necessárias e a iniciá-las.
Neste momento, finalmente, seu aplicativo ReplicaSet está em funcionamento!
O papel da API Kubernetes
Como você viu no exemplo anterior, os componentes do Kubernetes (exceto o servidor da API e o armazenamento) monitoram as mudanças nos recursos no armazenamento e alteram as informações sobre os recursos no armazenamento.
Claro, esses componentes não interagem diretamente com o armazenamento, mas apenas por meio da API do Kubernetes.
Vamos considerar os seguintes exemplos:
- O controlador ReplicaSet usa o ponto final da API com o parâmetro
observarpara monitorar as alterações nos recursos do ReplicaSet. - O controlador ReplicaSet usa o ponto final da API (criar pod) para criar pods.
- O escalonador usa o ponto final da API (modificar pod) para atualizar pods com informações sobre o nó de trabalho selecionado.
Como você pode ver, esta é a mesma API à qual o kubectl se conecta. Usar a mesma API para o funcionamento dos componentes internos e dos usuários externos é um conceito fundamental do design do Kubernetes.
Agora podemos resumir como o Kubernetes funciona:
- O armazenamento mantém o estado, ou seja, os recursos do Kubernetes.
- O servidor API fornece uma interface para o armazenamento na forma da API do Kubernetes.
- Todos os outros componentes e usuários do Kubernetes lêem, observam e manipulam o estado (recursos) do Kubernetes através da API.
Entender esses conceitos ajudará a compreender melhor o kubectl e a usá-lo ao máximo.
Agora vamos considerar uma série de dicas e truques específicos que podem ajudar a melhorar a eficiência do uso do kubectl.
1. Acelerando a entrada com o complemento de comandos
Uma das técnicas mais úteis, mas frequentemente ignoradas, para melhorar a eficiência do uso do kubectl é o complemento de comandos.
O complemento de comandos permite preencher automaticamente partes de comandos do kubectl pressionando a tecla Tab. Isso funciona para subcomandos, opções e argumentos, incluindo aqueles complexos, como nomes de recursos.
Veja como funciona o complemento de comandos do kubectl:

O complemento de comandos funciona para shells Bash e Zsh.
contém instruções detalhadas sobre como configurar o autocomplemento, mas abaixo fornecemos um resumo curto.
Como funciona o complemento de comandos
O complemento de comandos é uma função do shell que funciona por meio de um script de complemento. O script de complemento é um script de shell que define o comportamento do complemento para um comando específico.
Kubectl gera automaticamente e gera scripts de complemento para Bash e Zsh com os seguintes comandos:
$ kubectl completion bashOu:
$ kubectl completion zshEm teoria, basta conectar a saída desses comandos ao shell correspondente para que o kubectl possa completar os comandos.
Na prática, a forma de conexão difere para Bash (incluindo as diferenças entre Linux e MacOS) e Zsh. Abaixo, vamos abordar todas essas opções.
Bash no Linux
O script de complemento para Bash depende do pacote bash-completion, portanto, você precisa instalá-lo primeiro:
$ sudo apt-get install bash-completionOu:
$ yum install bash-completionVocê pode testar se o pacote foi instalado com sucesso usando o seguinte comando:
$ type _init_completion Se o código da função do shell for exibido, então o bash-completion está instalado corretamente. Se o comando gerar um erro "Não encontrado", você precisa adicionar a seguinte linha ao seu arquivo ~ /.bashrc:
$ source /usr/share/bash-completion/bash_completion Se você deve adicionar esta linha ao arquivo ~ /.bashrc ou não, depende do gerenciador de pacotes que você usou para instalar o bash-completion. Para APT, isso é necessário; para YUM, não.
Após instalar o bash-completion, você precisa configurar tudo para que o script de complemento kubectl seja incluído em todas as sessões do shell.
Uma das formas de fazer isso é adicionar a seguinte linha ao arquivo ~ /.bashrc:
source <(kubectl completion bash) Outra opção é adicionar o script de complemento kubectl ao diretório /etc/bash_completion.d (crie-o se não existir):
$ kubectl completion bash > /etc/bash_completion.d/kubectl Todos os scripts de complemento no diretório /etc/bash_completion.d são automaticamente habilitados no bash-completion.
Ambas as opções são igualmente aplicáveis.
Após reiniciar o shell, a auto-completação de comandos kubectl funcionará.
Bash no MacOS
No MacOS, a configuração é um pouco mais complicada. O fato é que, por padrão, o MacOS vem com o Bash versão 3.2, enquanto o script de auto-completação kubectl requer versão do Bash não inferior a 4.1 e não funciona no Bash 3.2.
O uso de uma versão desatualizada do Bash no MacOS está relacionado a questões de licenciamento. O Bash versão 4 é distribuído sob a licença GPLv3, a qual não é suportada pela Apple.
Para configurar a auto-completação do kubectl no MacOS, é necessário instalar uma versão mais recente do Bash. Você também pode configurar o Bash atualizado como shell padrão, o que evitará muitos problemas no futuro. Isso não é difícil, detalhes estão disponíveis no artigo “».
Antes de continuar, certifique-se de que você está usando uma versão recente do Bash (verifique a saída bash --version).
O script de auto-completação no Bash depende do projeto , portanto, você deve instalá-lo primeiro.
Você pode instalar o bash-completion usando :
$ brew install bash-completion@2 Aqui @2 indica a versão 2 do bash-completion. O autocompletar do kubectl requer bash-completion v2, e o bash-completion v2 requer versão do Bash no mínimo 4.1.
Saída do comando brew-install contém uma seção Caveats, onde é indicado o que deve ser adicionado ao arquivo ~/.bash_profile:
export BASH_COMPLETION_COMPAT_DIR=\usr\local\etc\bash_completion.d
[[ -r \ No entanto, eu recomendo adicionar essas linhas não em ~/.bash_profile, e no ~/.bashrc. Nesse caso, o autocompletar estará disponível não apenas no shell principal, mas também em shells filhas.
Após reiniciar o shell, você pode verificar a instalação correta usando o seguinte comando:
$ type _init_completionSe na saída você vê uma função shell, então tudo está configurado corretamente.
Agora você precisa garantir que o autocompletar do kubectl esteja habilitado em todas as sessões.
Uma maneira é adicionar a seguinte linha no seu ~/.bashrc:
source <(kubectl completion bash) Outra maneira é adicionar o script de autocompletar na pasta /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlEste método funcionará apenas se você instalou o bash-completion usando o Homebrew. Nesse caso, o bash-completion carrega todos os scripts dessa diretório.
Se você instalou , então você não precisa executar a etapa anterior, pois o script de autocompletar será automaticamente colocado na pasta /usr/local/etc/bash_completion.d durante a instalação. Nesse caso, o autocompletar do kubectl começará a funcionar assim que você instalar o bash-completion.
No final, todas essas opções são equivalentes.
Zsh
Os scripts de autocompletar para Zsh não requerem dependências. Tudo o que você precisa é habilitá-los ao iniciar o shell.
Você pode fazer isso adicionando a linha ao seu ~/.zshrc arquivo:
source <(kubectl completion zsh) Se você recebeu o erro not found: compdef após reiniciar seu shell, você precisa habilitar a função embutida compdef. Ela pode ser habilitada adicionando ao início do seu arquivo ~/.zshrc o seguinte:
autoload -Uz compinit
compinit2. Visão rápida das especificações de recursos
Quando você cria definições de recursos YAML, é necessário saber os campos e seus valores para esses recursos. Um dos locais para buscar essas informações é no manual da API, que contém especificações completas de todos os recursos.
No entanto, mudar para o navegador toda vez que precisar buscar algo é inconveniente. Portanto, o kubectl fornece um comando kubectl explain, que mostra as especificações de todos os recursos diretamente no seu terminal.
O formato do comando é o seguinte:
$ kubectl explain resource[.field]...A equipe exibirá a especificação do recurso ou campo solicitado. As informações exibidas são idênticas às contidas no guia da API.
Por padrão kubectl explain mostra apenas o primeiro nível de aninhamento dos campos.
Ver como isso fica .
Você pode exibir toda a árvore adicionando a opção --recursive:
$ kubectl explain deployment.spec --recursiveSe você não souber exatamente quais recursos são necessários, pode exibi-los todos com o seguinte comando:
$ kubectl api-resources Este comando exibe os nomes dos recursos na forma plural, por exemplo, implantações em vez de deployment. Ele também exibe o nome abreviado, por exemplo deploy, para aqueles recursos que o possuem. Não se preocupe com essas diferenças. Todas essas variações de nome são equivalentes para o kubectl. Ou seja, você pode usar qualquer uma delas para kubectl explain.
Todos os comandos abaixo são equivalentes:
$ kubectl explain deployments.spec
# ou
$ kubectl explain deployment.spec
# ou
$ kubectl explain deploy.spec3. Use um formato de saída customizado para colunas
Por padrão, o formato de saída do comando kubectl get:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
engine-544b6b6467-22qr6 1/1 Running 0 78d
engine-544b6b6467-lw5t8 1/1 Running 0 78d
engine-544b6b6467-tvgmg 1/1 Running 0 78d
web-ui-6db964458-8pdw4 1/1 Running 0 78dEsse formato é conveniente, mas contém uma quantidade limitada de informações. Em comparação com o formato completo de definição de recursos, aqui são exibidos apenas alguns campos.
Nesse caso, você pode usar um formato de saída customizado para colunas. Ele permite definir quais dados exibir. Você pode exibir qualquer campo do recurso em uma coluna separada.
Usar um formato customizado é definido com as opções:
-o custom-columns=:[,:]... Você pode definir cada coluna de saída como um par , onde — nome da coluna, e <jsonpath> — expressão que define o campo do recurso.
Vamos ver um exemplo simples:
$ kubectl get pods -o custom-columns='NAME:metadata.name'
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4A saída contém uma coluna com os nomes dos pods.
A expressão na opção seleciona os nomes dos pods do campo metadata.name. Isso porque o nome do pod é definido no campo filho name do campo metadata na descrição do recurso do pod. Para mais detalhes, consulte o ou digite o comando kubectl explain pod.metadata.name.
Agora, suponha que você queira adicionar uma coluna extra à saída, por exemplo, mostrando o nó em que cada pod está sendo executado. Para isso, você pode simplesmente adicionar a especificação de coluna correspondente na opção de colunas personalizadas:
$ kubectl get pods
-o custom-columns='NAME:metadata.name,NODE:spec.nodeName'
NAME NODE
engine-544b6b6467-22qr6 ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8 ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4 ip-10-0-118-34.ec2.internal A expressão seleciona o nome do nó de spec.nodeName — quando o pod é atribuído a um nó, seu nome é escrito no campo spec.nodeName da especificação de recursos do pod. Você pode encontrar mais informações na saída de kubectl explain pod.spec.nodeName.
Observe que os campos de recursos do Kubernetes são sensíveis a maiúsculas e minúsculas.
Você pode visualizar qualquer campo de recurso como uma coluna. Basta revisar a especificação do recurso e experimentá-la com quaisquer campos que você desejar.
Mas primeiro, vamos explorar mais detalhadamente as expressões de seleção de campos.
Expressões JSONPath
As expressões para seleção de campos de recursos são baseadas em .
JSONPath é uma linguagem para extrair dados de documentos JSON. Selecionar um único campo é o caso de uso mais simples do JSONPath. Ele possui muitas , incluindo seletores, filtros e assim por diante.
O kubectl explain suporta um número limitado de funcionalidades do JSONPath. Abaixo estão descritas as funcionalidades e exemplos de como usá-las:
# Выбрать все элементы списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[*].image'
# Выбрать специфический элемент списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Выбрать элементы списка, попадающие под фильтр
$ kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Выбрать все поля по указанному пути, независимо от их имени
$ kubectl get pods -o custom-columns='DATA:metadata.*'
# Выбрать все поля с указанным именем, вне зависимости от их расположения
$ kubectl get pods -o custom-columns='DATA:..image'Um operador especial é o []. Muitos campos de recursos do Kubernetes são listas, e esse operador permite selecionar elementos dessas listas. Ele é frequentemente usado com o caractere curinga como [*] para selecionar todos os elementos da lista.
Exemplos de aplicação.
As possibilidades de usar o formato de saída personalizado de colunas são ilimitadas, já que você pode exibir qualquer campo ou combinação de campos de recurso na saída. Aqui estão alguns exemplos de aplicações, mas sinta-se à vontade para explorá-las você mesmo e encontrar usos que sejam úteis para você.
- Exibindo imagens de contêineres para pods:
$ kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' NAME IMAGES engine-544b6b6467-22qr6 rabbitmq:3.7.8-management,nginx engine-544b6b6467-lw5t8 rabbitmq:3.7.8-management,nginx engine-544b6b6467-tvgmg rabbitmq:3.7.8-management,nginx web-ui-6db964458-8pdw4 wordpressEsse comando exibe os nomes das imagens dos contêineres para cada pod.
Lembre-se de que um pod pode conter vários contêineres, e os nomes das imagens serão exibidos em uma única linha, separados por vírgulas.
- Exibição das zonas de disponibilidade dos nós:
$ kubectl get nodes -o custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain.beta.kubernetes.io/zone' NAME ZONE ip-10-0-118-34.ec2.internal us-east-1b ip-10-0-36-80.ec2.internal us-east-1a ip-10-0-80-67.ec2.internal us-east-1bEste comando é útil se seu cluster estiver hospedado na nuvem pública. Ele exibe a zona de disponibilidade para cada nó.
Uma zona de disponibilidade é um conceito de nuvem que restrige a zona de replicação a uma região geográfica.
As zonas de disponibilidade para cada nó são obtidas através de um rótulo especial — . Se o cluster estiver em execução em uma nuvem pública, esse rótulo é criado automaticamente e preenchido com os nomes das zonas de disponibilidade para cada nó.
Os rótulos não são parte da especificação de recursos do Kubernetes, então você não encontrará informações sobre eles em . No entanto, eles podem ser vistos (como qualquer outro rótulo) se você solicitar informações sobre os nós no formato YAML ou JSON:
$ kubectl get nodes -o yaml # ou $ kubectl get nodes -o jsonEssa é uma ótima maneira de aprender mais sobre os recursos, além de estudar as especificações de recursos.
4. Alternância fácil entre clusters e namespaces
Quando o kubectl faz uma solicitação à API do Kubernetes, ele lê o arquivo kubeconfig para obter todos os parâmetros necessários para a conexão.
Por padrão, o arquivo kubeconfig é ~/.kube/config. Normalmente, esse arquivo é criado ou atualizado por um comando específico.
Quando você trabalha com vários clusters, seu arquivo kubeconfig contém parâmetros de conexão para todos esses clusters. Você precisa de uma maneira de informar ao kubectl qual cluster você está usando.
Dentro de um cluster, você pode criar vários namespaces — uma espécie de cluster virtual dentro de um cluster físico. O kubectl também determina qual namespace usar com base nas informações do arquivo kubeconfig. Portanto, você também precisa de uma maneira de informar ao kubectl qual namespace trabalhar.
Nesta seção, vamos explicar como isso funciona e como atingir uma operação eficaz.
Observe que você pode ter vários arquivos kubeconfig listados na variável de ambiente KUBECONFIG. Nesse caso, todos esses arquivos serão combinados em uma única configuração geral durante a execução. Você também pode alterar o arquivo kubeconfig padrão, executando kubectl com o parâmetro --kubeconfig. Veja .
Arquivos kubeconfig
Vamos examinar o que exatamente contém o arquivo kubeconfig:

Como você pode ver, o arquivo kubeconfig contém um conjunto de contextos. Um contexto consiste em três elementos:
- Cluster — URL da API do servidor do cluster.
- User — credenciais de autenticação do usuário no cluster.
- Namespace — espaço de nomes usado ao se conectar ao cluster.
Na prática, é comum usar um único contexto por cluster em seu arquivo kubeconfig. No entanto, você pode ter vários contextos por cluster, diferenciados por usuário ou espaço de nomes. Entretanto, essa configuração com múltiplos contextos é rara, portanto, geralmente há um mapeamento um-para-um entre clusters e contextos.
A qualquer momento, um dos contextos é o atual:

Quando o kubectl lê o arquivo de configuração, ele sempre usa as informações do contexto atual. No exemplo acima, o kubectl se conectará ao cluster Hare.
Assim, para mudar para outro cluster, você precisa alterar o contexto atual no arquivo kubeconfig:

Agora, o kubectl se conectará ao cluster Fox.
Para mudar para outro espaço de nomes no mesmo cluster, você deve alterar o valor do elemento namespace para o contexto atual:

No exemplo acima, o kubectl usará o espaço de nomes Prod do cluster Fox (anteriormente estava definido para o espaço de nomes Test).
Observe que o kubectl também fornece os parâmetros --cluster, --user, --namespace e --context, que permitem sobrescrever elementos específicos e o próprio contexto atual, independentemente do que está configurado no arquivo kubeconfig. Veja opções do kubectl.
Teoricamente, você pode alterar manualmente os parâmetros no arquivo kubeconfig. Mas isso é inconveniente. Para simplificar essas operações, existem várias ferramentas que permitem mudar os parâmetros automaticamente.
Use kubectx
Uma ferramenta muito popular para alternar entre clusters e espaços de nomes.
A utilidade fornece comandos kubectx e kubens para alterar o contexto atual e o namespace, respectivamente.
Como mencionado anteriormente, mudar o contexto atual significa alterar o cluster, se você tiver apenas um contexto por cluster.
Aqui está um exemplo de execução desses comandos:

Essencialmente, esses comandos apenas editam o arquivo kubeconfig, como descrito acima.
Para instalar kubectx, siga as instruções em
Ambos os comandos suportam a autocompletação de nomes de contextos e namespaces, permitindo que você não precise digitá-los completamente. As instruções para configurar a autocompletação .
Outra função útil kubectx é . Ele funciona em conjunto com a utilidade , que deve ser instalada separadamente. A instalação do fzf torna o modo interativo automaticamente disponível em kubectx. No modo interativo, você pode escolher o contexto e o namespace através de uma interface de busca livre interativa fornecida pelo fzf.
Uso de aliases de shell
Você não precisa de ferramentas separadas para mudar o contexto atual e o namespace, pois o kubectl também fornece comandos para isso. Assim, o comando kubectl config fornece subcomandos para editar arquivos kubeconfig.
Aqui estão algumas delas:
kubectl config get-contexts: listar todos os contextos;kubectl config current-context: obter o contexto atual;kubectl config use-context: mudar o contexto atual;kubectl config set-context: modificar o item de contexto.
No entanto, usar esses comandos diretamente não é muito conveniente, pois são longos. É possível criar aliases de shell para eles, que são fáceis de executar.
Eu criei um conjunto de aliases com base nesses comandos, que fornecem funcionalidade semelhante ao kubectx. Aqui você pode ver sua ação:

Observe que os aliases usam fzf para fornecer uma interface de busca livre interativa (como no modo interativo do kubectx). Isso significa que você precisa , para usar esses aliases.
Aqui estão as definições dos aliases:
# Получить текущий контекст
alias krc='kubectl config current-context'
# Список всех контекстов
alias klc='kubectl config get-contexts -o name | sed "s/^/ /;|^ $(krc)$|s/ /*/"'
# Изменить текущий контекст
alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"'
# Получить текущее пространство имен
alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print $5}" | sed "s/^$/default/"'
# Список всех пространств имен
alias kln='kubectl get -o name ns | sed "s|^.*/| |;|^ $(krn)$|s/ /*/"'
# Изменить текущее пространство имен
alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"' Para instalar esses aliases, você deve adicionar as definições acima ao seu arquivo ~/.bashrc ou ~/.zshrc e reiniciar seu shell.
Uso de plugins
O Kubectl permite carregar plugins, que são executados da mesma forma que os comandos principais. Você pode, por exemplo, instalar o plugin kubectl-foo e executá-lo fazendo o comando kubectl foo.
Seria conveniente alternar o contexto e o namespace dessa forma, por exemplo, executando kubectl ctx para mudar o contexto e kubectl ns para mudar o namespace.
Eu escrevi dois plugins que fazem isso:
O funcionamento dos plugins baseia-se nos aliases da seção anterior.
Aqui está como eles funcionam:

Observe que os plugins usam fzf para fornecer uma interface interativa de busca livre (como no modo interativo kubectx). Isso significa que você precisa, para usar esses aliases.
Para instalar os plugins, você precisa baixar os scripts de shell com os nomes e em qualquer diretório na sua variável PATH e torná-los executáveis, por exemplo, com chmod +x. Após isso, você poderá usar kubectl ctx e kubectl ns.
5. Redução de entrada com auto-aliases
Os aliases de shell são uma ótima maneira de acelerar a entrada. O projeto contém cerca de 800 abreviações para os principais comandos kubectl.
Você pode se perguntar — como lembrar 800 aliases? Mas não é necessário lembrar todos, pois eles são construídos de acordo com um esquema simples, que está detalhado abaixo:

Por exemplo:
- kgpooyaml — kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-system get svc w
- ksysrmcm — kubectl -n kube-system rm cm
- kgdepallsl — kubectl get deployment all sl
Como você pode ver, os aliases são compostos por componentes, cada um representando um elemento específico do comando kubectl. Cada alias pode ter um componente para o comando base, operação e recurso, e vários componentes para parâmetros. Você simplesmente 'preenche' esses componentes da esquerda para a direita, de acordo com o esquema apresentado acima.
A lista detalhada atual está em . Lá você também pode encontrar.
Por exemplo, o alias kgpooyamlall é equivalente ao comando kubectl get pods -o yaml --all-namespaces.
A ordem relativa das opções não importa: o comando kgpooyamlall é equivalente ao comando kgpoalloyaml.
Você não precisa usar todos os componentes como aliases. Por exemplo, k, kg, klo, ksys, kgpo também podem ser usados. Além disso, na linha de comando, você pode combinar aliases e comandos ou opções normais:
Por exemplo:
- Em vez de
kubectl proxyvocê pode escreverk proxy. - Em vez de
kubectl get rolesvocê pode escreverkg roles(atualmente não existe um alias para o recurso Roles). - Para obter dados de um pod específico, você pode usar o comando
kgpo my-pod — kubectl get pod my-pod.
Observe que alguns aliases exigem um argumento na linha de comando. Por exemplo, o alias kgpol significa kubectl get pods -l. Opção --selector exige um argumento - uma especificação de etiqueta. Se você usar um alias, ele deve parecer como kgpol app=ui.
Devido a parte dos aliases exigir argumentos, os aliases a, f e l devem ser usados por último.
No geral, assim que você dominar esse esquema, poderá intuitivamente derivar aliases dos comandos que deseja executar, economizando muito tempo na digitação.
Instalação
Para instalar o kubectl-aliases, você precisa baixar o arquivo do GitHub e incluí-lo no arquivo ~/.bashrc ou ~/.zshrc:
source ~/.kubectl_aliasesAutocompletar
Como já mencionamos, você frequentemente adiciona palavras adicionais ao alias na linha de comando. Por exemplo:
$ kgpooyaml test-pod-d4b77b989Se você usa a autocompletação do comando kubectl, provavelmente utilizou a autocompletação para coisas como nomes de recursos. Mas é possível fazer isso quando se usam aliases?
Essa é uma questão muito importante, pois, se a autocompletação não funcionar, você perderá parte das vantagens dos aliases.
A resposta depende do shell que você está usando:
- Para Zsh, a autocompletação para aliases funciona ‘pronto para uso’.
- Para Bash, infelizmente, são necessárias algumas etapas para fazer a autocompletação funcionar.
Habilitando a autocompletação para aliases no Bash
O problema com o Bash é que ele tenta completar (toda vez que você pressiona Tab) o alias, não o comando ao qual o alias se refere (como o Zsh faz). Como você não tem scripts de autocompletação para todos os 800 aliases, a autocompletação não funciona.
Projeto oferece uma solução geral para esse problema. Ele se conecta ao mecanismo de autocompletação para aliases, completa o alias para o comando e retorna opções de autocompletação para o comando complementado. Isso significa que a autocompletação para o alias se comporta exatamente como para um comando completo.
A seguir, explicarei primeiro como instalar o complete-alias e depois como configurá-lo para habilitar a autocompletação para todos os aliases do kubectl.
Instalando o complete-alias
Antes de tudo, o complete-alias depende de . Portanto, antes de instalar o complete-alias, você deve garantir que o bash-completion esteja instalado. As instruções de instalação foram dadas anteriormente para Linux e MacOS.
Nota importante para usuários de MacOS: assim como o script de autocompletação do kubectl, o complete-alias não funciona com o Bash 3.2, que é o padrão usado no MacOS. Em particular, o complete-alias depende do bash-completion v2 (brew install bash-completion@2), que requer pelo menos o Bash 4.1. Isso significa que para usar complete-alias no MacOS, você precisa instalar uma versão mais recente do Bash.
Você precisa baixar o script do e incluí-lo no seu arquivo ~/.bashrc:
source ~/bash_completion.shApós reiniciar o shell, o complete-alias estará completamente instalado.
Ativando o autocompletar para aliases kubectl
Tecnicamente, o complete-alias fornece uma função de shell _complete_alias. Essa função verifica o alias e retorna sugestões de complementação para o comando do alias.
Para vincular a função a um alias específico, você deve usar o mecanismo embutido do Bash , para definir _complete_alias como uma função de complemento do alias.
Por exemplo, vamos considerar o alias k, que representa o comando kubectl. Para definir _complete_alias como função de complemento para esse alias, você deve executar o seguinte comando:
$ complete -F _complete_alias k O resultado disso é que sempre que você usar a autocompletação para o alias k, a função _complete_alias, que verifica o alias e retorna sugestões de complementação para o comando será chamada. kubectl.
Como segundo exemplo, vamos considerar o alias kg, que representa kubectl get:
$ complete -F _complete_alias kg Da mesma forma que no exemplo anterior, ao autocompletar kg, você recebe as mesmas sugestões de complementação que receberia para kubectl get.
Observe que você pode usar o complete-alias para qualquer alias no seu sistema.
Portanto, para ativar a autocompletação para todos os aliases kubectl, você precisa executar o comando mencionado acima para cada um deles. O fragmento a seguir faz exatamente isso, assumindo que você instalou kubectl-aliases em ~/ .kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//g' ~/ .kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Esse código deve ser colocado no seu ~/.bashrc, reinicie o shell e a autocompletação estará disponível para todos os 800 aliases kubectl.
6. Expandindo kubectl com plugins
Começando com , kubectl suporta , que permite expandir suas funções com comandos adicionais.
Se você está familiarizado com , os plugins do kubectl são construídos de maneira semelhante.
Nesta seção, vamos mostrar como instalar plugins, onde encontrá-los e como criar seus próprios plugins.
Instalação de plugins
Os plugins kubectl são distribuídos como arquivos executáveis simples com nomes do tipo kubectl-x. O prefixo kubectl- é obrigatório, seguido por um novo subcomando kubectl que permite chamar o plugin.
Por exemplo, o plugin hello será distribuído como um arquivo com o nome kubectl-hello.
Para instalar o plugin, você deve copiar o arquivo kubectl-x para qualquer diretório na sua variável PATH e torná-lo executável, por exemplo, usando chmod +x. Imediatamente após isso, você pode chamar o plugin usando kubectl x.
Você pode usar o seguinte comando para listar todos os plugins que estão atualmente instalados no seu sistema:
$ kubectl plugin listEste comando também exibe avisos, se você tiver vários plugins com os mesmos nomes, ou se houver um arquivo de plugin que não seja executável.
Busca e instalação de plugins usando Krew
Os plugins Kubectl são adequados para compartilhamento ou reutilização, semelhantes a pacotes de software. Mas onde você pode encontrar plugins que foram compartilhados por outros?
visa fornecer uma solução unificada para compartilhar, buscar, instalar e gerenciar plugins kubectl. O projeto se descreve como um "gerenciador de pacotes para plugins kubectl" (Krew é semelhante ao ).
Krew é uma lista de plugins kubectl que você pode escolher e instalar. Além disso, Krew também é um plugin para kubectl.
Isso significa que a instalação do Krew funciona, na essência, como a instalação de qualquer outro plugin kubectl. Você pode encontrar instruções detalhadas na .
Os comandos Krew mais importantes:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Tenha em mente que a instalação de plugins usando Krew não interfere na instalação de plugins pelo método padrão descrito acima.
Observe que o comando kubectl krew list exibe apenas os plugins que foram instalados através do Krew, enquanto o comando kubectl plugin list lista todos os plugins, ou seja, aqueles instalados com o Krew e aqueles instalados de outras formas.
Busca de plugins em outros lugares
Krew é um projeto jovem, atualmente na sua há cerca de 30 plugins. Se você não conseguir encontrar o que precisa, pode encontrar plugins em outro lugar, por exemplo, no GitHub.
Recomendo verificar a seção do GitHub . Lá você encontrará várias dezenas de plugins disponíveis que vale a pena conferir.
Escrita de seus próprios plugins
Você pode criar — não é difícil. Você só precisa criar um arquivo executável que faça o que precisa, nomeá-lo como kubectl-x e instalá-lo, conforme descrito acima.
O arquivo pode ser um script bash, um script python ou um aplicativo go compilado — não importa. A única condição é que ele deve ser executável diretamente no sistema operacional.
Vamos criar um exemplo de plugin agora mesmo. No seção anterior, você usou o comando kubectl para listar os contêineres de cada pod. É fácil transformar esse comando em um plugin que você pode chamar, por exemplo, usando kubectl img.
Crie um arquivo kubectl-img users.module.ts
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Agora torne o arquivo executável com chmod +x kubectl-img e mova-o para qualquer diretório no seu PATH. Logo após, você pode usar o plugin kubectl img.
Como mencionado, os plugins kubectl podem ser escritos em qualquer linguagem de programação ou script. Se você usar scripts de shell, há a vantagem de poder chamar facilmente o kubectl a partir do plugin. No entanto, você pode escrever plugins mais complexos em linguagens de programação reais, usando . Se você estiver usando Go, também pode usar , que existe especialmente para escrever plugins kubectl.
Como compartilhar seus plugins
Se você achar que seus plugins podem ser úteis para outros, sinta-se à vontade para compartilhá-los no GitHub. Certifique-se de adicioná-los ao tópico .
Você também pode solicitar a adição do seu plugin à . As instruções sobre como fazer isso estão em .
Autocompletar comandos
Atualmente, os plugins não suportam autocompletar. Ou seja, você deve digitar o nome completo do plugin e os nomes completos dos argumentos.
No repositório GitHub do kubectl, há . Portanto, é possível que essa função seja implementada em algum momento no futuro.
Boa sorte!!!
O que mais ler sobre o assunto:
- .
- .
- .
Fonte: habr.com







