Come team della piattaforma di Trendyol Tech, uno dei nostri obiettivi era rendere la configurazione delle applicazioni e la gestione dei segreti dinamica, affidabile, sicura ed essere astratta dalle applicazioni. Abbiamo usato Kubernetes ConfigMaps e Secrets per molto tempo e non soddisfano completamente le nostre esigenze. Per esempio, quando cambiamo una configurazione su una ConfigMap, dobbiamo riavviare i nostri pod applicativi perché la modifica abbia effetto. A volte ci vogliono diversi minuti perché la modifica si rifletta su tutte le istanze dell’applicazione. Un altro problema è che i segreti di Kubernetes non sono abbastanza sicuri. Abbiamo bisogno che i nostri segreti siano sicuri e verificabili.
I nostri requisiti principali erano;
- Dovremmo essere in grado di cambiare le configurazioni delle applicazioni dinamicamente senza riavviare i processi delle applicazioni. Quando cambiamo una configurazione, dovrebbe avere effetto su tutte le istanze dell’applicazione istantaneamente.
- I nostri segreti di applicazione devono essere sicuri e verificabili. Vogliamo anche fornire un controllo di accesso basato sui ruoli ai segreti.
- Abbiamo bisogno di astrarre la gestione della configurazione dalle applicazioni. In altre parole, le applicazioni non dovrebbero sapere dove e come i segreti e le configurazioni sono conservati e forniti per loro.
- Il nostro sistema di gestione della configurazione e dei segreti deve essere altamente disponibile e scalabile.
Dopo alcune ricerche, siamo giunti a 2 applicazioni; envconsul e consul-template.
Sapevamo già che Vault è lo strumento standard del settore per la memorizzazione dei segreti. Soddisfa tutti i nostri requisiti e ha caratteristiche come i segreti dinamici, che potrebbero esserci utili in futuro. Si può anche usare Consul come backend di memorizzazione per Vault.
Consul è uno strumento distribuito, altamente disponibile e scalabile per la scoperta e la configurazione dei servizi. Nel nostro caso, useremo solo la funzione key-value store di Consul per mantenere configurazioni non segrete.
Potremmo usare envconsul o consul-template principalmente per il terzo requisito: astrarre la gestione della configurazione dalle applicazioni.
Envconsul fornisce un modo per lanciare un sottoprocesso con variabili d’ambiente popolate da Consul e Vault.
Consul-template popola i valori di Consul e Vault nel file system e mantiene i valori sincronizzati mentre lavora in modalità demone.
Una regola delle App a dodici fattori è: memorizzare le configurazioni nell’ambiente. Ma il problema con Envconsul (o variabili d’ambiente) è che non si possono cambiare le variabili d’ambiente di un processo senza riavviarlo. Questo va contro il nostro primo requisito. Vogliamo essere in grado di cambiare le configurazioni senza riavviare i processi applicativi. Ecco perché abbiamo deciso di usare consul-template.
In consul-template, è possibile utilizzare un file modello per la resa dei file di configurazione. Questo ci dà una grande flessibilità. Ecco un file template di esempio;
Consul-template legge questo template, sostituisce i segnaposto con valori da Consul se si usa la parola chiave “key” e da Vault se si usa la parola chiave “with secret”. Puoi trovare maggiori informazioni sul linguaggio dei template qui. Il file di output renderizzato sarebbe simile a questo;
server:
port: "8080"
toggles:
fooEnabled: true
database:
username: "username"
password: "password"