Olá! Andrew here-developer em Linode. No processo de construção de uma solução Kubernetes gerida, descobri e criei vários truques que utilizo para tornar as tarefas diárias com Kubernetes mais fáceis. Queria partilhar estes cinco aqui convosco e espero que os achem tão úteis como eu os achei.
1. O truque do Meta-Shell
Eu 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 na sua saída de ajuda, e esta é uma forma rápida de os ver a todos de uma só vez. Estes exemplos podem dar ideias sobre como combinar parâmetros e bandeiras de formas úteis que podem não ser óbvias apenas pela leitura da documentação.
Atualmente, o comando de execução kubectl é o que dá o maior número de exemplos: 18. No entanto, o comando que eu uso com mais frequência é o kubectl get. Vamos dar uma olhada num dos 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 apenas a versão de contentor implantada para esta cápsula. Com algumas pequenas alterações, você pode tornar o resultado muito mais útil. Note que está solicitando o nome e a imagem apenas para o primeiro recipiente (containers[0]). Usando a sintaxe JSONPath suportada pelo kubectl, é possível listar todas as versões de todos os contentores em todas as cápsulas.
kubectl get pod -o custom-columns=CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image -A
Este truque pode salvá-lo de mexer em recursos de cápsulas individuais para encontrar uma imagem canária ou um enviesado de versão no seu cluster. Com um pseudónimo de kgi (e o namespace selector -A removido), pode usar a versão do kube-apiserver a correr no seu cluster. 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 irá imprimir uma lista atualizada de todos os exemplos incorporados. Escolha uma 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, 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 é suficientemente curto para ser apelidado de "one-liner". Ele soma e imprime o número de MiB de memória utilizado por todas as cápsulas em cada namespace, e utiliza o awk's printf para uma saída limpa, mesmo quando o seu cluster contém nomes longos de namespace. Considere usar awk quando precisar de uma visão agregada da produção do 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 se está a desenvolver uma aplicação que depende de segredos, pode ser uma tarefa difícil encontrar uma forma de canalizar a saída do kubectl para a base64. Talvez tenhas escrito um oleoduto ou um pequeno guião para os descodificar. Vi algumas opções diferentes com vários inconvenientes: não suportar saída multi-linhas, adicionar ou deixar cair novas linhas pelo caminho, ou perder o contexto dos nomes dos campos. Com o plugin de descodificação secreto de Ashley Schuett para o kubectl, pode ver os segredos de uma forma legível dentro do kubectl obter saída e evitar todos estes problemas.
A documentação do projeto recomenda o uso do curl para agarrar o binário do GitHub e adicioná-lo ao nosso caminho. Uma vez que isto toca numa variedade de dados sensíveis, encorajo-o a compilá-los a partir da fonte, e a rever a fonte primeiro. Felizmente, este plugin consiste em um único arquivo 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á no 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 tiver um serviço que pode atingir semanas ou meses de atividade, os registos dos contentores podem crescer até um tamanho que faz com que os comandos típicos dos registos kubectl produzam uma quantidade ridícula de produção. Você pode se sentir como se estivesse testando os limites da capacidade do seu terminal para pintar texto, ou encantado com a quantidade de tráfego de rede incorrida pelo que é suposto ser legível por humanos. Nestes casos, há várias maneiras de reduzir a saída e chegar às mensagens que você quer ver.
A primeira é a --tail=N
bandeira, que começa a imprimir as linhas N mais recentes do ficheiro.
kubectl logs --tail=10 -f -n kube-system -l component=kube-apiserver
Existe 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 registo em que eu vim a confiar é -p. Isto imprime os toros da corrida anterior do recipiente; os toros de um recipiente que tenha saído. Isto teria tornado os meus primeiros dias com Kubernetes muito mais fáceis, pois tentei reiniciar as cápsulas e "apanhar" os seus logs, com alguma ação rápida do rato e do teclado, antes que eles voltassem a cair.
kubectl logs -p -n kube-system -l component=etcd
5. Poupe tempo enquanto espera
Sempre que você sente vontade de escrever um loop com um comando de sono, geralmente há uma maneira melhor de executar. Não importa o intervalo escolhido, é provável que você perca um ou mais segundos. Isto pode ser somado se for um processo automatizado. É para aqui que serve o comando de espera kubectl e o 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 usar para colocar chifres de ar em Slack no momento em que um novo lançamento atinge o aglomerado. Divirta- se com isso.
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 kubectl em "Condições:". Um determinado recurso pode ter muitas condições diferentes ao mesmo tempo.
Truques de Bónus!
Às vezes você olha para a saída 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ê ainda não notou, -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 teclas desde que foi introduzida. Outro grande salvador de tempo é adicionar alias k=kubectl
à tua shell rc.
Este post tocou principalmente nos recursos embutidos do kubectl. Para uma profundidade ainda maior, existe o livro de código aberto kubectl, legível online. O seu foco é a utilização do Kustomize, uma ferramenta integrada que lhe permite organizar e compor os seus recursos Kubernetes. Recomendo-o vivamente, especialmente se tem estado à procura de estruturas de projecto Kubernetes com uma área de superfície minimamente vulnerável. Para uma coleção de outros comandos úteis, veja Krew, o gestor oficial de pacotes para os plugins kubectl.
Comentários (2)
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?
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.