Equipe Kubernetes aaS de Mail.rutraduziu 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:
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.