Кубернетес не сохранил источник ip

Я установил kubernetes 1.2.0 со следующей конфигурацией

export nodes="user@10.0.0.30 user@10.0.0.32"
export role="ai i"
export NUM_NODES=2
export SERVICE_CLUSTER_IP_RANGE=192.168.3.0/24
export FLANNEL_NET=172.16.0.0/16
export KUBE_PROXY_EXTRA_OPTS="--proxy-mode=iptables"

Я создал модуль nginx и выставляю с балансировщиком нагрузки и внешним IP-адресом

kubectl expose pod my-nginx-3800858182-6qhap --external-ip=10.0.0.50 --port=80 --target-port=80

Я использую kubernetes на голом металле, поэтому я назначил 10.0.0.50 ip мастер-узлу.

Если я попробую curl 10.0.0.50 (из-за пределов kubernetes) и использую tcpdump на модуле nginx, я увижу трафик, исходный ip всегда будет от главного узла kubernetes

17:30:55.470230 IP 172.16.60.1.43030 > 172.16.60.2.80: ...
17:30:55.470343 IP 172.16.60.2.80 > 172.16.60.1.43030: ...

я использую mode-proxy=iptables. и нужно получить фактический источник IP. Что я делаю неправильно?

2 ответа

Вы не делаете ничего плохого, к сожалению. Это артефакт того, как пакеты передаются с компьютера, который принимает их, в целевой контейнер.

Было много дискуссий вокруг этой проблемы в очень длинной проблеме Github, но пока не найдено решений, кроме запуска вашего балансировщика внешней нагрузки за пределами кластера Kubernetes (например, использование облачного балансировщика нагрузки, к которому подключен X-FORWARDED- ЗА заголовок).

Это было добавлено в качестве аннотации в Kubernetes 1.5 (документы здесь).

В версии 1.7 он перешел к GA, поэтому вы можете указать политику балансировки нагрузки для службы с помощью spec.externalTrafficPolicy поле (документы здесь):

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "example-service",
  },
  "spec": {
    "ports": [{
      "port": 8765,
      "targetPort": 9376
    }],
    "selector": {
      "app": "example"
    },
    "type": "LoadBalancer",
    "externalTrafficPolicy": "Local"
  }
}
Другие вопросы по тегам