Как использовать конфигурацию ConfigMap с контроллером Ingress Helm NginX - Kubernetes

Я нашел документацию о том, как настроить входящий контроллер NginX с помощью ConfigMap: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

К сожалению, я понятия не имею и нигде не могу найти, как загрузить эту ConfigMap с моего контроллера Ingress.

Мой входной контроллер:

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

Моя конфигурационная карта:

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

Мой вход:

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

Как сделать так, чтобы мой Ingress загружал конфигурацию из ConfigMap?


person NeverEndingQueue    schedule 26.02.2019    source источник


Ответы (10)


Мне удалось отобразить, что YAML выполняет Helm, используя параметры: --dry-run --debug в конце команды helm install. Затем я заметил, что там контроллер выполняется с: --configmap={namespace-where-the-nginx-ingress-is-deployed}/{name-of-the-helm-chart}-nginx-ingress-controller. Чтобы загрузить свою ConfigMap, вам необходимо заменить ее своей собственной (проверьте пространство имен).

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"

Список свойств конфигурации можно найти на здесь.

person NeverEndingQueue    schedule 26.02.2019
comment
--configmap где-нибудь в ямле? как вы видите, что --configmap находится в запущенном развертывании? - person red888; 23.04.2019
comment
--configmap не является распознанным флагом для руля. Хотя у меня нет проблем с созданием карты конфигурации и входа nginx, я все еще не знаю, как связать их вместе. При входе не используются свойства из карты конфигурации. - person ScottSummers; 13.05.2019
comment
Не используйте параметр: --configmap, назовите свою конфигурационную карту так же, как Helm внутренне вызывает конфигурационную карту. Если вы еще раз прочтете мой ответ, вы сможете его заметить. - person NeverEndingQueue; 14.05.2019
comment
Имя применяемой карты конфигурации {name-of-the-helm-chart}-ingress-nginx-ingress-controller и будет взято из пространства имен, в котором развернута диаграмма. Добавление комментария на случай отклонения правок в ответе. Большое спасибо за помощь @NeverEndingQueue! Ваше здоровье!!! - person ScottSummers; 21.05.2019
comment
Рад, что смог помочь. Спасибо за правку, я немного поправил. Я думаю, это не: {name-of-the-helm-chart}-ingress-nginx-ingress-controller, а: {name-of-the-helm-chart}-nginx-ingress-controller. Это правильно? - person NeverEndingQueue; 21.05.2019
comment
Похоже, это на самом деле {namespace} / {release-name} -nginx-ingress-controller. Я также пробовал пробный прогон, но без названия выпуска, поэтому был выбран случайный (я думаю), и я grepped - --configmap=default/washing-ladybird-nginx-ingress-controller - person Yehuda Makarov; 15.07.2019
comment
@NeverEndingQueue На данный момент имя на самом деле {name-of-the-helm-chart}-controller. - person rubik; 24.12.2019
comment
@rubik {name-of-the-helm-chart} -nginx-ingress-controller мне подходит. - person NFern; 15.02.2020
comment
Мне пришлось создать новый файл конфигурации, поскольку конфигурации с таким именем еще не существовало. Чтобы отладить конфигурацию, вы также можете выполнить команду в модуле nginx и прочитать файл nginx.conf. - person NFern; 15.02.2020
comment
@NeverEndingQueue, спасибо за ответ. Не могли бы вы предоставить дополнительную информацию об автоматизации процесса развертывания? Например, в этом случае я предполагаю, что конфигурационная карта уже должна быть развернута до того, как будет развернута диаграмма управления входом nginx? Или может ли контроллер входящего трафика nginx забрать недавно добавленную карту конфигурации с правильным именем после развертывания входящего потока nginx? - person rishi; 18.11.2020
comment
Пока я пытался добавить новую карту конфигурации к существующему входу, я заметил, что это была существующая карта конфигурации с именем nginx-ingress-ingress-nginx-controller без каких-либо данных, поэтому мне нужно добавить новую карту с другим именем и отредактировать развертывание на включить и эту конфигурационную карту? - person rishi; 18.11.2020

Также можно передать свойства config mag во время установки:

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

ПРИМЕЧАНИЕ: для нестроковых значений приходилось использовать одинарные кавычки вокруг двойных кавычек, чтобы заставить его работать.

person adnan kamili    schedule 05.09.2019
comment
Спасибо и за этот верный ответ. Но интересно, как передать http-сниппет в качестве параметра в диаграмму управления? Например, http-snippet: proxy_cache_path / tmp / nginx_cache levels = 1: 2 keys_zone = mycache: 32m use_temp_path = off max_size = 4g inactive = 1h ;. Спасибо - person rishi; 18.11.2020

Если вы использовали helm install для установки ingress-nginx, если не было передано явного значения, для которого ConfigMap должен смотреть контроллер nginx, значение по умолчанию выглядит как {namespace} / {release-name} -nginx-ingress-controller. Это создается //github.com/helm/charts/blob/1e074fc79d0f2ee085ea75bf9bacca9115633fa9/stable/nginx-ingress/templates/controller-deployment.yaml#L67. (Смотрите аналогично, если это мертвая ссылка).

Чтобы убедиться в этом, попробуйте найти свою команду, с которой вы установили диаграмму ingress-nginx, и добавьте в команду --dry-run --debug. Это покажет вам файлы yaml, созданные Tiller для применения к кластеру. Строка # Source: nginx-ingress/templates/controller-deployment.yaml начинает развертывание контроллера, у которого arg --configmap=. Значение этого arg - это то, что должно быть именем ConfigMap, чтобы контроллер распознал и использовал его для обновления своего собственного .conf файла. Его можно передать явно, но если это не так, оно будет иметь значение по умолчанию.

Если ConfigMap создается с ПРАВИЛЬНЫМ именем, в журналах контроллера будет показано, что он принял изменение конфигурации и перезагрузился.

Это можно проверить с помощью kubectl logs <pod-name-of-controller> -n <namespace-arg-if-not-in-default-namespace>. Мои сообщения журнала содержали текст Configuration changes detected, backend reload required. Эти сообщения журнала не будут присутствовать, если имя ConfigMap было неправильным.

Я считаю, что официальная документация по этому поводу без надобности отсутствует, но, может быть, я ошибаюсь? Я постараюсь представить PR с этими деталями. Кто-то, кто знает больше, должен помочь им конкретизировать, чтобы людям не приходилось натыкаться на это без необходимости.

Ура, спасибо за ваш пост.

person Yehuda Makarov    schedule 14.07.2019

Если вы хотите указать свою собственную конфигурацию при развертывании nginx-ingress-controller, вы можете иметь диаграмму Helm-оболочки поверх исходной nginx-ingress диаграммы Helm и предоставить свою собственную values.yaml, которая может иметь настраиваемую конфигурацию.

Здесь используется Helm 3.

Создайте диаграмму:

$ helm create custom-nginx
$ tree custom-nginx

Итак, моя структура диаграммы выглядит так:

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

Здесь есть несколько дополнительных вещей. В частности, мне не нужен полный каталог templates/ и его содержимое, поэтому я просто удалю их:

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

Теперь структура диаграммы должна выглядеть так:

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

Поскольку мы должны включить исходную диаграмму nginx-ingress в качестве зависимости, моя Chart.yaml выглядит так:

 $ 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/ 

Здесь appVersion - это nginx-controller версия образа докера, а version совпадает с nginx-ingress версией диаграммы, которую я использую.

Осталось только указать вашу индивидуальную конфигурацию. Вот урезанная версия моей пользовательской конфигурации:

$ 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"

Мы можем проверить ключи, которые доступны для использования в качестве конфигурации (раздел config в values.yaml) в https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

Остальную конфигурацию можно найти здесь: https://github.com/helm/charts/tree/master/stable/nginx-ingress#configuration

После того, как конфигурации установлены, просто загрузите зависимость вашей диаграммы:

$ helm dependency update <path/to/chart>

Перед развертыванием диаграммы рекомендуется выполнить базовую проверку:

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

Затем разверните свою диаграмму (которая развернет ваш nginx-ingress-controller с вашими собственными настройками).

Кроме того, поскольку теперь у вас есть диаграмма, вы можете обновить и откатить диаграмму.

person Shubham    schedule 09.06.2020

Когда вы применяете конфигурацию ConfigMap с необходимым ключом - значения данных, контроллер Ingress забирает эту информацию и вставляет ее в исходный файл конфигурации вложенного nginx-ingress-controller Pod /etc/nginx/nginx.conf, поэтому впоследствии легко проверить, были ли значения ConfigMap успешно отражены или нет, проверив фактические nginx.conf внутри соответствующего Pod.

Вы также можете проверить журналы из соответствующего nginx-ingress-controller Pod, чтобы проверить, были ли данные ConfigMap уже перезагружены на сервер nginx.conf, или, если нет, выяснить причину.

person Nick_Kh    schedule 26.02.2019
comment
Спасибо. Да, изменение ConfigMap приятно влияет на nginx.conf внутри. Если кто-то хочет проверить, была ли затронута конфигурация NginX извне (не заходя в модуль), вы можете установить либо: server_tokens off, либо server_tokens on и заметить, как NginX рекламирует себя в заголовках HTTP. - person NeverEndingQueue; 26.02.2019
comment
какие журналы я должен видеть в контроллере, если была обнаружена конфигурационная карта? потому что похоже, что я следил за всем здесь, и я не уверен, обновляется ли мой .conf - person Yehuda Makarov; 14.07.2019
comment
kubectl exec -ndefault nginx-ingress-controller-b545558d8-829dz -- cat /etc/nginx/nginx.conf | grep tokens например. - person mpen; 19.06.2020

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

ОБНОВЛЕНИЕ

Используя этот пример, вы также можете использовать следующий способ загрузки конфигурации в nginx с помощью карты конфигурации

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

nginx-config содержит вашу конфигурацию nginx как часть карты конфигурации

person fatcook    schedule 26.02.2019
comment
Как вы отметили, пользовательский шаблон - это один из способов настройки контроллера NginX: custom-template, но ConfigMap с его собственным ключевым соглашением здесь: configmap - другой способ. Обратите внимание, что configmap предоставляет конфигурацию непосредственно в data:. Я ищу не то, как загрузить настраиваемый шаблон из ConfigMap, а как загрузить конфигурацию напрямую из ConfigMap. - person NeverEndingQueue; 26.02.2019

Просто чтобы подтвердить ответ @NeverEndingQueue выше, имя карты конфигурации присутствует в самой спецификации модуля nginx-controller, поэтому, если вы проверите yaml модуля nginx-controller: kubectl get po release-name-nginx-ingress-controller-random-sequence -o yaml в spec.containers, вы найдете что-то вроде:

  - 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

Например, здесь необходимо создать карту конфигурации с именем release-name-nginx-ingress-controller в пространстве имен default.

После этого вы можете проверить, произошли ли изменения, проверив журналы. Обычно вы увидите что-то вроде:

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.
person zakaria amine    schedule 16.11.2020

Вы должны использовать его в манифесте развертывания контроллера входящего трафика

person P Ekambaram    schedule 26.02.2019
comment
Я предполагаю, что вы имеете в виду: --configmap string Имя ConfigMap, содержащего пользовательские глобальные конфигурации для контроллера. из kubernetes.github.io/ingress-nginx/user-guide / cli-arguments Я использую Helm, есть ли способ его загрузить? Кажется, что Helm поддерживает только: controller.customTemplate.configMapName и controller.customTemplate.configMapKey, которые предназначены для полного настраиваемого шаблона. Ссылка: github.com/helm/charts/tree/master/stable/ nginx-ingress - person NeverEndingQueue; 26.02.2019
comment
проверьте эту ссылку - ›kubernetes.github. io / ingress-nginx / руководство пользователя / - person P Ekambaram; 26.02.2019

Я прочитал приведенные выше ответы, но не смог заставить его работать.

Для меня сработало следующее:

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

а tcp-udp-ic-cm.yaml это:

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

По сути, мне нужно развернуть релиз с помощью helm и установить имя config-map, которое будет использоваться. Helm создает конфигурационную карту, но пустую. Затем я применяю файл config-map, чтобы обновить ресурс config-map моими значениями. Это единственная последовательность, которую я мог заставить работать.

person Kostas Demiris    schedule 15.01.2020

Более простой способ сделать это - просто изменить значения, развернутые через helm. Значения, которые необходимо изменить для входа в ConfigMap, теперь находятся в controller.config.entries. Отобразите последние значения с помощью: helm show values nginx-stable/nginx-ingress и найдите формат в используемой вами версии.

У меня было много проблем с этим, так как во всех ссылках в Интернете было сказано controller.config, пока я не проверил с помощью приведенной выше команды.

После того, как вы ввели значения, обновите их с помощью:

helm upgrade -f <PATH_TO_FILE>.yaml <NAME> nginx-stable/nginx-ingress
person JohanLejdung    schedule 11.10.2020