
Time sobre como gerar automaticamente segredos do Helm ao atualizar. A seguir, o texto do autor do artigo — o diretor técnico da Intoware, uma empresa desenvolvedora de soluções SaaS.
Contêineres são incríveis. No começo, eu era um opositor dos contêineres (é constrangedor admitir), mas agora apoio totalmente o uso dessa tecnologia. Se você está lendo isso, espero que tenha navegado com sucesso pelos mares do Docker, percebido as vantagens do Kubernetes e facilitado sua vida com o Helm.
No entanto, algumas coisas são claramente mais complexas do que deveriam 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. Isso pode incluir strings de conexão de banco de dados, senhas de e-mail e assim por diante. Ao usar segredos, você cria uma clara divisão entre o código e as configurações, facilitando a configuração de diferentes implantações sem alterar a base de código.
Uma situação comum é quando dois módulos devem interagir usando uma chave compartilhada. Ninguém fora do cluster deve conhecer essa chave, pois é destinada à comunicação 'de um para outro' dentro do cluster.
Criando segredos
Normalmente, para criar um segredo no Helm, você precisa:
- descrever o segredo no arquivo de valores;
- sobrescrevê-lo no processo de implantação;
- referenciá-lo dentro da implantação/pod;
- … lucro!
Normalmente, isso se parece com:
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ .Values.MyApiKeySecret | quote }}
Um segredo simples do Kubernetes, utilizando valores do values.yml
Mas, suponha que você não queira especificar seu segredo no arquivo de valores.
Existem muitas situações em que uma chave compartilhada, que deve ser gerada durante a instalação, é necessária para a implantação.
No exemplo acima, sobre a comunicação entre os módulos, é indesejável compartilhar o segredo fora da implantação. Portanto, é altamente desejável que o Helm tenha mecanismos para criar automaticamente o segredo sem a necessidade de especificá-lo diretamente.
Hooks
Os hooks permitem executar código em locais específicos durante o processo de instalação. Pode haver uma tarefa de configuração que precisa ser executada após a primeira instalação, ou pode ser necessário realizar uma limpeza antes de qualquer atualização.
Para resolver nosso problema de adicionar a chave gerada durante a instalação, os hooks pré-instalados são ideais. Mas há um detalhe: você não pode gerar um segredo automaticamente ao atualizar. Os hooks funcionarão a cada atualização.
Se você gerou seu segredo e sua primeira instalação ainda não ocorreu, então pare de ler, o hook pré-instalado é perfeito para você.
Mas se o segredo faz parte da atualização (talvez uma nova funcionalidade que não existia durante a instalação), é frustrante que não seja possível criar um hook pré-instalado que funcione apenas uma vez.
Funções
As funções do Helm permitem adicionar diversos elementos de script aos cenários de implantação.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Gere um novo UUID e o coloque entre aspas
Neste exemplo, o valor do segredo apiKey será um novo UUID gerado durante a instalação.
O Helm inclui uma ampla biblioteca de funções que utiliza incríveis recursos de templates do GO e a biblioteca de funções Sprig para criar implantações personalizadas.
Função Lookup
No Helm 3.1, foi adicionada , que permite consultar uma implantação existente e:
- verificar a existência de recursos;
- retornar o valor de um recurso existente para uso posterior.
Usando ambas essas capacidades, podemos criar um segredo dinâmico gerado uma única vez!
# 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á ou gerar um novo valor para o segredo (se o segredo ainda não existir), ou reutilizar o valor existente.
Sucesso!
O que mais ler sobre o assunto:
- .
- .
- .
Fonte: habr.com
