Organizando e tornando o kubeconfig interativo!

Aprenda a organizar seu kubeconfig!

Qual a melhor forma de organizar múltiplos clientes e projetos para administrar seus clusters?

Sabemos que o kubectl precisa de um kubeconfig para funcionar, podemos apontar diretamente e executar algo

$ kubectl --kubeconfig=arquivo_de_config get nodes

Podemos usar também a variável kubeconfig

$ export KUBECONFIG=/caminho/para/arquivo/config
$ kubect get nodes

E como eu faço para dar conta de gerenciar dezenas de projetos e clientes?

Eu uso o kubectx + kubens + fzf + kubectl-import, falaremos disso a frente :)

Primeira coisa que você tem que pensar é que um único arquivo de kubeconfig é suficiente para todos os seus projetos, inclusive o arquivo foi pensado para ter diferentes contextos.

Primeiro vamos entender como funciona esse arquivo e seus contextos.

Entendendo contextos

Veja um exemplo simples de arquivo de configuração do kubectl com diferentes contextos

apiVersion: v1
kind: Config
preferences: {}

clusters:
- cluster:
  name: prd
- cluster:
  name: dev
- cluster:
  name: tst
- cluster:

  
users:
- name: engineers
- name: developers
- name: testers

contexts:
- context:
  name: production-cluster
    user: name
    cluster: prd
- context:
  name: dev-cluster
    user: name
    cluster: dev
- context:
  name: test-cluster
    user: name
    cluster: tst

Agora vamos aprender a criar esse arquivo passo a passo.

Adicionando clusters

Adicionando cluster prd com certificado CA

 $ kubectl config --kubeconfig=config set-cluster projeto-prd --server=https://192.168.222.80 --certificate-authority=prd-cert-file

Adicionando cluster dev com certificado CA

 $ kubectl config --kubeconfig=config set-cluster projeto-dev --server=https://172.16.31.20 --certificate-authority=dev-cert-file

Adicionando cluster tst e ignorando o certificado

 $ kubectl config --kubeconfig=config set-cluster projeto-tst --server=https://10.200.3.90 --certificate-authority=tst-ca-file

Adicionando usuários

Adicionando usuário para engenheiros com certificado

$ kubectl config --kubeconfig=config set-credentials engineers --client-certificate=eng-cert-file --client-key=eng-key-file

Adicionando usuário para desenvolvedores com certificado

$ kubectl config --kubeconfig=config set-credentials developers --client-certificate=dev-cert-file --client-key=dev-key-file

Adicionando usuário para testadores com user/senha

$ kubectl config --kubeconfig=config set-credentials testers --username=admin --password=password

Adicionando contextos

Adicionando contexto para cluster de produção com usuário engineers

$ kubectl config --kubeconfig=config set-context cluster-projeto-prd --cluster=projeto-prd --user=engineers

Adicionando contexto para cluster de desenvolvimento com usuário developer

$ kubectl config --kubeconfig=config set-context cluster-projeto-dev --cluster=projeto-dev --user=developers

Adicionando contexto para cluster de teste com usuário testers

$ kubectl config --kubeconfig=config set-context cluster-projeto-tst --cluster=projeto-tst --user=testers

Verificando arquivo

Leia o arquivo

$ cat config

Agora você provavelmente tem um arquivo como esse, acredito que a única diferença para o seu é que eu coloquei o kind e preferences no topo.

apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
    certificate-authority: dev-cert-file
    server: https://172.16.31.20
  name: projeto-dev
- cluster:
    certificate-authority: prd-cert-file
    server: https://192.168.222.80
  name: projeto-prd
- cluster:
    certificate-authority: tst-ca-file
    server: https://10.200.3.90
  name: projeto-tst
contexts:
- context:
    cluster: projeto-dev
    user: developers
  name: cluster-projeto-dev
- context:
    cluster: projeto-prd
    user: engineers
  name: cluster-projeto-prd
- context:
    cluster: projeto-tst
    user: testers
  name: cluster-projeto-tst
current-context: ""
users:
- name: developers
  user:
    client-certificate: dev-cert-file
    client-key: dev-key-file
- name: engineers
  user:
    client-certificate: eng-cert-file
    client-key: eng-key-file
