Livro "Kubernetes para DevOps"

Livro "Kubernetes para DevOps" Olá, membros do Habr! Kubernetes é um dos elementos-chave do ecossistema de nuvem moderno. Essa tecnologia garante confiabilidade, escalabilidade e resiliência na virtualização de contêineres. John Arundel e Justin Domingus falam sobre o ecossistema Kubernetes e apresentam soluções testadas para problemas cotidianos. Passo a passo, você construirá seu próprio aplicativo voltado para a nuvem e criará a infraestrutura para suportá-lo, configurará o ambiente de desenvolvimento e um pipeline de implantação contínua que será útil para seus próximos aplicativos.

• Você começará a trabalhar com contêineres e Kubernetes do zero: não é necessário ter experiência prévia para aprender sobre o assunto. • Execute seus próprios clusters ou escolha um serviço gerenciado de Kubernetes da Amazon, Google, etc. • Utilize o Kubernetes para gerenciar o ciclo de vida do contêiner e o consumo de recursos. • Otimize clusters com base em custos, desempenho, resiliência, capacidade e escalabilidade. • Descubra as melhores ferramentas para desenvolver, testar e implantar seus aplicativos. • Aplique práticas de mercado relevantes para garantir segurança e controle. • Implemente os princípios DevOps em sua empresa para que as equipes de desenvolvimento atuem de forma mais ágil, rápida e eficiente.

Para quem é o livro

O livro é mais relevante para funcionários de departamentos de administração responsáveis por servidores, aplicativos e serviços, assim como para desenvolvedores que estão construindo novos serviços em nuvem ou migrando aplicativos existentes para Kubernetes e para a nuvem. Não se preocupe, não é necessário saber trabalhar com Kubernetes e contêineres — nós ensinaremos tudo.

Usuários experientes de Kubernetes também encontrarão muitas informações valiosas: temas como RBAC, implantação contínua, gerenciamento de dados sensíveis e observabilidade serão abordados de maneira aprofundada. Esperamos que nas páginas do livro haja algo interessante para você, independentemente de suas habilidades e experiência.

Quais perguntas o livro responde

Durante o planejamento e a redação do livro, discutimos tecnologias em nuvem e Kubernetes com centenas de pessoas, conversando tanto com líderes e especialistas da área quanto com verdadeiros iniciantes. Abaixo estão algumas perguntas cujas respostas eles gostariam de ver nesta edição.

  • «Estou interessado em saber por que devo gastar tempo com essa tecnologia. Que problemas ela pode ajudar a resolver para mim e minha equipe?»
  • «Kubernetes parece interessante, mas tem uma barreira de entrada bastante alta. Preparar um exemplo simples não é difícil, mas a administração e a depuração subsequentes são assustadoras. Gostaríamos de receber conselhos práticos sobre como as pessoas gerenciam clusters Kubernetes em condições reais e quais problemas provavelmente enfrentaremos».
  • «Seria útil um conselho subjetivo. O ecossistema Kubernetes oferece muitas opções para equipes iniciantes. Quando a mesma coisa pode ser feita de várias maneiras, como entender qual delas é a melhor? Como fazer essa escolha?»

E, provavelmente, a mais importante de todas as questões:

  • «Como usar Kubernetes sem comprometer a operação da minha empresa?»

Trecho. Configuração e objetos Secret

A capacidade de separar a lógica do aplicativo Kubernetes de sua configuração (ou seja, de quaisquer valores ou configurações que possam mudar ao longo do tempo) é muito útil. Geralmente, os valores de configuração incluem parâmetros destinados a ambientes específicos, endereços DNS de serviços de terceiros e credenciais para autenticação.

Claro, tudo isso pode ser colocado diretamente no código, mas essa abordagem não é flexível o suficiente. Por exemplo, para alterar um valor de configuração, seria necessário reconstruir e implantar seu código novamente. Uma solução muito melhor seria separar a configuração do código e lê-la a partir de um arquivo ou variáveis de ambiente.

Kubernetes oferece várias maneiras de gerenciar a configuração. Primeiro, você pode passar valores para o aplicativo por meio de variáveis de ambiente, especificadas na especificação do pod (ver a seção 'Variáveis de ambiente' na p. 192). Em segundo lugar, os dados de configuração podem ser armazenados diretamente no Kubernetes, usando objetos ConfigMap e Secret.

Neste capítulo, exploraremos esses objetos em detalhes e discutiremos algumas abordagens práticas para gerenciar configurações e dados confidenciais com base em um aplicativo de demonstração.

Atualizando os pods ao alterar a configuração

