Utilizzo delle variabili di ambiente nelle specifiche di distribuzione di Kubernetes


18

Attualmente utilizzo una specifica Kubernetes Deployment.yamlper la distribuzione di un servizio. La specifica include un riferimento testuale ad un indirizzo IP specifico (contrassegnato come di <static-ip-address>seguito):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

Sono preoccupato per l'invio di informazioni come password o indirizzi IP nei repository Git remoti. Posso evitare questo, ad esempio facendo uso delle variabili di ambiente, ad esempio con una specifica di distribuzione e una distribuzione effettiva approssimativamente come segue:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

e

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

Ovviamente questa sintassi specifica non funziona ancora. Ma è possibile qualcosa del genere e se sì, come?

Preferirei non fare affidamento su uno strumento di provisioning separato . Segreti s e ConfigMaps sembrano promettenti, ma a quanto pare non possono essere consumati in un modo che si adatta a questo scopo. Se potessi fare direttamente riferimento a un indirizzo IP statico definito con gcloud compute addresses create service-addressquello sarebbe il migliore.

Risposte:


27

Una soluzione molto più semplice / pulita: envsubst

In deploy.yml:

LoadbalancerIP: $LBIP

Quindi crea il tuo var env ed esegui kubectl in questo modo:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

Basta inserire le variabili Bash regolari in qualsiasi file che si desidera utilizzare, in questo caso il manifest YAML e averlo già letto. Produrrà il file con le variabili env sostituite dai loro valori. Puoi anche usarlo per creare nuovi file come questo:

envsubst < input.yml > output.yml

envsubstè disponibile ad es gettext. nel pacchetto Ubuntu / Debian .


2
+1 per envsubst. non lo sapevo fino ad ora
user1129682

1
Non è più facile / più pulito, in quanto richiede uno strumento separato, che non è installato per impostazione predefinita su tutti i sistemi (ad esempio Mac)
Ivan

@Ivan La sua domanda era "Ma è possibile qualcosa del genere e, se sì, come?", E questa è la risposta alla sua domanda. La domanda non era "Come posso farlo con gli strumenti disponibili su tutti i sistemi operativi per impostazione predefinita?". E sì, è 1) più facile E 2) più pulito dell'uso sed. Per tua definizione, la soluzione proposta con non sedsarebbe anche più facile / più pulita, in quanto non è sedinstallata sui computer Windows per impostazione predefinita.
Jan Grewe,

Non è affatto chiaro che stavi confrontando con l'opzione "sed".
Ivan,

2

C'era un'altra soluzione piacevolmente semplice: ho un indirizzo di Google Compute my-addressdefinito, e mi pare di poter utilizzare nelle specifiche del servizio in questo modo: loadBalancerIP: my-address.

Con questo come fonte "esterna" per indirizzi IP e segreti per password non c'è più bisogno di uno strumento di provisioning (o modelli) per il mio caso d'uso semplice (all'interno di un ambiente GKE).

OSSOLETE ORA: Ho deciso di utilizzare una sorta di strumento di provisioning, vale a dire "integrato" sed, dopo tutto.

Il mio Deployment.yamlora contiene una "variabile modello" ad es. In

loadBalancerIP: $$EXTERNAL_IP

e distribuisco il servizio con, diciamo, 1.2.3.4 come indirizzo IP esterno con

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
L'approccio di Jan Grewe è più generico e può essere applicato a qualsiasi numero di variabili. Suggerirei di accettare la sua risposta invece di accettare la tua che è meno generica e deve essere adattata per ogni variabile aggiuntiva.
TekTimmy,

0

Puoi scrivere un semplice pre-processore per fare la sostituzione variabile sui tuoi file yaml (oppure puoi usare jsonnet per realizzare la stessa cosa sui file di configurazione json).

C'è qualche discussione sull'aggiunta di modelli direttamente nella configurazione di Kubernetes ma non è ancora implementata o disponibile.


Sì, ma jsonnet è uno strumento di fornitura come indicato nella domanda.
Drux,

1
Se stai cercando qualcosa di integrato, seguire la questione a cui ho collegato è la soluzione migliore a questo punto.
Robert Bailey,

0

Fino a quando i modelli non saranno disponibili, il modo più semplice per farlo è eseguire un lavoro che utilizza l'API Kubernetes per aggiornare il servizio. Uno script di shell corta in un'immagine di tipo alpino, associato a un segreto (contenente l'indirizzo IP) e una configurazione (contenente il modello), dovrebbe essere abbastanza semplice. Il bit difficile sta usando correttamente le funzioni di autenticazione e autorizzazione dell'apiserver.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container fornisce un esempio di accesso all'API. Ovviamente, in questo esempio dovrai POSTARE in / api / v1 / namespaces / default / services anziché GET.


Sembra interessante, ma puoi per favore elaborare un po 'di più. Potresti dare o indicare un esempio di uno script shell adatto.
Drux,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.