Pular para o conteúdo principal
BlogRecipientes (Kubernetes, Docker)5 Truques da concha Kubernetes

5 Truques da concha Kubernetes

5ShellTricks_BlogImages_Blog_1920x1008

Oi! Andrew aqui - desenvolvedor na Linode. No processo de construção de uma solução Kubernetes administrada, descobri e criei vários truques que utilizo para facilitar as tarefas diárias com a Kubernetes. Eu queria compartilhar estes cinco aqui com vocês e espero que vocês os achem tão úteis quanto eu os achei.

1. O truque da Meta-Shell

Vi este truque pela primeira vez na palestra da Olive Power sobre a preparação da CKA na KubeCon Europe deste ano.

kubectl <command> --help | grep kubectl

Cada comando kubectl contém uma série de exemplos em sua saída de ajuda, e esta é uma maneira rápida de vê-los todos de uma só vez. Estes exemplos podem lhe dar idéias sobre como combinar parâmetros e bandeiras de maneiras úteis que podem não ser óbvias apenas pela leitura da documentação.

Atualmente, o comando de execução kubectl é o que apresenta o maior número de exemplos: 18. Entretanto, o comando que eu uso com mais freqüência é o kubectl get. Vamos dar uma olhada em um de seus exemplos:

kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image

Este comando transforma o kubectl get output, dando a você apenas a versão de container implantada para esta cápsula. Com algumas pequenas mudanças, você pode fazer com que a saída seja muito mais útil. Note que está solicitando o nome e a imagem para apenas o primeiro recipiente (containers[0]). Usando a sintaxe JSONPath suportada pela kubectl, você pode listar todas as versões de todos os containers em todos os pods.

kubectl get pod -o custom-columns=CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image -A

Este truque pode poupar você de mexer nos recursos de cada cápsula individual para encontrar uma imagem canária ou um enviesado de versão em seu conjunto. Com um pseudônimo de kgi (e o seletor de espaço de nomes -A removido), você pode usar a versão do kube-apiserver rodando em seu aglomerado. Veja abaixo:

$ kgi -n kube-system -l component=component=kube-apiserver
CONTAINER        IMAGE
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5

O seguinte comando imprimirá uma lista atualizada de todos os exemplos incorporados. Escolha um com algumas bandeiras que você nunca viu antes e experimente!

for c in $(kubectl --help | egrep "^\s+([a-z-]+)" -o); do echo -e "$(kubectl $c --help | egrep '^\s+kubectl')"; done

2. Obter o uso da memória por espaço de nomes

Alguns de nós sabemos que awk é muito mais do que awk { imprimir $1 }. Recentemente, eu aprofundei e aprendi o básico desta linguagem incrivelmente poderosa que nos chegou de alguns dos titãs da história do Unix. Aqui está um exemplo de um programa awk muito útil, que ainda é curto o suficiente para ser apelidado de "one-liner". Ele soma e imprime o número de MiB de memória usado por todas as cápsulas em cada namespace, e usa o awk's printf para uma saída limpa, mesmo quando seu cluster contém nomes longos de namespace. Considere o uso do awk quando precisar de uma visão agregada da saída kubectl.

kubectl top pod -A --no-headers=true | awk '{a[$1] += $4} END {for (c in a) printf "%-35s %s\n", c, a[c]}'

3. Ver os segredos em texto simples

Quando você está desenvolvendo um aplicativo que depende de segredos, pode ser uma tarefa difícil encontrar uma maneira de canalizar a saída do kubectl para a base64. Talvez você tenha escrito uma tubulação de concha ou um pequeno script para descodificá-los. Vi algumas opções diferentes com vários inconvenientes: não suportar a saída de várias linhas, adicionar ou deixar cair novas linhas pelo caminho, ou perder o contexto dos nomes dos campos. Com o plugin de decodificação secreto de Ashley Schuett para o kubectl, você pode ver os segredos de uma forma legível dentro do kubectl obter saída e evitar todas estas questões.

A documentação do projeto recomenda usar curl para pegar o binário do GitHub e adicioná-lo ao nosso caminho. Como isto toca uma variedade de dados sensíveis, eu o encorajaria a compilá-lo a partir da fonte, e revisar a fonte primeiro. Por sorte, este plugin consiste em um único arquivo de fonte bem formatado:

git clone git@github.com:ashleyschuett/kubernetes-secret-decode.git
cd kubernetes-secret-decode
GO111MODULE=off go build -o $GOPATH/bin/kubectl-ksd

