18
votes

Comment utiliser la configuration ConfigMap avec le contrôleur Helm NginX Ingress - Kubernetes

J'ai trouvé une documentation sur la configuration de votre contrôleur d'entrée NginX à l'aide de ConfigMap: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

Malheureusement, je n'ai aucune idée et je n'ai trouvé nulle part comment charger cette ConfigMap à partir de mon contrôleur Ingress.

Mon contrôleur d'entrée:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
    - hosts:
        - my.endpoint.net
      secretName: ingress-tls
  rules:
    - host: my.endpoint.net
      http:
        paths:
          - path: /
            backend:
              serviceName: web
              servicePort: 443
          - path: /api
            backend:
              serviceName: api
              servicePort: 443

Ma carte de configuration:

kind: ConfigMap
apiVersion: v1
metadata:
  name: ingress-configmap
data:
  proxy-read-timeout: "86400s"
  client-max-body-size: "2g"
  use-http2: "false"

Mon entrée:

helm install --name ingress --namespace ingress-nginx --set rbac.create=true,controller.kind=DaemonSet,controller.service.type=ClusterIP,controller.hostNetwork=true stable/nginx-ingress

Comment faire pour que mon Ingress charge la configuration à partir de ConfigMap?


0 commentaires

10 Réponses :


0
votes

Vous devriez l'utiliser dans le manifeste de déploiement du contrôleur d'entrée


2 commentaires

Je suppose que vous voulez dire la --configmap string : --configmap string "Nom du ConfigMap contenant les configurations globales personnalisées pour le contrôleur." à partir de kubernetes.github.io/ingress-nginx/user-guide/cli-arguments J'utilise actuellement Helm, y a-t-il un moyen de le charger? Helm semble prendre en charge uniquement: controller.customTemplate.configMapName et controller.customTemplate.configMapKey qui sont pour un modèle personnalisé complet. Lien:github.com/helm/charts/tree/master/stable/nginx-ingress


consultez ce lien -> kubernetes.github.io/ingress-nginx/user-guide/...



1
votes

Ce que vous avez est un yaml d'entrée et non un yaml de déploiement de contrôleur Ingress, Ingress Controller est le pod qui fait réellement le travail et est généralement un conteneur nginx lui-même. Un exemple d'une telle configuration peut être trouvé ici dans la documentation que vous avez partagée.

MISE À JOUR

En utilisant cet exemple fourni, vous pouvez également utiliser la méthode suivante pour charger la configuration dans nginx à l'aide de la carte de configuration

     volumeMounts:
      - name: nginx-config
        mountPath: /etc/nginx/nginx.conf
       subPath: nginx.conf
    volumes:
     - name: nginx-config
       configMap:
       name: nginx-config 

nginx-config contient votre configuration nginx dans le cadre de la carte de configuration


1 commentaires

Comme vous l'avez souligné, le modèle personnalisé est une façon de configurer le contrôleur NginX: custom-template mais le ConfigMap avec sa propre convention de clé ici: configmap est une autre façon. Veuillez noter que configmap fournit la configuration directement dans les data: configmap Je ne cherche pas comment charger un modèle personnalisé à partir de ConfigMap, mais comment charger directement la configuration à partir de ConfigMap.



15
votes

