Livro “Kubernetes para DevOps”

Livro “Kubernetes para DevOps” Olá, residentes de Khabro! Kubernetes é um dos elementos-chave do ecossistema de nuvem moderno. Essa tecnologia fornece confiabilidade, escalabilidade e resiliência à virtualização de contêineres. John Arundel e Justin Domingus falam sobre o ecossistema Kubernetes e apresentam soluções comprovadas para problemas cotidianos. Passo a passo, você construirá seu próprio aplicativo nativo da nuvem e criará a infraestrutura para suportá-lo, configurará um ambiente de desenvolvimento e um pipeline de implantação contínua que o ajudará enquanto você trabalha em seus próximos aplicativos.

• Comece a usar contêineres e Kubernetes desde o básico: nenhuma experiência especial é necessária para aprender o assunto. • Execute seus próprios clusters ou escolha um serviço Kubernetes gerenciado da Amazon, Google, etc. • Use Kubernetes para gerenciar o ciclo de vida do contêiner e o consumo de recursos. • Otimize clusters com base em custo, desempenho, resiliência, potência e escalabilidade. • Aprenda as melhores ferramentas para desenvolver, testar e implantar seus aplicativos. • Aproveite as práticas atuais do setor para garantir segurança e controle. • Implemente princípios de DevOps em toda a empresa para que as equipes de desenvolvimento possam agir com mais flexibilidade, rapidez e eficiência.

Para quem é o livro?

O livro é mais relevante para funcionários de departamentos de administração responsáveis ​​por servidores, aplicações e serviços, bem como para desenvolvedores envolvidos na construção de novos serviços em nuvem ou na migração de aplicações existentes para Kubernetes e a nuvem. Não se preocupe, você não precisa saber trabalhar com Kubernetes ou containers – nós te ensinaremos tudo.

Usuários experientes do Kubernetes também encontrarão muito valor, com cobertura aprofundada de tópicos como RBAC, implantação contínua, gerenciamento de dados confidenciais e observabilidade. Esperamos que as páginas do livro contenham definitivamente algo interessante para você, independentemente de suas habilidades e experiência.

Que perguntas o livro responde?

Ao planejar e escrever o livro, discutimos a tecnologia de nuvem e Kubernetes com centenas de pessoas, conversando com líderes e especialistas do setor, bem como com novatos. Abaixo estão algumas perguntas selecionadas que eles gostariam de ver respondidas nesta publicação.

  • “Estou interessado em saber por que você deveria dedicar tempo a essa tecnologia. Que problemas isso ajudará a mim e minha equipe a resolver?”
  • “O 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 adicionais são assustadoras. Gostaríamos de obter conselhos confiáveis ​​sobre como as pessoas gerenciam clusters Kubernetes no mundo real e quais problemas provavelmente encontraremos."
  • “Aconselhamento subjetivo seria útil. O ecossistema Kubernetes oferece às novas equipes muitas opções de escolha. Quando existem várias maneiras de fazer a mesma coisa, como saber qual é a melhor? Como fazer uma escolha?

E talvez a mais importante de todas as questões:

  • “Como posso usar o Kubernetes sem atrapalhar minha empresa?”

Excerto. Objetos de configuração e secretos

A capacidade de separar a lógica de um aplicativo Kubernetes de sua configuração (ou seja, de quaisquer valores ou configurações que possam mudar com o tempo) é muito útil. Os valores de configuração normalmente incluem configurações específicas do ambiente, endereços DNS de serviços de terceiros e credenciais de autenticação.

É claro que tudo isso pode ser colocado diretamente no código, mas essa abordagem não é flexível o suficiente. Por exemplo, alterar um valor de configuração exigiria que você construísse e implantasse seu código novamente. Uma solução muito melhor seria separar a configuração do código e lê-lo de um arquivo ou variáveis ​​de ambiente.