O nome do binário incorporado no último passo deve começar com kubectl- para que seja reconhecido como um plugin. Certifique-se de que $GOPATH/bin está em seu $PATH, e então você pode usá-lo assim:

kubectl ksd get secret -n <namespace-name> <secret-name> -o yaml

4. Registros Recentes e Anteriores

Se você tem um serviço que pode chegar a semanas ou meses de atividade, os logs de contêineres podem crescer a um tamanho que faz com que os comandos típicos dos logs kubectl produzam uma quantidade ridícula de produção. Você pode se sentir como se estivesse testando os limites da capacidade de seu terminal de pintar texto, ou espantado com a quantidade de tráfego de rede incorrida pelo que supostamente é legível por humanos. Nestes casos, há várias maneiras de reduzir a saída e chegar às mensagens que você deseja ver.

A primeira é a --tail=N bandeira, que começa a imprimir as mais recentes linhas N do arquivo.

kubectl logs --tail=10 -f -n kube-system -l component=kube-apiserver

Há também --since=time que aceita intervalos de tempo tais como 30s, 1h ou 5m para se referir a um número de segundos, horas ou minutos, respectivamente.

kubectl logs --since=5m -f -n kube-system -l component=kube-apiserver

Outra bandeira de tronco na qual eu vim a confiar é -p. Isto imprime os toros da corrida anterior do container; os toros de um container que saiu. Isto teria tornado meus primeiros dias com Kubernetes muito mais fáceis, pois tentei reiniciar as cápsulas e "pegar" seus logs, com alguma ação rápida do mouse e do teclado, antes que eles caíssem novamente.

kubectl logs -p -n kube-system -l component=etcd

5. Economize tempo enquanto você espera

Sempre que você é tentado a escrever um laço com um comando de sono, geralmente há uma maneira melhor de fazê-lo. Não importa o intervalo que você escolher, é provável que você perca um ou mais segundos. Isto pode se somar se for um processo automatizado. É para isso que serve o comando de espera kubectl e seu pacote de apimachinery associado. Este comando permite que você pause seus scripts durante o tempo específico necessário para que a condição seja atendida em seu cluster. Você também pode usá-lo para colocar buzinas de ar em Slack no momento em que um novo lançamento atinge o cluster. Divirta-se com ele.

Aqui estão alguns exemplos:

kubectl wait --for=condition=Available deployment/metrics-server
kubectl wait --for=condition=Initialized pod/csi-linode-controller-0

As condições disponíveis variam de acordo com o tipo de recurso e podem ser descobertas usando a descrição da kubectl sob as "Condições:". Um determinado recurso pode ter muitas condições diferentes ao mesmo tempo.

Truques de bônus!

Às vezes você olha para a produção e deseja que alguma rede adicional ou outra informação seja exibida, certo? Para ajudar, acrescente -owide ao comando. Isto funciona para quase todos os tipos de recursos, e as colunas exibidas podem ser personalizadas para Definições de Recursos Personalizados (CRDs). Exemplos:

kubectl get pods -A -owide
kubectl get services -A -owide

Por último, mas não menos importante, se você não notou até agora, -A foi adicionado como um pseudônimo para a bandeira --all-namespaces. Acho que só essa característica salvou o mundo de milhões de toques de tecla desde que foi introduzida. Outro grande salvador de tempo é acrescentar alias k=kubectl a sua concha rc.

Este post tocou principalmente nas características embutidas do kubectl. Para maior profundidade ainda, existe o livro kubectl de código aberto, legível online. Ele se concentra no uso do Kustomize, uma ferramenta integrada que permite organizar e compor seus recursos Kubernetes. Recomendo-o altamente, especialmente se você tem procurado estruturas de projeto Kubernetes com uma área de superfície minimamente vulnerável. Para uma coleção de outros comandos úteis, verifique Krew, o gerente oficial de pacotes para plugins kubectl.

Comentários (2)

  1. Author Photo

    Great post Andrew, this is actually cool.

    #2, getting memory usage based on namespace is a nice hack, on #3, i’d prefer to use rancher to get most of these information.

    What do you think, have you tried rancher before?

  2. Andrew Sauber

    Thanks : )

    I have used Rancher before, in fact Linode has an official Rancher integration which you can read about here: https://www.linode.com/docs/kubernetes/how-to-deploy-kubernetes-on-linode-with-rancher-2-x/

    I do like Rancher for managing access to a cluster, the fact that each user gets a ServiceAccount token proxied through the Rancher deployment is very cool.

    For viewing secrets, I still use the technique in #3.

Deixe uma resposta

Seu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados com *