Imagine que você tem uma implantação em seu cluster e deseja alterar alguns valores em seu ConfigMap. Se você estiver usando um chart Helm (consulte a seção 'Helm: gerenciador de pacotes para Kubernetes' na p. 102), detectar a alteração de configuração e reiniciar seus pods pode ser feito automaticamente com um truque elegante. Adicione a seguinte anotação à especificação de sua implantação:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

Agora, o template de implantação contém o checksum dos parâmetros de configuração: quando os parâmetros mudam, o checksum é atualizado. Se você executar o comando helm upgrade, o Helm detectará que a especificação da implantação foi alterada e reiniciará todos os pods.

Dados confidenciais no Kubernetes

Já sabemos que o objeto ConfigMap fornece um mecanismo flexível para armazenar e acessar dados de configuração no cluster. No entanto, a maioria dos aplicativos possui informações que são secretas e confidenciais: por exemplo, senhas ou chaves de API. Elas podem ser armazenadas no ConfigMap, mas esta solução não é ideal.

Em vez disso, o Kubernetes oferece um objeto de tipo especial, destinado ao armazenamento de dados confidenciais: Secret. A seguir, veremos um exemplo de como este objeto pode ser aplicado em nosso aplicativo de demonstração.

Para começar, dê uma olhada no manifesto Kubernetes para o objeto Secret (veja hello-secret-env/k8s/secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

Neste exemplo, a chave secreta magicWord tem o valor xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). A palavra xyzzy é, de fato, muito útil no mundo da computação. Assim como no ConfigMap, muitos pares de chave-valor podem ser armazenados no objeto Secret. Aqui, para simplicidade, usamos apenas um par 'chave - valor'.

Uso de objetos Secret como variáveis de ambiente

Assim como o ConfigMap, o objeto Secret pode ser disponibilizado em um contêiner como variáveis de ambiente ou como um arquivo no disco. No próximo exemplo, atribuiremos um valor da Secret a uma variável de ambiente:

especificação:
   contêineres:
       - nome: demo
          imagem: cloudnatived/demo:hello-secret-env
          portas:
             - portaDoContêiner: 8888
          env:
             - nome: GREETING
               valueFrom:
               secretKeyRef:
                  nome: demo-secret
                  chave: magicWord

Execute o seguinte comando no repositório demo para aplicar os manifests:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configurado
segredo "demo-secret" criado

Como antes, redirecione a porta local para a implantação para ver o resultado no seu navegador:

kubectl port-forward deploy/demo 9999:8888
Redirecionando de 127.0.0.1:9999 -> 8888
Redirecionando de [::1]:9999 -> 8888

Ao abrir o endereço localhost:9999/ você deve ver o seguinte:

A palavra mágica é "xyzzy"

Gravando objetos Secret em arquivos

Neste exemplo, vamos conectar o objeto Secret ao contêiner como um arquivo. O código está na pasta hello-secret-file do repositório demo.

Para conectar o Secret como um arquivo, utilizaremos a seguinte implantação:

especificação:
   contêineres:
       - nome: demo
          imagem: cloudnatived/demo:hello-secret-file
          portas:
              - portaDoContêiner: 8888
          volumeMounts:
              - nome: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - nome: demo-secret-volume
        segredo:
           secretName: demo-secret

Assim como na seção "Criando arquivos de configuração a partir de objetos ConfigMap" na p. 240, estamos criando um volume (neste caso, demo-secret-volume) e conectando-o ao contêiner na seção de especificação volumeMounts. O campo mountPath especifica /secrets, portanto, o Kubernetes criará nesta pasta um arquivo para cada par "chave - valor" definido no objeto Secret.

No nosso exemplo, definimos apenas um par "chave - valor" chamado magicWord, portanto, o manifest criará um arquivo /secrets/magicWord no contêiner com dados confidenciais, acessível apenas para leitura.

Se este manifest for aplicado da mesma forma que no exemplo anterior, o resultado deverá ser o mesmo:

A palavra mágica é "xyzzy"

Lendo objetos Secret

Na seção anterior, usamos o comando kubectl describe para exibir o conteúdo do ConfigMap. É possível fazer o mesmo com o Secret?

kubectl describe secret/demo-secret
Nome:          demo-secret

Namespace:      padrão
Rótulos:             
Anotações:
Tipo:               Opaque

Dados
====
magicWord: 5 bytes

Observe que os próprios dados não são exibidos. Os objetos Secret no Kubernetes têm o tipo Opaque: isso significa que seu conteúdo não é mostrado na saída do kubectl describe, nos registros e no terminal, o que evita a divulgação acidental de informações confidenciais.

Para visualizar a versão codificada de dados confidenciais no formato YAML, use o comando kubectl get:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64

O que é eHl6enk=, que não se parece nada com nosso valor original? Na verdade, isso é um objeto Secret, apresentado em codificação base64. Base64 é um esquema de codificação de dados binários arbitrários como uma string de caracteres.

