Как отлаживать подключения к входящему контроллеру с одним IP-адресом с помощью ConfigMap

Мы пытаемся отредактировать наш ingress-nginx.yml, чтобы модули входных контроллеров были отладить трафик, поступающий с определенного IP-адреса источника. Наша установка:

  • Kubernetes v1.13
  • Ingress-Controller v0.24.1

Из документов NGINX и Kubernetes кажется, что нет очень простого способа отлаживать трафик с одного IP-адреса (вы не можете напрямую редактировать конфигурацию nginx). Итак, мы хотели бы добавить директиву debug_connection, которая будет выглядеть так:

error_log /path/to/log;
...
events {
    debug_connection 192.168.1.1;
}

Правильный способ сделать это должен быть через CustomAnnotations в ConfigMap + новый вход для включения CustomAnnotation, поэтому мы попробовали это:

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app: ingress-nginx
data:
ingress-template: |
    #Creating the custom annotation to make debug_connection on/off
    {if index $.Ingress.Annotations "custom.nginx.org/debug_connection"}
    {$ip := index $.Ingress.Annotations "custom.nginx.org/ip"}
    {end}

    {range $events := .Events}
    events {
      # handling custom.nginx.org/debug_connection
      {if index $.Ingress.Annotations "custom.nginx.org/debug_connection"}
      {end}

А также:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: debugenabler
  annotations:
    kubernetes.io/ingress.class: "nginx"
    custom.nginx.org/debug_connection: "on"
    custom.nginx.org/ip: "192.168.1.1"
spec:
  rules:
  - host: "ourhostname"
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

Мы применили ingress-nginx.yml без ошибок. Мы видим новые строчки в конфиге nginx:

location /coffee {

            set $namespace      "test";
            set $ingress_name   "debugenabler";
            set $service_name   "coffee-svc";
            set $service_port   "80";
            set $location_path  "/coffee";

            rewrite_by_lua_block {
                lua_ingress.rewrite({
                    force_ssl_redirect = true,
                    use_port_in_redirects = false,
                })
                balancer.rewrite()

Но все равно ничего относительно debug_connection в блоке events:

events {
    multi_accept        on;
    worker_connections  16384;
    use                 epoll;
}

Как вставить debug_connection в контекст событий?


person Luigi Sambolino    schedule 22.05.2020    source источник
comment
Пробовали ли вы что-нибудь из устранения неполадок шаги?   -  person hdhruna    schedule 26.05.2020
comment
Привет, hdruna, спасибо за поддержку. Шаги по устранению неполадок кажутся мне лучшими практиками в решении проблем (которые мы используем, но по отдельным темам). Здесь возникает вопрос: как правильно отлаживать соединение с определенного IP-адреса в контексте входа nginx + (заголовок мне кажется понятным).   -  person Luigi Sambolino    schedule 26.05.2020
comment
Похоже, вам нужно использовать main-template вместо ingress-template, поскольку events является частью основной конфигурации NGINX. См. Файл шаблона Nginx на github. com / nginxinc / kubernetes-ingress / blob / v1.7.0 / internal /   -  person hdhruna    schedule 26.05.2020


Ответы (1)


Для тех, кто может столкнуться с подобными проблемами, мне действительно удалось это сделать:

  1. Создание ConfigMap с новым файлом шаблона входящего контроллера (nginx.tmpl), содержащим строку debug_connection (дважды проверьте здесь версию входящего контроллера, файл кардинально изменится)
  2. Создание тома, который ссылается на карту конфигурации (с указанием тома и объема)
  3. Создание InitContainer, который копирует содержимое тома в / etc / nginx / template (это было необходимо для решения проблем, связанных, вероятно, с разрешениями) перед запуском контейнера.

Для пунктов 2 и 3 вы можете добавить соответствующий код в конец кода deployment или pod, я поделюсь примером:

     volumes:
        - name: nginxconf2
          configMap:
            name: nginxconf2
            items:
            - key: nginx.tmpl
              path: nginx.tmpl       
      initContainers:
      - name: copy-configs
        image: {{ kubernetes.ingress_nginx.image }}
        volumeMounts:
        - mountPath: /nginx
          name: nginxconf2
        command: ['sh', '-c', 'cp -R /nginx/ /etc/nginx/template/']
person Luigi Sambolino    schedule 01.06.2020