J'ai réussi à afficher ce que YAML est exécuté par Helm en utilisant les --dry-run --debug : --dry-run --debug à la fin de la helm install . Ensuite, j'ai remarqué que le contrôleur est exécuté avec le: --configmap={namespace-where-the-nginx-ingress-is-deployed}/{name-of-the-helm-chart}-nginx-ingress-controller . Afin de charger votre ConfigMap, vous devez le remplacer par le vôtre (consultez l'espace de noms).

kind: ConfigMap
apiVersion: v1
metadata:
  name: {name-of-the-helm-chart}-nginx-ingress-controller
  namespace: {namespace-where-the-nginx-ingress-is-deployed}
data:
  proxy-read-timeout: "86400"
  proxy-body-size: "2g"
  use-http2: "false"

La liste des propriétés de configuration peut être trouvée ici .


11 commentaires

est --configmap dans un yaml quelque part? comment voyez-vous ce qu'est --configmap sur un déploiement en cours?


--configmap n'est pas un drapeau reconnu pour helm. Bien que je n'ai aucun problème à créer une carte de configuration et une entrée nginx, je ne sais toujours pas comment relier les deux. L'entrée ne récupère pas les propriétés de la carte de configuration.


N'utilisez pas l'option: --configmap , nommez votre configmap de la même manière que Helm appelle en interne la configmap. Si vous relisez ma réponse, vous pourrez la repérer.


Le nom de la mappe de configuration appliquée est {name-of-the-helm-chart}-ingress-nginx-ingress-controller et sera récupéré dans l'espace de noms où le graphique est déployé. Ajouter un commentaire au cas où les modifications de la réponse seraient rejetées. Merci beaucoup pour votre aide @NeverEndingQueue! À votre santé!!!


Heureux d'avoir pu aider. Merci pour votre modification, j'ai légèrement ajusté. Je pense que ce n'est pas: {name-of-the-helm-chart}-ingress-nginx-ingress-controller , mais: {name-of-the-helm-chart}-nginx-ingress-controller . Est-ce correct?


Il semble que ce soit en fait {namespace} / {release-name} -nginx-ingress-controller. J'ai essayé un essai à sec également, mais sans nom de version, donc un nom aléatoire a été choisi (je pense.) et j'ai grepped - --configmap=default/washing-ladybird-nginx-ingress-controlle‌​r


@NeverEndingQueue À partir de maintenant, le nom est en fait {name-of-the-helm-chart}-controller .


@rubik {nom-du-graphique-de-barre} -nginx-ingress-controller fonctionne pour moi.


J'ai dû créer un nouveau fichier de configuration car une configuration avec ce nom n'existait pas déjà. Pour déboguer la configuration, vous pouvez également exécuter dans le pod nginx et lire le fichier nginx.conf.


@NeverEndingQueue, merci pour la réponse. Pouvez-vous fournir plus d'informations sur l'automatisation du flux de déploiement? Par exemple, dans ce cas, je suppose que le configmap devrait déjà être déployé avant le déploiement du graphique de barre d'entrée nginx? Ou le contrôleur d'entrée nginx peut-il récupérer la configuration nouvellement ajoutée avec le bon nom après avoir déployé nginx ingress?


Alors que j'essayais d'ajouter une nouvelle configmap sur l'entrée existante, j'ai remarqué qu'il s'agissait d'une configmap existante nommée 'nginx-ingress-ingress-nginx-controller' sans aucune donnée, donc je dois en ajouter une nouvelle avec un nom différent et modifier le déploiement en inclure également cette configuration?



1
votes

Lorsque vous appliquez la configuration ConfigMap avec des données clé-valeur nécessaires, le contrôleur Ingress récupère ces informations et les insère dans le fichier de configuration d'origine du pod nginx-ingress-controller imbriqué /etc/nginx/nginx.conf , il est donc facile de vérifier par la suite si ConfigMap les valeurs ont été reflétées avec succès ou non, en vérifiant le nginx.conf réel dans le pod correspondant.

Vous pouvez également vérifier les journaux du pod nginx-ingress-controller pertinent afin de vérifier si les données ConfigMap sont déjà rechargées dans le backend nginx.conf , ou si ce n'est pas le cas pour en rechercher la raison.


3 commentaires

Merci. Oui, le changement de ConfigMap affecte bien le nginx.conf intérieur. Si quelqu'un veut vérifier si la configuration de NginX a été affectée à l'extérieur (sans entrer dans le pod), vous pouvez définir soit: server_tokens off ou server_tokens on et remarquer comment NginX s'annonce dans les en-têtes HTTP.


quel type de journaux dois-je voir dans le contrôleur si une configmap a été détectée? car il semble que j'ai tout suivi ici et je ne suis pas sûr si mon .conf est mis à jour


kubectl exec -ndefault nginx-ingress-controller-b545558d8-829dz -- cat /etc/nginx/nginx.conf | grep tokens par exemple.



3
votes

Si vous avez utilisé helm install pour installer ingress-nginx, si aucune valeur explicite pour laquelle ConfigMap le contrôleur nginx devrait examiner n'a été transmise, la valeur par défaut semble être {namespace} / {release-name} -nginx-ingress-controller . Ceci est généré par https://github.com/helm/charts/blob/1e074fc79d0f2ee085ea75bf9bacca9115633fa9/stable/nginx-ingress/templates/controller-deployment.yaml#L67 . (Voir similaire s'il s'agit d'un lien mort).

Pour vérifier par vous-même, essayez de trouver votre commande avec laquelle vous avez installé le graphique ingress-nginx et ajoutez --dry-run --debug à la commande. Cela vous montrera les fichiers yaml générés par Tiller à appliquer au cluster. La ligne # Source: nginx-ingress/templates/controller-deployment.yaml commence le déploiement du contrôleur qui a un arg de --configmap= . La valeur de cet arg est ce qui doit être le nom du ConfigMap pour que le contrôleur le détecte et l'utilise pour mettre à jour son propre fichier .conf . Cela pourrait être transmis explicitement, mais si ce n'est pas le cas, il aura une valeur par défaut.

Si un ConfigMap est créé avec le nom DROIT, les journaux du contrôleur montreront qu'il a récupéré le changement de configuration et s'est rechargé.

Cela peut être vérifié avec les kubectl logs <pod-name-of-controller> -n <namespace-arg-if-not-in-default-namespace> . Mes messages de journal contenaient le texte Configuration changes detected, backend reload required. Ces messages de journal ne seront pas présents si le nom ConfigMap était incorrect.

Je pense que la documentation officielle à ce sujet fait inutilement défaut, mais peut-être que je me trompe? Je vais essayer de soumettre un PR avec ces détails. Quelqu'un qui en sait plus devrait les aider à les étoffer pour que les gens n'aient pas à tomber inutilement dessus.

Merci pour votre message.


0 commentaires

6
votes

On peut également transmettre les propriétés de config mag au moment de l'installation:

helm install stable/nginx-ingress --name nginx-ingress --set controller.config.use-forwarded-headers='"true"'

REMARQUE: pour les valeurs non-chaîne, il fallait utiliser des guillemets simples autour des guillemets doubles pour que cela fonctionne.


1 commentaires

Merci pour cette réponse valable aussi. Mais je me demande comment puis-je transmettre l'extrait de code http en tant que paramètre du graphique de barre? Par exemple, "http-snippet": "proxy_cache_path / tmp / nginx_cache levels = 1: 2 keys_zone = mycache: 32m use_temp_path = off max_size = 4g inactive = 1h;". Merci



0
votes

J'ai lu les réponses ci-dessus mais je n'ai pas pu le faire fonctionner.

Ce qui a fonctionné pour moi était le suivant:

kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-udp-ic-cm
  namespace: default
data:
  worker-connections : "10000"

et le tcp-udp-ic-cm.yaml est:

release_name=tcp-udp-ic

# add the helm repo from NginX and update the chart
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update

echo "- Installing -${release_name}- into cluster ..."

#delete the config map if already exists
kubectl delete cm tcp-udp-ic-cm

helm del --purge ${release_name}
helm upgrade --install ${release_name} \
--set controller.image.tag=1.6.0 \
--set controller.config.name=tcp-udp-ic-cm \
nginx-stable/nginx-ingress --version 0.4.0 #--dry-run --debug

# update the /etc/nginx/nginx.conf file with my attributes, via the config map
kubectl apply -f tcp-udp-ic-cm.yaml

Essentiellement, je dois déployer avec helm la version et définir le nom du config-map qui va utiliser. Helm crée le config-map mais vide. Ensuite, j'applique le fichier config-map afin de mettre à jour la ressource config-map avec mes valeurs. Cette séquence est la seule que je puisse faire fonctionner.


0 commentaires

0
votes

Si vous souhaitez donner votre propre configuration lors du déploiement de nginx-ingress-controller , vous pouvez avoir un graphique Helm wrapper sur le graphique Helm nginx-ingress et fournir votre propre values.yaml qui peut avoir une configuration personnalisée.

Utiliser Helm 3 ici.

Créez un graphique:

$ helm lint <path/to/chart>
$ helm install --debug --dry-run --namespace <namespace> <release-name> <path/to/chart>

Donc, ma structure de graphique ressemble à ceci:

$ helm dependency update <path/to/chart>

Il y a quelques choses supplémentaires ici. Plus précisément, je n'ai pas besoin du répertoire complet des templates/ et de son contenu, je vais donc simplement les supprimer:

$ cat custom-nginx/values.yaml 
# Default values for custom-nginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