Como informações confidenciais podem ser binárias e não acessíveis para saída (como no caso de uma chave de criptografia TLS), objetos Secret são sempre armazenados no formato base64.

O texto beHl6enk= é a versão da nossa palavra secreta xyzzy, codificada em base64. Você pode verificar isso executando o comando base64 —decode no terminal:

echo "eHl6enk=" | base64 --decode
xyzzy

Assim, embora o Kubernetes o proteja de exportar acidentalmente dados confidenciais no terminal ou em arquivos de log, se você tiver permissões para ler objetos Secret em um namespace específico, esses dados podem ser obtidos em formato base64 e posteriormente decodificados.

Se você precisar codificar algum texto em base64 (por exemplo, para colocá-lo em um Secret), use o comando base64 sem argumentos:

echo xyzzy | base64
eHl6enkK

Acesso a objetos Secret

Quem pode ler e editar objetos Secret? Isso é determinado pelo RBAC — mecanismo de controle de acesso (discutiremos isso em detalhes na seção 'Introdução ao gerenciamento de acesso baseado em funções' na p. 258). Se você está usando um cluster onde o sistema RBAC está ausente ou não ativado, todos os seus objetos Secret estarão disponíveis para qualquer usuário e contêiner (explicaremos mais tarde que você não deve ter nenhum cluster de produção sem RBAC).

Criptografia passiva de dados

E quanto àqueles que têm acesso à base de dados etcd, onde o Kubernetes armazena todas as suas informações? Podem eles ler dados confidenciais sem ter permissões para ler objetos Secret através da API?

A partir da versão 1.7, o Kubernetes suporta a criptografia passiva de dados. Isso significa que informações confidenciais dentro do etcd são armazenadas no disco de forma criptografada e não podem ser lidas, mesmo por aqueles que têm acesso direto ao banco de dados. Para sua descriptografia, é necessária uma chave que está apenas no servidor API do Kubernetes. Em um cluster corretamente configurado, a criptografia passiva deve estar habilitada.

Você pode verificar se a criptografia passiva está funcionando em seu cluster da seguinte forma:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

Se você não ver a flag experimental-encryption-provider-config, a criptografia passiva não está ativada. Ao usar o Google Kubernetes Engine ou outros serviços de gerenciamento de Kubernetes, seus dados são criptografados por meio de um mecanismo diferente, portanto, a flag estará ausente. Consulte seu provedor de Kubernetes para saber se o conteúdo do etcd está sendo criptografado.

Armazenamento de dados confidenciais

Existem recursos do Kubernetes que nunca devem ser removidos do cluster: por exemplo, objetos Secret de importância crítica. Você pode proteger um recurso contra remoção usando uma anotação fornecida pelo gerenciador Helm:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

Estratégias de gerenciamento de objetos Secret

No exemplo da seção anterior, os dados confidenciais foram protegidos contra acesso não autorizado logo após serem salvos no cluster. No entanto, nos arquivos de manifesto, eles foram armazenados como texto simples.

Você nunca deve armazenar informações confidenciais em arquivos que estão sob controle de versão. Como, então, administrar e armazenar essas informações de forma segura antes de aplicá-las ao cluster Kubernetes?

Você pode escolher quaisquer ferramentas ou estratégias para lidar com dados confidenciais em seus aplicativos, mas ainda precisará responder a pelo menos as seguintes perguntas.

  • Onde armazenar dados confidenciais para que eles sejam altamente disponíveis?
  • Como tornar os dados confidenciais acessíveis para seus aplicativos ativos?
  • O que deve acontecer com seus aplicativos quando você substitui ou edita os dados confidenciais?

Sobre os autores

John Arundel é um consultor com 30 anos de experiência na indústria da computação. Ele escreveu vários livros e trabalha com muitas empresas de diferentes países, fornecendo consultoria sobre infraestrutura orientada para a nuvem e Kubernetes. No seu tempo livre, gosta de surfar, é um bom atirador e toca piano como hobby. Mora em uma casa de contos de fadas em Cornwall, Inglaterra.

Justin Domingus — engenheiro de administração de sistemas, trabalhando em um ambiente DevOps com Kubernetes e tecnologias de nuvem. Ele gosta de passar tempo ao ar livre, beber café, apanhar caranguejos e ficar no computador. Mora em Seattle, Washington, com seu maravilhoso gato e sua ainda mais maravilhosa esposa, que é também sua melhor amiga, Adrienne.

» Você pode se aprofundar no livro em site da editora
» Índice
» Trecho

Para os moradores do Habr, desconto de 25% com o cupom — Kubernetes

Após o pagamento da versão impressa do livro, o e-book será enviado por e-mail.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster