J'utilise actuellement une spécification Kubernetes Deployment.yaml
pour déployer un service. La spécification comprend une référence textuelle à une adresse IP spécifique (marquée comme <static-ip-address>
au dessous de):
spec:
type: LoadBalancer
loadBalancerIP: <static-ip-address>
Je souhaite transférer des informations telles que des mots de passe ou des adresses IP dans des référentiels Git distants. Puis-je éviter cela, par exemple en utilisant des variables d'environnement, par ex. avec une spécification de déploiement et un déploiement réel à peu près comme suit:
spec:
type: LoadBalancer
loadBalancerIP: ${SERVICE_ADDRESS}
et
export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml
Évidemment, cette syntaxe spécifique ne fonctionne pas encore. Mais quelque chose comme cela est-il possible et si oui, comment?
Je préfère ne pas compter sur un outil de provisioning distinct . Les secrets et ConfigMap
s semblent prometteurs, mais apparemment, ils ne peuvent pas être consommés d'une manière qui convient à cet effet. Si je pouvais référencer directement une adresse IP statique définie avec gcloud compute addresses create service-address
ce serait mieux.
Il y avait une autre solution agréablement simple: j'ai une adresse Google Compute my-address
défini, et je peux apparemment l'utiliser dans la spécification de service comme ceci: loadBalancerIP: my-address
.
Avec ceci comme source "externe" pour les adresses IP et secrets pour les mots de passe, il n'y a plus besoin d'un outil de provisioning (ou de modèles) pour mon cas d'utilisation simple (dans un environnement GKE).
OBSOLETE NOW: J'ai décidé d'utiliser un outil de provisioning en quelque sorte, à savoir "intégré" sed
, après tout.
Ma Deployment.yaml
contient désormais une "variable de modèle", par exemple dans
loadBalancerIP: $$EXTERNAL_IP
et je déploie le service avec, par exemple, 1.2.3.4 comme adresse IP externe avec
cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
Une solution beaucoup plus simple/plus propre: envsubst
Dans deploy.yml:
LoadbalancerIP: $LBIP
Ensuite, créez simplement votre var env et exécutez kubectl comme ceci:
export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -
Vous venez de mettre des variables Bash régulières dans le fichier que vous souhaitez utiliser, dans ce cas le manifeste YAML, et vous avez lu ce fichier. Il affichera le fichier avec les vars env remplacés par leurs valeurs. Vous pouvez également l'utiliser pour créer de nouveaux fichiers comme celui-ci:
envsubst < input.yml > output.yml
envsubst
est disponible dans par exemple Paquet Ubuntu/Debian gettext
.
Jusqu'à ce que modèles soient disponibles, la façon la plus simple de le faire est d'exécuter un travail qui tilise l'API Kubernetes pour mettre à jour le service. Un court script Shell dans une image alpine, couplé à un secret (contenant l'adresse IP) et une configmap (contenant le modèle), devrait être assez simple. Le bit difficile utilise correctement les fonctionnalités d'authentification et d'autorisation de l'apiserver.
https://stackoverflow.com/questions/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container donne un exemple d'accès à l'API. Évidemment, vous voudrez POST to / api/v1/namespaces/default/services au lieu de GET dans cet exemple.
Vous pouvez écrire un simple pré-processeur pour effectuer une substitution de variable sur vos fichiers yaml (ou vous pouvez utiliser jsonnet pour accomplir la même chose sur les fichiers de configuration json).
Il y a une discussion autour de ajout de modèles directement dans la configuration de Kubernetes mais il n'est pas encore implémenté ou disponible.