nginx-ingress:
  controller:
    ingressClass: internal-nginx
    replicaCount: 1
    service:
      externalTrafficPolicy: Local
    publishService:
      enabled: true
    autoscaling:
      enabled: true
      minReplicas: 1
      maxReplicas: 3
      targetCPUUtilizationPercentage: "80"
      targetMemoryUtilizationPercentage: "80"
    resources:
      requests:
        cpu: 1
        memory: 2Gi
      limits:
        cpu: 1
        memory : 2Gi
    metrics:
      enabled: true
    config:
      compute-full-forwarded-for: "true"

Maintenant, la structure du graphique devrait ressembler à ceci:

 $ cat custom-nginx/Chart.yaml 
apiVersion: v2
name: custom-nginx
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 1.39.1

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 0.32.0

dependencies:
- name: nginx-ingress
  version: 1.39.1
  repository: https://kubernetes-charts.storage.googleapis.com/ 

Depuis, nous devons inclure le graphique nginx-ingress original en tant que dépendance, mon Chart.yaml ressemble à ceci:

custom-nginx/
├── Chart.yaml
├── charts
└── values.yaml

Ici, appVersion est la version de l'image docker nginx-controller et la version correspond à la version du graphique nginx-ingress que j'utilise.

La seule chose qui reste est de fournir votre configuration personnalisée. Voici une version allégée de ma configuration personnalisée:

$ rm custom-nginx/templates/*
$ rmdir custom-nginx/templates

Nous pouvons vérifier les clés disponibles à utiliser comme configuration (section config dans values.yaml ) dans https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

Et le reste de la configuration peut être trouvé ici: https://github.com/helm/charts/tree/master/stable/nginx-ingress#configuration

Une fois les configurations définies, téléchargez simplement la dépendance de votre graphique:

custom-nginx/
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

Il est recommandé d'effectuer des vérifications de base sur votre graphique avant de le déployer:

$ helm create custom-nginx
$ tree custom-nginx

Puis déployez votre graphique (qui déploiera votre nginx-ingress-controller avec vos propres configurations personnalisées).

De plus, puisque vous avez un graphique maintenant, vous pouvez mettre à niveau et restaurer votre graphique.


0 commentaires

0
votes

Un moyen plus simple de faire cela consiste simplement à modifier les valeurs déployées via helm. Les valeurs à modifier pour entrer dans ConfigMap se trouvent maintenant dans controller.config.entries . Afficher les dernières valeurs avec: helm show values nginx-stable/nginx-ingress et rechercher le format sur la version que vous exécutez.

J'ai eu des tonnes de problèmes avec cela puisque toutes les références en ligne indiquaient controller.config , jusqu'à ce que je vérifie avec la commande ci-dessus.

Après avoir entré les valeurs, mettez à niveau avec:

helm upgrade -f <PATH_TO_FILE>.yaml <NAME> nginx-stable/nginx-ingress


0 commentaires

0
votes

Juste pour confirmer la réponse @NeverEndingQueue ci-dessus, le nom de la carte de configuration est présent dans la spécification du pod nginx-controller lui-même, donc si vous inspectez le yaml du pod nginx-controller : kubectl get po release-name-nginx-ingress-controller-random-sequence -o yaml , sous spec.containers , vous trouverez quelque chose comme:

I1116 10:35:45.174127       6 event.go:278] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"default", Name:"release-name-nginx-ingress-controller", UID:"76819abf-4df0-41e3-a3fe-25445e754f32", APIVersion:"v1", ResourceVersion:"62559702", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap default/release-name-nginx-ingress-controller
I1116 10:35:45.184627       6 controller.go:141] Configuration changes detected, backend reload required.
I1116 10:35:45.396920       6 controller.go:157] Backend successfully reloaded.

Par exemple, ici, une mappe de configuration nommée release-name-nginx-ingress-controller dans l'espace de noms default doit être créée.

Une fois terminé, vous pouvez vérifier si les modifications ont eu lieu en vérifiant les journaux. Normalement, vous verrez quelque chose comme:

  - args:
    - /nginx-ingress-controller
    - --default-backend-service=default/release-name-nginx-ingress-default-backend
    - --election-id=ingress-controller-leader
    - --ingress-class=nginx
    - --configmap=default/release-name-nginx-ingress-controller


0 commentaires