Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kubernetes: detecte e resolva APIs descontinuadas automaticamente

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

By StepanMay 14, 20204 min read

Com o Kubernetes 1.16 disponível há algum tempo e começando a chegar, aos poucos, em várias plataformas Kubernetes gerenciadas, é provável que você já tenha ouvido falar das depreciações de API. Embora seja algo relativamente simples de resolver, essa mudança pode comprometer seriamente seus serviços se passar despercebida.

PerfectScale™ for Kubernetes

Ready to optimize?

Get your free Kubernetes savings analysis

Depreciação de API — o que é isso?

Conforme o conjunto de funcionalidades do Kubernetes evolui, as APIs também precisam acompanhar esse movimento. Existem regras definidas para garantir compatibilidade e estabilidade¹. Isso não acontece a cada release, mas, em algum momento, você vai precisar usar a nova versão e o novo formato da API, já que a versão antiga deixará de ser suportada.

Por que isso é importante na release 1.16?

Algumas APIs descontinuadas foram mantidas nas últimas versões do K8s e finalmente serão removidas de vez na release 1.16 do Kubernetes. São elas, com seus respectivos API Groups e versões:

  • Deployment — extensions/v1beta1, apps/v1beta1 e apps/v1beta2
  • NetworkPolicy — extensions/v1beta1
  • PodSecurityPolicy — extensions/v1beta1
  • DaemonSet — extensions/v1beta1 e apps/v1beta2
  • StatefulSet — apps/v1beta1 e apps/v1beta2
  • ReplicaSet — extensions/v1beta1, apps/v1beta1 e apps/v1beta2

Se você tentar criar um recurso usando uma dessas APIs no 1.16, a operação simplesmente vai falhar.

Como saber se sou afetado?

Dá para revisar manualmente todos os seus manifestos, mas isso pode tomar um bom tempo. É fácil deixar algo passar, e a coisa fica ainda mais complicada quando há várias equipes fazendo deploy no cluster ou quando os manifestos atuais não estão centralizados em um só lugar. É aí que entra o Kube-No-Trouble, ou kubent.

Qual é a pegadinha?

Normalmente, a informação sobre qual versão da API foi usada para criar um determinado recurso não fica acessível, já que o recurso é sempre convertido e armazenado internamente na versão de armazenamento preferencial. Mas, se você usa kubectl ou Helm para fazer deploy dos seus recursos, o manifesto original também fica armazenado dentro do cluster — e dá para tirar proveito disso².

Your cloud bill shouldn't be a mystery

Optimization, automation, expertise. In one platform.

Como acabar com as dores de cabeça das depreciações

A forma mais simples de instalar é:

sh -c "$(curl -sSL 'https://git.io/install-kubent')"

Isso instala a versão mais recente do kubent em /usr/local/bin ³.

Configure o contexto atual do kubectl para apontar para o cluster que você quer verificar e rode a ferramenta kubent:

Fig. 1: Exemplo de saída da execução do kubent

Fig. 1: Exemplo de saída da execução do kubent

O kubent se conecta ao seu cluster, busca todos os recursos potencialmente afetados, faz a varredura e mostra um resumo dos que foram identificados.

Você também pode usar a flag -f json para obter a saída em formato JSON, o que é mais útil se quiser integrar a ferramenta ao seu pipeline de CI/CD ou processar os resultados depois. Mais detalhes sobre as opções de configuração disponíveis estão no README do repositório doitintl/kube-no-trouble.

O que fazer com os recursos detectados?

Em alguns casos, basta alterar o apiVersion no manifesto. Em outros, a estrutura pode ter mudado e vai ser preciso fazer ajustes. Vale também ficar atento: muitos valores padrão mudaram entre as versões⁴, então, só trocando o apiVersion e aplicando o mesmo manifesto, o resultado pode ser bem diferente do esperado. Por exemplo, o updateStrategy.type do StatefulSet mudou de OnDelete para RollingUpdate, o que muda bastante o comportamento.

O comando kubectl convert, antes bastante usado, agora está descontinuado e pode não converter seus recursos corretamente em relação aos valores padrão mencionados acima.

Talvez a melhor abordagem seja simplesmente aplicar os recursos (que você já tem em mãos, se os detectou com o kubent) e buscar a nova versão pela API. Isso garante que o recurso seja transformado corretamente para a nova versão. Você deve ter notado que o kubectl é meio não determinístico quanto à versão que retorna. Para solicitar uma versão específica da API, use o formato completo:

kubectl get ingress.v1beta1.extensions -o yaml

Manda seu feedback!

Espero que isso ajude você a identificar e lidar com APIs descontinuadas nos seus clusters Kubernetes antes que elas virem dor de cabeça.

A ferramenta kubent ainda está em estágio inicial e eu adoraria receber comentários, sugestões e saber se ela foi útil para você. Boa navegação! ⛵⛵⛵

  • [1] O documento Deprecation Policy do Kubernetes define como diferentes partes do sistema podem ser tornadas obsoletas e removidas.
  • [2] Isso acontece na forma da anotação kubectl.kubernetes.io/last-applied-configuration no caso do kubectl, ou como um ConfigMap ou Secret no caso do Helm.
  • [3] Se, assim como eu, você não confia em scripts aleatórios postados em blogs, baixe a release mais recente para sua plataforma e descompacte onde preferir.
  • [4] Um ótimo artigo sobre o tema é o Kubernetes 1.16 API deprecations and changed defaults, do David Schweikert.

Referências adicionais: