As 10 principais dicas e truques do Kubernetes



Há muita literatura de referência na Internet, mas às vezes as dicas mais simples se tornam as mais valiosas. A equipe do Mail.ru Kubernetes aaS traduziu uma seleção de dez truques e dicas que o autor do artigo coletou após um ano trabalhando com o Kubernetes. As dicas não são classificadas por importância, mas achamos que todos encontrarão algo útil para si mesmos.

A equipe mais fácil de trabalhar com o Kubernetes


Para começar, talvez a ação mais simples e mais útil ao trabalhar com o Kubernetes. O comando a seguir permite o preenchimento automático de comandos kubectlno shell bash:

echo "source <(kubectl completion bash)" >> ~/.bashrc

O preenchimento automático kubectlserá gravado no arquivo .bashrc e será ativado automaticamente sempre que o shell for iniciado. Isso acelera um conjunto de comandos e parâmetros longos, como all-namespaces. Consulte a ajuda do bash do Kubernetes para obter detalhes .

Restrições padrão na memória e CPU no espaço para nome


Se o aplicativo não for gravado corretamente, por exemplo, a cada segundo abre uma nova conexão com o banco de dados, mas nunca a fecha, ocorre um vazamento de memória no cluster. E se não houver limite de memória para o aplicativo durante a implantação, isso poderá causar uma falha no nó.

Para evitar isso, o Kubernetes permite definir restrições padrão para cada espaço para nome. Eles são gravados no arquivo yaml para um espaço de nome específico. Aqui está um exemplo desse arquivo:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

Crie esse yaml e aplique a qualquer espaço de nome. Por exemplo, para um espaço para nome limit-example. Agora, para qualquer contêiner implantado nesse espaço para nome, o limite de 512Mi será aplicado, a menos que outro limite individual seja definido adicionalmente para esse contêiner.

Coleta de lixo em versões mais antigas do Kubernetes


Por padrão, o Kubelet inicia a coleta de lixo quando var / lib / docker ocupa 90% do espaço em disco disponível. Isso é bom, no entanto, antes do Kubernetes 1.7, não havia limite padrão para o número de inodes usados ​​(inodes), o que corresponde ao número de arquivos no sistema de arquivos.

Potencialmente, seu contêiner var / lib / docker pode usar apenas 50% do espaço em disco, mas os inodes podem acabar, o que causará problemas aos trabalhadores.

Nas versões mais antigas do kubelet de 1.4 a 1.6, você precisará adicionar o seguinte sinalizador:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

Nas versões 1.7 e mais recentes, esse sinalizador é definido por padrão. No entanto, as versões anteriores não seguem o limite de inodes.

Minikube ... um Kubernetes local pequeno, mas poderoso


O Minikube é a maneira mais fácil de iniciar um cluster local do Kubernetes. Começa com um comando simples:

minikube start

Como resultado deste comando, um cluster Kubernetes real está sendo executado no seu computador.


Fonte da ilustração O

truque é como criar o aplicativo e executá-lo localmente neste cluster. A menos que seja instruído especificamente, a imagem do Docker será criada no seu computador, não no cluster.

Para forçar o Docker a enviar a imagem para o cluster local do Kubernetes, a máquina docker recebe o seguinte comando:

eval $(minikube docker-env)

Agora podemos criar aplicativos no cluster local do Kubernetes.

Não dê acesso ao kubectl a todos


Isso parece óbvio, mas se várias equipes usarem o mesmo cluster para seus aplicativos (para o qual o Kubernetes foi criado), você não deve apenas dar a todos kubectl. É melhor separar as equipes, dando a cada um deles seu próprio espaço para nome e delimitando o acesso pelas políticas do RBAC.

Você pode se confundir registrando para cada pod os direitos de acesso, leitura, criação, exclusão e outras operações. Mas o principal é restringir o acesso aos segredos, permitindo apenas aos administradores. Portanto, distinguimos entre aqueles que podem administrar o cluster e aqueles que podem simplesmente implantar nele.

Gerenciar orçamentos de lareira


Como garantir nenhum tempo de inatividade para um aplicativo em um cluster Kubernetes? PodDisruptionBudget e novamente PodDisruptionBudget.

Os clusters são atualizados periodicamente e os nós são esvaziados. Nada fica parado, essa é a realidade. Em toda implantação com mais de uma instância, você definitivamente deve incluir um PDB (PodDisruptionBudget). Ele é criado em um arquivo yaml simples que se aplica ao cluster. A área de cobertura de um determinado PDB é determinada por seletores de etiquetas.

Nota: O orçamento do APO é levado em consideração apenas em caso de interrupção voluntária . Em situações como falhas de hardware, o PDB não funcionará.

Exemplo de PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

Dois parâmetros principais são matchLabelse minAvailable. O primeiro parâmetro indica quais aplicativos têm um orçamento. Por exemplo, se eu tiver implantações com app: app-ae tags app: app-b, esse PDB será aplicado apenas ao primeiro.

O parâmetro é minAvailablelevado em consideração ao esvaziar (limpar) a unidade. Por exemplo, em nosso exemplo, todas as exceções, app: app-aexceto duas, são suplantadas durante a devastação .

Isso permite controlar quantas instâncias do aplicativo devem ser executadas a qualquer momento.

Monitoramento da integridade do aplicativo


Esse monitoramento é possível de duas maneiras: usando amostras de prontidão ou vida.

O primeiro teste de prontidão determina se o contêiner está pronto para receber tráfego.

A segunda (animação) mostra se o contêiner está funcionando ou precisa ser reiniciado.

As configurações apropriadas são simplesmente adicionadas ao yaml para implantação. Lá você pode especificar tempos limite, tempos de atraso e o número de tentativas. Veja a documentação do Kubernetes para mais detalhes .

Tags em todos os lugares


Tags são um dos conceitos fundamentais no Kubernetes. Eles permitem que os objetos se comuniquem livremente entre si, além de criar consultas com base em rótulos. No Kubernetes, você pode até acessar o cliente e assistir a eventos por tags específicas.

Com a ajuda de etiquetas, você pode fazer quase tudo, mas um bom exemplo seria criar vários ambientes para executar programas em um cluster.

Suponha que você esteja usando o mesmo cluster para deve qa. Isso significa que você pode ter um aplicativo app-asendo executado simultaneamente nos ambientes qae dev. Nesse caso, podemos acessar a instância do aplicativo em um ambiente específico separadamente, especificando o parâmetro apropriado environment. Por exemplo, app: app-ae environment: devpara um único ambiente, app: app-aeeenvironment: qapara o segundo.

Isso permite acessar as duas instâncias do aplicativo, por exemplo, para testar simultaneamente.

Coloque em ordem


O Kubernetes é um sistema muito poderoso, mas qualquer sistema pode acabar atolado em um grande número de processos. O Kubelet inicia todos os processos e verificações que você especificar, assim como os seus.

Obviamente, um serviço órfão não diminuirá a velocidade do sistema e o Kubernetes foi originalmente projetado para escalar. Mas se um milhão aparecer em vez de um serviço, o kubelet começa a engasgar.

Se, por algum motivo, você estiver excluindo a implantação (contêiner, imagem, qualquer que seja), limpe-a completamente.

Conheça ir


No final, salvamos o conselho principal. Aprenda a linguagem de programação Go.

O Kubernetes é desenvolvido no Go, todas as extensões são gravadas no Go e a biblioteca do cliente client-go também é oficialmente suportada.

Pode ser usado para coisas diferentes e interessantes. Por exemplo, para expandir o sistema Kubernetes ao seu gosto. Portanto, você pode usar seus próprios programas para coletar dados, implantar aplicativos ou simplesmente limpar contêineres.

Aprender a linguagem de programação Go e dominar o client-go é talvez a dica mais importante que você pode dar aos usuários iniciantes do Kubernetes.

Traduzido com suporte do Mail.ru Cloud Solutions


All Articles