O Kubernetes oferece várias maneiras diferentes 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 wrapper do pod (consulte “Variáveis ​​de ambiente” na página 192). Em segundo lugar, os dados de configuração podem ser armazenados diretamente no Kubernetes usando objetos ConfigMap e Secret.

Neste capítulo, exploramos esses objetos detalhadamente e examinamos algumas abordagens práticas para gerenciar configuração e dados confidenciais usando um aplicativo de demonstração.

Atualizando shells de pod quando a configuração muda

Imagine que você tem uma implantação em seu cluster e deseja alterar alguns valores em seu ConfigMap. Se você usar o gráfico do Helm (consulte “Helm: Gerenciador de pacotes para Kubernetes” na página 102), poderá detectar automaticamente uma alteração na configuração e recarregar os shells do pod com um truque interessante. Adicione a seguinte anotação à especificação de implantação:

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

O modelo de implantação agora contém uma soma de verificação dos parâmetros de configuração: se os parâmetros forem alterados, a soma será atualizada. Se você executar helm upgrade, o Helm detectará que a especificação de implantação foi alterada e reiniciará todos os shells de pod.

Dados confidenciais no Kubernetes

Já sabemos que o objeto ConfigMap fornece um mecanismo flexível para armazenar e acessar dados de configuração em um cluster. No entanto, a maioria dos aplicativos possui informações confidenciais e confidenciais, como senhas ou chaves de API. Também pode ser armazenado no ConfigMap, mas esta solução não é a ideal.

Em vez disso, o Kubernetes oferece um tipo especial de objeto projetado para armazenar dados confidenciais: Secreto. A seguir, vejamos um exemplo de como esse objeto pode ser usado em nossa aplicação de demonstração.

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

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

Neste exemplo, a chave privada magicWord é xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). A palavra xyzzy é geralmente muito útil no mundo dos computadores. Semelhante ao ConfigMap, você pode armazenar várias chaves e valores em um objeto Secret. Aqui, para simplificar, usamos apenas um par de valores-chave.

Usando objetos secretos como variáveis ​​de ambiente

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

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord

Execute o seguinte comando no repositório de demonstração para aplicar os manifestos:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

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

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

Ao abrir um endereço localhost:9999/ você deverá ver o seguinte:

The magic word is "xyzzy"

Gravando objetos secretos em arquivos

Neste exemplo, anexaremos o objeto Secret ao contêiner como um arquivo. O código está localizado na pasta hello-secret-file do repositório de demonstração.

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

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

Como na subseção “Criando arquivos de configuração a partir de objetos ConfigMap” na pág. 240, criamos um volume (neste caso demo-secret-volume) e o montamos no contêiner na seção volumeMounts da especificação. O campo mountPath é /secrets, então o Kubernetes criará um arquivo nesta pasta para cada par chave/valor definido no objeto Secret.

Em nosso exemplo, definimos apenas um par de valores-chave chamado magicWord, portanto, o manifesto criará um único arquivo somente leitura /secrets/magicWord com dados confidenciais no contêiner.

Se você aplicar este manifesto da mesma forma que no exemplo anterior, deverá obter o mesmo resultado:

The magic word is "xyzzy"

Lendo objetos secretos

Na seção anterior, usamos o comando kubectl description para exibir o conteúdo de um ConfigMap. O mesmo pode ser feito com Secret?

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

Observe que os dados em si não são exibidos. Os objetos secretos no Kubernetes são do tipo Opaco, o que significa que seu conteúdo não é mostrado na saída de descrição do kubectl, nas entradas de log ou no terminal, tornando impossível revelar acidentalmente informações confidenciais.

Para visualizar uma versão YAML codificada de dados confidenciais, 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=, completamente diferente do nosso valor original? Na verdade, este é um objeto Secreto, representado na codificação base64. Base64 é um esquema para codificar dados binários arbitrários como uma sequência de caracteres.

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

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

