Два дня мучился с вопросом
“а почему я не вижу 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
прописать 80⁄443, тогда в логах будет адрес cni0
интерефейса, но это-же локальная штука и так понятно что это мы :)