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?
10 Réponses :
Vous devriez l'utiliser dans le manifeste de déploiement du contrôleur d'entrée
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/...
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
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.
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 .
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-controller
@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?
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.
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.
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.
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.
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
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.
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.
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
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