1
votes

Comment injecter des variables d'environnement dans des pods Kubernetes avant le déploiement

J'ai besoin d'injecter le port du conteneur à partir d'une variable d'environnement dans mon pod. Comment faire ça?

J'ai parcouru la documentation, Liens: - 1. https://kubernetes.io/docs / tasks / inject-data-application / define-environment-variable-container / 2. https://kubernetes.io / docs / tasks / inject-data-application / environment-variable-expose-pod-information /

error: error validating "nginx-pod-exposed-through-env.yaml": error validating data: ValidationError(Pod.spec.containers[0].ports[0].containerPort): invalid type for io.k8s.api.core.v1.ContainerPort.containerPort: got "string", expected "integer"; if you choose to ignore these errors, turn validation off with --validate=false
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: $(MY_CONTAINER_PORT)
      env:
        - name: MY_CONTAINER_PORT
          value: 80


7 commentaires

HI, vous devez peut-être utiliser «80» plutôt que 80


J'ai déjà essayé ça, ça ne marche pas. :(


Vous essayez de faire une mauvaise chose. Il n'y a pas de relation entre la variable d'environnement et le numéro de port du conteneur. La variable d'environnement est accessible à l'intérieur du conteneur après le démarrage du conteneur. Le port du conteneur décrit la configuration pour créer le conteneur. Il serait plus facile de répondre à votre question si vous décririez un peu plus vos besoins


@YuriG. J'ai donc eu cette question dans l'examen CKAD où la question indique que je dois déclarer le port du conteneur en tant que variable env, puis utiliser cette variable env pour exposer mon conteneur. Je ne savais pas comment résoudre ce problème et la documentation m'aide donc je veux juste comprendre comment utiliser la variable env pour exposer mon port de conteneur spécifique.


@SureshVishnoi Merci pour la contribution, je l'ai fatiguée et c'est toujours la même chose. Je pense que mon approche est erronée dans ce cas, avez-vous une idée comment exposer un port de conteneurs spécifiques à l'aide de la variable env


Si je comprends bien, vous devez spécifier la valeur de la variable d'environnement en tant que numéro de port, vous essayez de faire le contraire. Consultez cette page pour plus d'informations kubernetes.io/docs/tasks/inject-data-application/...


Je pense que ceci répond à votre question comme prévu -


3 Réponses :


2
votes

Vous ne pouvez pas utiliser les variables d'environnement définies pour le pod à utiliser pour exposer le port. Kubernetes s'attend à ce que la valeur du port du conteneur soit un entier, mais comme vous avez donné $ (MY_CONTAINER_PORT), il indique que les valeurs de chaîne ne sont pas autorisées.

La bonne configuration serait,

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: 80

Cependant, si vous avez toujours besoin que des variables d'environnement soient spécifiées comme containerPort, il est préférable d'utiliser le gestionnaire de packages kubernetes comme helm , ou d'exécuter un script shell sur votre yaml avant de déployer sur kubernetes, de préférence avec envsubstr qui résoudra la variable d'environnement et régénérera le fichier yaml avec la variable env remplacée par containerPort. Peut-être que ce lien de github pourrait vous expliquer pourquoi kubectl ne prendra jamais en charge la substitution de variables. P >


1 commentaires

sed est utile pour la substitution de variables de pipeline.



3
votes

Un moyen d'y parvenir serait d'utiliser un outil de création de modèles tel que ytt . Avec ytt, vous transformeriez votre manifeste en un modèle comme:

ytt --data-values-env MYVAL -f test.yml -f values.yml | kubectl apply -f-

Et puis fournissez un values.yml comme:

$ export MYVAL_port=9000
$ ytt --data-values-env MYVAL -f test.yml -f values.yml   
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 9000


0 commentaires

0
votes

L'exemple ci-dessous contient une variable d'environnement " PASSWORD "

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
    env:
    - name: PASSWORD
      value: "password"


1 commentaires

gr8, mais comment l'utiliser dans une application Spring Boot? J'essaie d'utiliser les secrets kubectl exposés sur un pod en utilisant cette dépendance: spring-cloud-starter-kubernetes-config, j'ai cette exception: io.fabric8.kubernetes.client.KubernetesClientException