Фрагменты карты конфигурации nginx-ingress игнорируются файлом nginx.conf

У меня есть кластер kubernetes, в котором я развернул контроллер входящего трафика nginx с помощью helm диаграмма nginx-ingress.

Мне нужно добавить некоторую настраиваемую конфигурацию в файл nginx.conf, который создается в nginx-controller-pod, и я вижу проблему, при которой, если я добавлю однострочную опцию, такую ​​как proxy-buffer-size: "512k", я могу увидеть, как это отражается в nginx. conf и все работает как положено.

Однако, если я попытаюсь добавить фрагмент, чтобы выполнить то же самое:

location-snippet: |
  proxy_buffer_size "512k";

Это как если бы это игнорировалось файлом nginx.conf, а для параметра proxy_buffer_size оставалось значение по умолчанию.

Мне нужно иметь возможность добавлять переопределения http-snippet, server-snippet и location-snippet, но независимо от того, пытаюсь ли я добавить их в ConfigMap или как аннотацию в файле Ingress.yaml, они всегда игнорируются.

Мой 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

Моя конфигурационная карта 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;
   }

person Declan McNulty    schedule 12.10.2018    source источник


Ответы (3)


Если вы хотите изменить свой Kubernetes Ingress, варианты аннотации следующие:

  • nginx.ingress.kubernetes.io/configuration-snippet для фрагмента блока местоположения nginx
  • nginx.ingress.kubernetes.io/server-snippet для фрагмента в служебном блоке конфигурации nginx

Похоже, в этом случае вы используете nginx.org/location-snippets:.

Также существует недопустимый синтаксис YAML в примере конфигурации nginx, и вы также должны использовать множественное число, как в server-snippets, в соответствии с этим пример. Опечатка в документах на момент написания этой статьи. Открыл этот тикет, чтобы продолжить.

Должно получиться примерно так:

  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;
      }

вместо этого:

  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;
    }

Обратите внимание на отступ последней фигурной скобки.

person Rico    schedule 12.10.2018
comment
Спасибо, @Rico, хорошее место на углублении скобки. Однако, если я просто запускаю приложение только со строкой location-snippet в файле yaml, это также игнорируется, и это не включает никаких фигурных скобок - person Declan McNulty; 13.10.2018
comment
Я обновил ответ, похоже, вам нужно использовать location-snippets, а в документации есть опечатка - person Rico; 13.10.2018
comment
Спасибо @Rico, я обновил свой yaml фрагментом сервера в вашем примере, но не вижу его отражения в сгенерированном nginx.conf - person Declan McNulty; 15.10.2018
comment
Вы перезапустили свой входной контроллер? Я считаю, что вам нужно перезапустить его после изменения ConfigMap - person Rico; 15.10.2018

Оказывается, моя проблема была связана с содержанием фрагмента, который я применял. Каждый раз, когда вы запускаете kubectl apply -f myconfigmap.yaml, выполняется проверка изменений, которые вы пытаетесь применить к nginx.conf. Когда эта проверка терпит неудачу, она завершается неудачно, и в терминале нет ничего, что могло бы предупредить вас об этом.

Фактически, вы все равно получаете сообщение configmap/nginx-ingress-controller configured.

Например, когда я добавляю это в карту конфигурации, он обновляет nginx.conf, как и ожидалось:

http-snippet: |
  sendfile on;

Однако когда я добавляю это, ничего не меняется:

http-snippet: |
  sendfile on;
  tcp_nopush on;

Причина в том, что это не удалось проверить, но единственный способ узнать это - посмотреть журналы модуля контроллера входящего трафика nginx. В этом случае я вижу:

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

Итак, я дублировал уже существующую директиву.

person Declan McNulty    schedule 16.10.2018

Я потратил день, пока не получил, что для ingress-nginx (от Kubernetes) есть *-snippet, но для nginx-ingress (от NGINX) это *-snippets с s < / сильный>.

Смотри сюда:

person Evgeniy    schedule 18.12.2020