Geração automática de segredos no Helm

Geração automática de segredos no Helm

Equipe Kubernetes aaS de Mail.ru traduziu uma breve nota sobre como gerar automaticamente segredos do Helm durante a atualização. A seguir, texto do autor do artigo – diretor técnico da Intoware, empresa que desenvolve soluções SaaS.

Os recipientes são legais. No começo eu era anti-contêiner (tenho vergonha de admitir), mas agora apoio totalmente o uso dessa tecnologia. Se você está lendo isso, esperançosamente navegou com sucesso pelos mares do Docker, percebeu os benefícios do Kubernetes e tornou sua vida muito mais fácil com o Helm.

No entanto, algumas coisas são claramente mais difíceis do que precisam ser.

Como gerar segredos automaticamente durante a atualização?

Um segredo do Kubernetes é um recurso que contém pares chave/valor que você deseja usar em seu código. Podem ser cadeias de conexão de banco de dados, senhas de e-mail e assim por diante. Ao usar segredos, você cria uma separação clara entre código e configurações, permitindo personalizar facilmente diferentes implantações sem alterar a base de código.

Uma situação comum é quando dois módulos devem se comunicar utilizando uma chave comum. Ninguém fora do cluster deve conhecer essa chave, pois ela se destina à comunicação um a um dentro do cluster.

Fazendo segredos

Normalmente, para criar um segredo no Helm você precisa:

  • descreva o segredo no arquivo de valores;
  • redefini-lo durante a implantação;
  • consulte-o dentro da implantação/pod;
  • ... lucro!

Geralmente é algo assim:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

Um segredo simples do Kubernetes usando valores devalues.yml

Mas digamos que você não queira especificar seu segredo no arquivo de valores.

Há muitas opções quando a implantação requer uma chave compartilhada, que deve ser gerada durante a instalação.

No exemplo de comunicação módulo a módulo acima, não é desejável compartilhar o segredo fora da implantação. Portanto, é altamente desejável que o Helm tenha mecanismos para gerar automaticamente um segredo sem precisar especificá-lo diretamente.

Ganchos

Os ganchos permitem executar código em locais específicos durante o processo de instalação. Pode haver um trabalho de configuração que precise ser executado após a primeira instalação ou talvez seja necessário fazer uma limpeza antes de realizar qualquer atualização.

Para resolver nosso problema de adicionar uma chave gerada durante a instalação, os ganchos de pré-instalação são ideais. Mas há um problema: você não pode gerar o segredo automaticamente uma vez em uma atualização. Os ganchos funcionarão em todas as atualizações.

Se você gerou seu segredo e sua primeira instalação ainda não aconteceu, pare de ler, o gancho de pré-instalação funcionará muito bem para você.

Mas se o segredo fizer parte de uma atualização (talvez um novo recurso que não existia durante a instalação), é uma pena que você não possa criar um gancho de pré-instalação que funcione apenas uma vez.

funções

As funções do Helm permitem adicionar vários elementos de script aos seus scripts de implantação.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

Este exemplo mostra que o valor do segredo apiKey será o novo UUID gerado durante a instalação.

Helm inclui uma biblioteca de recursos verdadeiramente extensa que aproveita os incríveis recursos do modelo GO e a biblioteca de recursos do Sprig para criar implantações personalizadas.

Função de pesquisa

Adicionado no Helm 3.1 Função de pesquisa, que permite solicitar uma implantação existente e:

  • verificar a existência de recursos;
  • retornar o valor de um recurso existente para uso posterior.

Usando esses dois recursos, podemos criar um segredo único gerado dinamicamente!

# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: some-awesome-secret
type: Opaque

# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
  apiKey: {{ $secret.data.apiKey }}

# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
  apiKey: {{ uuidv4 | quote }}
{{ end }}

Sempre que uma nova atualização é aplicada ao servidor, o Helm irá gerar um novo valor secreto (se ainda não houver segredo) ou reutilizar o valor existente.

Boa sorte!

O que mais ler sobre o assunto:

  1. Três níveis de escalonamento automático no Kubernetes e como usá-los de maneira eficaz.
  2. Kubernetes no espírito da pirataria com um modelo para implementação.
  3. Nosso canal em torno do Kubernetes no Telegram.

Fonte: habr.com

Adicionar um comentário