Nginx-Ingress magic

Два дня мучился с вопросом

“а почему я не вижу IP клиента в логах Nginx, а все запросы идут от адреса cni0 интерфейса” (судя по твиттеру, я не один).

Так начался весёлый путь в недра Kubernetes, iptables и остальных не очень весёлых вещей.
Массовый “гуглёж” выводил на решение проблем с облачными провайдерами и никак не работало на локальной Kubernetes инсталяции.
В резулетате, методом перебора, была найдена “магия” которая работает не понятно как но на удивление работает :)

И так, магия под катом :)

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  externalIPs: ["X.X.X.X"]
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 32081 # <-- Любой номер порта отличный от указанного в nodePort
      targetPort: 80
      nodePort: 32080
    - name: https
      port: 32444 # <-- Любой номер порта отличный от указанного в nodePort
      targetPort: 443
      nodePort: 32443

При таком “конфиге” сервиса, на ноде (в моём случае она мастер и вообще одинока) будет открыто два порта для каждого порта, к примеру 32081/32080 для http. Любой трафик пришедшия на порт указанный в port будет “кривым” и в логах с аресом cni0 (да здравствует sourceNAT), а вот весь трафик пришедший на nodePort будет иметь корректные IP клиентов.
Почему это работает так, я не разобрался и не думаю что очень хочу (вру, хочу, но лень - точнее устал от этой части кубера), но учитывайте что это “магия” и магия может сломаться :)

P.S. Что-бы не мучаться с локальной отдалкой и не писать в адресной строке что-то типо “https://{node_ip}:32444”, можно в port прописать 80443, тогда в логах будет адрес cni0 интерефейса, но это-же локальная штука и так понятно что это мы :)