Kubernetes é uma ferramenta OpenSource que faz a gestão de aplicações em containers através de recursos como deployments, updates, scaling e lifecycles, é mantido pela Cloud Native Computing Foundation

Eventualmente será necessário ir mais a fundo na investigação de algum problema. Para isso lançamos mão do kubectl, que é a ferramenta oficial do Kubernetes para realizar qualquer operação no cluster.  O Kubectl foi projetada para gerenciar objetos e clusters Kubernetes. Ele fornece uma interface de linha de comando para executar operações comuns, como criar e escalar Deployments, alternar contextos e acessar um shell em um container em execução.


O acesso ao cluster via kubectl está limitado à algumas máquinas, sendo assim é necessário solicitar acesso ao time de cloud TKS e SRE.

kubectl pode ser instalado em uma variedade de plataformas Linux, macOS e Windows. Encontre o seu sistema operacional preferido abaixo.

Para testar se o kubectl pode se autenticar e acessar seu cluster Kubernetes, use cluster-info:

kubectl cluster-info


Se o kubectl puder se autenticar com sucesso no seu cluster, você deverá ver a seguinte saída:

Output
Kubernetes master is running at https://kubernetes_master_endpoint
CoreDNS is running at https://coredns_endpoint

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


O kubectl é configurado usando os arquivos de configuração kubeconfig. Por padrão, o kubectl procurará um arquivo chamado config no diretório $HOME/.kube. Para mudar isso, você pode definir a variável de ambiente $KUBECONFIG apontando para um arquivo kubeconfig personalizado ou passar o arquivo personalizado em tempo de execução usando a flag --kubeconfig:

kubectl cluster-info --kubeconfig=caminho_para_seu_arquivo_kubeconfig

Nota: Se você estiver usando um cluster Kubernetes gerenciado, seu provedor de nuvem deverá ter disponibilizado seu arquivo kubeconfig.


Se você não quiser usar a flag --kubeconfig com todos os comandos, e não existe o arquivo ~/.kube/config, crie um diretório chamado ~/.kube no seu diretório home, se ele ainda não existir, e copie o arquivo kubeconfig, renomeando-o para config:

mkdir ~/.kube
cp seu_arquivo_kubeconfig ~/.kube/config

Agora, execute cluster-info novamente para testar sua conexão.

Modificando Sua Configuração do kubectl

Você também pode modificar sua configuração usando o conjunto de comandos kubectl config.

Para visualizar sua configuração do kubectl, use o subcomando view:

kubectl config view

Output:
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED


Modificando Clusters

Para buscar uma lista de clusters definidos no seu kubeconfig, use get-clusters:

kubectl config get-clusters


Para adicionar um cluster à sua configuração, use o subcomando set-cluster:

kubectl config set-cluster novo_cluster --server=endereço_do_servidor --certificate-authority=caminho_para_a_autoridade_de_certificação


Para excluir um cluster da sua configuração, use delete-cluster:

kubectl config delete-cluster

Nota: Isso exclui apenas o cluster da sua configuração e não exclui o cluster Kubernetes real.

Modificando Usuários

Você pode executar operações similares para usuários usando set-credentials:

kubectl config set-credentials username --client-certificate=/caminho/para/arquivo/certificado --client-key=/caminho/para/arquivo/chave


Para excluir um usuário da sua configuração, você pode executar unset:

kubectl config unset users.username


Contextos

Um context ou contexto no Kubernetes é um objeto que contém um conjunto de parâmetros de acesso para o seu cluster. Ele consiste em uma tripla de cluster, namespace e user. Os contextos permitem alternar rapidamente entre diferentes conjuntos de configurações de cluster.

Para ver seu contexto atual, você pode usar current-context:

kubectl config current-context


Para ver uma lista de todos os contextos configurados, execute get-contexts:

kubectl config get-contexts


Para definir um contexto, use set-context:

kubectl config set-context nome_do_contexto --cluster=nome_do_cluster --user=user_name --namespace=namespace


Você pode alternar entre contextos com use-context:

kubectl config use-context nome_do_contexto


E você pode excluir um contexto com delete-context:

kubectl config delete-context nome_do_contexto

Um Namespace no Kubernetes é uma abstração que lhe permite subdividir seu cluster em vários clusters virtuais. Usando Namespaces, você pode dividir os recursos do cluster entre várias equipes e objetos de escopo de maneira apropriada. Por exemplo, você pode ter um Namespace prod para cargas de trabalho de produção e um Namespace dev para cargas de trabalho de desenvolvimento e teste.

Para buscar e imprimir uma lista de todos os Namespaces no cluster, use get namespace:

kubectl get namespace
Output
NAME              STATUS   AGE
default           Active   2d21h
kube-node-lease   Active   2d21h
kube-public       Active   2d21h
kube-system       Active   2d21h


Para definir um Namespace para o seu contexto atual, use set-context --current:

kubectl config set-context --current --namespace=nome_do_namespace


Para criar um Namespace, use create namespace:

kubectl create namespace namespace_name

Output
namespace/namespace_name created


De maneira similar, para excluir um Namespace, use delete namespace:

kubectl delete namespace namespace_name

Output
namespace/namespace_name deleted

Atenção: A exclusão de um Namespace excluirá tudo no Namespace, incluindo a execução de Deployments, Pods e outras cargas de trabalho. Execute este comando apenas se tiver certeza de que deseja eliminar o que está sendo executado no Namespace ou se estiver excluindo um Namespace vazio.


