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
3 Réponses :
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 >
sed
est utile pour la substitution de variables de pipeline.
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
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"
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
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 -