echo "eHl6enk=" | base64 --decode
xyzzy

Portanto, embora o Kubernetes proteja você contra a saída acidental de dados confidenciais no terminal ou em arquivos de log, se você tiver permissões de leitura em objetos secretos em um namespace específico, esses dados poderão ser baseados em base64 e posteriormente decodificados.

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

echo xyzzy | base64
eHl6enkK

Acessando objetos secretos

Quem pode ler e editar objetos secretos? Isso é determinado pelo RBAC, um mecanismo de controle de acesso (discutiremos isso em detalhes na subseção “Introdução ao controle de acesso baseado em função” na página 258). Se você estiver executando um cluster que não possui RBAC ou não está habilitado, todos os seus objetos Secret estarão disponíveis para quaisquer usuários e contêineres (explicaremos mais tarde que você não deve ter nenhum cluster de produção sem RBAC).

Criptografia passiva de dados

E quem tem acesso ao banco de dados etcd onde o Kubernetes armazena todas as suas informações? Eles podem ler dados confidenciais sem ter permissão para ler objetos secretos por meio da API?

Desde a versão 1.7, o Kubernetes oferece suporte à criptografia passiva de dados. Isso significa que as informações confidenciais dentro do etcd são armazenadas criptografadas no disco e não podem ser lidas mesmo por aqueles com acesso direto ao banco de dados. Para descriptografá-lo, você precisa de uma chave que apenas o servidor API Kubernetes possui. Em um cluster configurado corretamente, a criptografia passiva deve estar habilitada.

Você pode verificar se a criptografia passiva funciona no seu cluster desta forma:

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

Se você não vir o sinalizador experimental-encryption-provider-config, a criptografia passiva não está habilitada. Ao usar o Google Kubernetes Engine ou outros serviços de gerenciamento do Kubernetes, seus dados são criptografados usando um mecanismo diferente, portanto a sinalização não estará presente. Verifique com seu fornecedor do Kubernetes se o conteúdo do etcd está criptografado.

Armazenamento de dados confidenciais

Existem alguns recursos do Kubernetes que nunca devem ser removidos do cluster, como objetos secretos altamente confidenciais. Você pode proteger um recurso contra exclusão usando uma anotação fornecida pelo gerenciador do Helm:

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

Estratégias de gerenciamento de objetos secretos

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

Você nunca deve colocar informações confidenciais em arquivos que estejam sob controle de versão. Como você pode gerenciar e armazenar essas informações com segurança 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 pelo menos às seguintes perguntas.

  • Onde os dados confidenciais devem ser armazenados para que sejam altamente acessíveis?
  • Como tornar os dados sensíveis acessíveis às suas aplicações ativas?
  • O que deve acontecer com seus aplicativos quando você substitui ou edita dados confidenciais?

Sobre autores

John Arundel é um consultor com 30 anos de experiência na indústria de informática. Ele escreveu vários livros e trabalha com diversas empresas de diversos países, assessorando-as sobre infraestrutura nativa em nuvem e Kubernetes. Nas horas vagas gosta de surfar, é um bom atirador de pistola e toca piano como amador. Mora em uma casa de conto de fadas na Cornualha, Inglaterra.

Justin Domingos — engenheiro de administração de sistemas trabalhando em ambiente DevOps com Kubernetes e tecnologias de nuvem. Ele gosta de passar o tempo ao ar livre, tomando café, pescando caranguejos e sentado em frente ao computador. Mora em Seattle, Washington, com um gato maravilhoso e uma esposa e melhor amiga ainda mais maravilhosa, Adrienne.

» Mais detalhes sobre o livro podem ser encontrados em site da editora
» Índice analítico
» Excerto

Para Khabrozhiteley 25% de desconto usando cupom - Kubernetes

Mediante o pagamento da versão em papel do livro, será enviado um livro eletrônico por e-mail.

Fonte: habr.com

Adicionar um comentário