Para buscar todos os Pods em um determinado Namespace ou para realizar outras operações nos recursos de um determinado Namespace, certifique-se de incluir a flag --namespace:

kubectl get pods --namespace=nome_do_namespace

A sintaxe geral para a maioria dos comandos de gerenciamento do kubectl é:

kubectl command type name flags

Onde

  • command é uma operação que você gostaria de executar, como create
  • type é o tipo de recurso do Kubernetes, como deployment
  • name é o nome do recurso, como app_frontend
  • flags são todas as flags opcionais que você gostaria de incluir

Por exemplo, o comando a seguir recupera informações sobre um Deployment chamado protheus-appserver:

kubectl get deployment protheus-appserver

Inspecionando Recursos no Kubernetes

O kubectl get busca um determinado recurso do Kubernetes e exibe algumas informações básicas associadas a ele:


kubectl get deployment -o wide

Como não fornecemos um nome de Deployment ou um Namespace, o kubectl busca todos os Deployments no Namespace atual. A flag -o fornece informações adicionais como CONTAINERS e IMAGES.

Além do get, você pode usar o describe para buscar uma descrição detalhada do recurso e dos recursos associados:

kubectl describe deploy protheus-appserver


O conjunto de informações apresentadas variará dependendo do tipo de recurso. Você também pode usar este comando sem especificar um nome de recurso; nesse caso, as informações serão fornecidas para todos os recursos desse tipo no Namespace atual.

Obtendo Acesso ao Shell de um Container

Para obter acesso ao shell de um container em execução, use exec. Primeiro, encontre o Pod que contém o container em execução ao qual você deseja acessar:

kubectl get pod


Vamos fazer um exec para o primeiro Pod. Como este Pod possui apenas um container, não precisamos usar a flag -c para especificar em qual container gostaríamos de fazer o exec.

kubectl exec -i -t protheus-appserver-8859878f8-7gfw9 -- /bin/bash

Agora temos acesso ao shell do container protheus-appserver. A flag -i passa o STDIN para o container e -t fornece um TTY interativo. O traço duplo -- atua como um separador para o comando kubectl e o comando que você deseja executar dentro do container. Neste caso, estamos executando o /bin/bash.

Buscando Logs

Outro comando útil é o logs, que imprime logs de Pods e containers, incluindo containers finalizados.

Para transmitir logs para a saída do seu terminal, você pode usar a flag -f:

kubectl logs -f protheus-appserver-8859878f8-7gfw9

Este comando continuará sendo executado no seu terminal até ser interrompido com um CTRL+C. Você pode omitir a flag -f se quiser imprimir a saída do log e sair imediatamente.

Você também pode usar a flag -p para buscar logs de um container terminado. Quando esta opção é usada dentro de um Pod que tinha uma instância anterior do container em execução, logs imprimirá a saída do container finalizado.

A flag -c lhe permite especificar o container do qual você deseja buscar logs, se o Pod tiver vários containers. Você pode usar a flag --all-containers=true para buscar logs de todos os containers no Pod.

Redirecionamento de Porta e Proxying

Para obter acesso de rede a um Pod, você pode usar o port-forward:

kubectl port-forward pod/protheus-appserver-8859878f8-7gfw9 8080:8080

Aqui redirecionamos a porta 8080 local (que antecede os dois pontos) para a porta 8080 do container do Pod (após os dois pontos).

Você também pode usar deploy/protheus-appserver ou svc/protheus-appserver-services como tipo e nome do recurso para o qual redirecionar. Se você fizer isso, a porta local será redirecionada para o Pod selecionado pelo Deployment ou Serviço.

Existem muitos outros comandos e variações que você pode achar úteis como parte do seu trabalho com o kubectl. Para saber mais sobre todas as suas opções disponíveis, você pode executar:

kubectl --help

Namespaces

Os namespaces são uma forma de organizar clusters em subclusters virtuais. Eles podem ser úteis quando diferentes equipes ou projetos compartilham um cluster de Kubernetes. Um cluster aceita qualquer número de namespaces, cada um logicamente separado dos outros, mas capazes de comunicar-se entre si. Os namespaces não podem ser aninhados.

Qualquer recurso no Kubernetes existe também no namespace padrão ou em um namespace criado pelo operador de cluster. Fora do namespace, há somente nós e volumes de armazenamento persistente. Esses recursos de nível inferior estão sempre visíveis para todos os namespaces do cluster.

Pods : ao encapsular um (ou mais) contêineres de aplicativos, os pods são a unidade de execução mais básica de um aplicativo Kubernetes. Cada Pod contém o código e os recursos de armazenamento necessários para execução e possui seu próprio endereço IP. Os pods também incluem opções de configuração. Normalmente, um Pod contém um único contêiner ou alguns contêineres que são acoplados a um aplicativo ou função de negócios e que compartilham um conjunto de recursos e dados.

Deployment (Deploy) : um método de implantação de pods de aplicativos em contêineres. Um estado desejado descrito em uma implantação fará com que os controladores alterem o estado real do cluster para atingir esse estado de maneira ordenada. Saiba mais sobre as implantações do Kubernetes.

ReplicaSet : garante que um número especificado de pods idênticos esteja em execução em um determinado momento.

Cluster DNS : serve os registros DNS necessários para operar os serviços do Kubernetes.

Monitoramento de Recursos do Contêiner : Captura e registra as métricas do contêiner em um banco de dados central.