- name: testers
  user:
    password: password
    username: admin

Agora que os contextos foram configurados, podemos mudar de contexto assim.

$ kubectl config --kubeconfig=config use-context cluster-projeto-prd

E a partir daí qualquer comando do kubectl será realizado no cluster configurado nesse contexto.

$ kubeclt --kubeconfig=config get nodes

Exemplo de saída

k8s-prd-ctl-01      Ready    controlplane,etcd   6d1h   v1.21.7
k8s-prd-ctl-02      Ready    controlplane,etcd   6d1h   v1.21.7
k8s-prd-ctl-03      Ready    controlplane,etcd   6d1h   v1.21.7
k8s-prd-ctl-04      Ready    controlplane,etcd   6d1h   v1.21.7
k8s-prd-ctl-05      Ready    controlplane,etcd   6d1h   v1.21.7
k8s-prd-worker-01   Ready    worker              6d1h   v1.21.7
k8s-prd-worker-02   Ready    worker              6d1h   v1.21.7
k8s-prd-worker-03   Ready    worker              6d1h   v1.21.7
k8s-prd-worker-04   Ready    worker              6d1h   v1.21.7

Verificando a configuração do kubectl

Com o comando abaixo você verá a configuração completa

$ kubectl config --kubeconfig=config view

Verificando apenas do contexto que está configurado

É preciso usar o parâmetro minify para limitar ao contexto escolhido

$ kubectl config --kubeconfig=config view --minify

Saída

apiVersion: v1
clusters:
- cluster:
    certificate-authority: prd-cert-file
    server: https://192.168.222.80
  name: projeto-prd
contexts:
- context:
    cluster: projeto-prd
    user: engineers
  name: cluster-projeto-prd
current-context: cluster-projeto-prd
kind: Config
preferences: {}
users:
- name: engineers
  user:
    client-certificate: eng-cert-file
    client-key: eng-key-file

Observe a linha

current-context: cluster-projeto-prd

Sempre que alteramos de contexto essa linha será modificado no seu arquivo de configuração.

Existe algo mais prático para visualizar e trocar de contextos?

Sim, existe o projeto kubectx

  • https://github.com/ahmetb/kubectx

Instalando via brew

$ brew install kubectx

Rodando

$ kubectx

Ele vai te mostrar os contextos disponíveis

cluster-projeto-prd
cluster-projeto-dev
cluster-projeto-tst

Para escolher o contexto basta digitar

$ kubectx cluster-projeto-prd

E pronto!

Existe algo ainda mais fácil?

Sim, você pode utilizar o projeto fzf

  • https://github.com/junegunn/fzf

Instalando via brew

$ brew install fzf

Com ele o kubectx fica interativo, abre um menu e você seleciona o contexto.

$ kubectx

Saída

Consigo importar um kubeconfig?

Eu sei que ficar editando isso na mão dá um certo trabalho, mas tem solução. Recentemente eu encontrei o projeto kubectl-import para resolver essa questão.

  • https://github.com/bitnami-labs/kubectl-import

Instalando o projeto

 $ sudo curl -o kubectl-import https://raw.githubusercontent.com/bitnami-labs/kubectl-import/master/kubectl-import && chmod 0755 kubectl-import

Com ele você consegue pegar um kubeconfig e importar

 $ export KUBECONFIG=/caminho/pro/seu/kubeconfig
 $ ./kubectl-import kubeconfig-novo

E pronto, o novo cluster/contexto vai aparecer no seu kubectx. Recomendo editar o arquivo antes de importar, setando corretamente os nomes do cluster, user e contexto.

Tem algo parecido como kubectx só que para namespaces?

Tem sim, o projeto kubectx traz junto o kubens, aplicativo similar que serve para trocar de namespaces rapidamente de forma interativa, basta digitar

$ kubens

E escolher o namespace.

Amarrando as pontas

Espero que tenha aprendido a usar contextos do kubeconf, usar o kubectx, fzf, kubectl-import e agilizar a administração de seus clusters.

Esse post é o que eu chamo de DROPS, entenda o modelo aqui.

[s]
Guto

---

Se gostou manda um alo no twitter @gutocarvalho.