web-dev-qa-db-fra.com

Les extraits de carte de configuration nginx-ingress étant ignorés par le nginx.conf

J'ai un cluster kubernetes, où j'ai déployé un contrôleur d'entrée nginx en utilisant Helm nginx-ingress chart .

J'ai besoin d'ajouter une configuration personnalisée au fichier nginx.conf qui est généré dans le nginx-controller-pod, et je vois un problème où si j'ajoute une option d'une ligne telle que proxy-buffer-size: "512k" Je peux voir cela reflété dans le fichier nginx.conf et tout fonctionne comme prévu.

Cependant, si j'essaye d'ajouter un extrait pour accomplir la même chose:

location-snippet: |
  proxy_buffer_size "512k";

C'est comme si cela était ignoré par le fichier nginx.conf et le proxy_buffer_size le paramètre reste à sa valeur par défaut.

Je dois pouvoir ajouter http-snippet, server-snippet et location-snippet remplace mais si j'essaye de les ajouter au ConfigMap ou en tant qu'annotation dans le fichier Ingress.yaml, ils sont toujours ignorés.

Mon fichier yaml Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    ingress.kubernetes.io/ssl-redirect: "true" 
    ingress.kubernetes.io/secure-backends: "true"    
    ingress.kubernetes.io/force-ssl-redirect: "true"

    ingress.kubernetes.io/location-snippet: |
       proxy_buffer_size 512k;     --This does not update the nginx.conf
spec:
  tls:
  - hosts:
    - my.app.co.uk
    secretName: tls-secret

  rules:
  - Host: my.app.co.uk
    http:
      paths:
      - path: /
        backend:
          serviceName: myappweb-service
          servicePort: 80

Ma carte de configuration nginx:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-0.28.3
    component: controller
    heritage: Tiller
    release: nginx-ingress
  name: nginx-ingress-controller
  namespace: default
data:
  proxy-buffer-size: "512k" -- this works and updates the nginx.conf

  location-snippet: |
    proxy_buffers 4 512k; -- this does not update the nginx.conf

  server-snippet: |       -- this does not update the nginx.conf
    location /messagehub {
      proxy_set_header Upgrade $http_upgrade;
      proxy_http_version 1.1;
      proxy_set_header X-Forwarded-Host $http_Host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $Host;
      proxy_set_header Connection "upgrade";
      proxy_cache_bypass $http_upgrade;
   }
10
Declan McNulty

Il s'avère que mon problème était dû au contenu de l'extrait de code que j'appliquais. Chaque fois que vous exécutez kubectl apply -f myconfigmap.yaml, une validation est exécutée par rapport aux modifications que vous essayez d'appliquer au nginx.conf. Lorsque cette validation échoue, elle échoue silencieusement et il n'y a rien pour vous en avertir dans le terminal.

En fait, vous obtenez toujours le configmap/nginx-ingress-controller configured message.

Par exemple, lorsque j'ajoute cela à la carte de configuration, il met à jour le nginx.conf comme prévu:

http-snippet: |
  sendfile on;

Cependant, lorsque j'ajoute cela, rien ne change:

http-snippet: |
  sendfile on;
  tcp_nopush on;

La raison en est que la validation a échoué, mais la seule façon de le savoir est de consulter les journaux du pod du contrôleur d'entrée nginx. Dans ce cas, je vois:

Error: exit status 1
2018/10/16 07:45:49 [emerg] 470#470: "tcp_nopush" directive is duplicate in 
/tmp/nginx-cfg468835321:245
nginx: [emerg] "tcp_nopush" directive is duplicate in /tmp/nginx-cfg468835321:245
nginx: configuration file /tmp/nginx-cfg468835321 test failed

Je reproduisais donc une directive qui existait déjà.

5
Declan McNulty

Si vous souhaitez modifier votre Kubernetes Ingress les options d'annotation sont les suivantes:

  • nginx.ingress.kubernetes.io/configuration-snippet pour un extrait de bloc d'emplacement nginx
  • nginx.ingress.kubernetes.io/server-snippet pour un extrait dans le bloc de service de configuration nginx

On dirait que vous utilisez nginx.org/location-snippets: pour ce cas.

Il existe également une syntaxe non valide YAML sur l'exemple de configuration nginx et vous devez également utiliser des pluriels comme dans server-snippets selon ceci exemple . Il y a une faute de frappe dans les docs au moment de la rédaction de cet article. Ouvert ce ticket pour le suivi.

Cela devrait être quelque chose comme ceci:

  server-snippets: |
    location /messagehub {
      proxy_set_header Upgrade $http_upgrade;
      proxy_http_version 1.1;
      proxy_set_header X-Forwarded-Host $http_Host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $Host;
      proxy_set_header Connection "upgrade";
      proxy_cache_bypass $http_upgrade;
      }

au lieu de cela:

  server-snippet: |
    location /messagehub {
      proxy_set_header Upgrade $http_upgrade;
      proxy_http_version 1.1;
      proxy_set_header X-Forwarded-Host $http_Host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $Host;
      proxy_set_header Connection "upgrade";
      proxy_cache_bypass $http_upgrade;
    }

Notez l'indentation de la dernière accolade.

5
Rico