Maxim
пример:
Maxim
$ knife ssh "name:web0*" "sudo iptables-save |grep 10.222.222.222" web02-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4 web02-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU web01-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU web01-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4 web04-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4 web04-amplifr-ru.singlehop.infra.evilmartians.com -A KUBE-SERVICES -d 10.222.222.222/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
Maxim
$ knife ssh "name:web0*" "ip a|grep 10.222.222.222" $
Maxim
@SinTeZoiD ^^^
Maxim
вот в моем случае 10.222.222.222 - это clusterip
Михаил
и вот эти адреса не терминируются вообоще нигде, у них нет "физического" воплощения
Михаил
ё
Михаил
оок, давайте теперь про router
Михаил
куда должен роутить haproxy
Михаил
в pod?
Maxim
$ kubectl get svc --namespace=kube-system kube-dns NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns 10.222.222.222 <none> 53/UDP,53/TCP 51d
Maxim
все эти iptables-правила выше менеджатся процессами kube-proxy на хостах
Maxim
куда должен роутить haproxy
в сервис а сервис - это тот самый эфемерный кластерайпи
Михаил
ок, а из сервиса до пода как оно идёт? через правила iptables ?
Maxim
дада
Maxim
сервис "знает", какие "физические" адреса принадлежат его подам
Maxim
через ендпойнты
Maxim
$ kubectl get ep --namespace=kube-system kube-dns NAME ENDPOINTS AGE kube-dns 192.168.160.1:53,192.168.160.1:53 51d
Maxim
вот 192.168.160.1 - это уже "физический" адрес
Maxim
и ты из хапрокси можешь придти и прямо к нему тоже
Maxim
но если у тебя куча реплик одного пода, то описывать это в хапрокси бессмысленно
Maxim
кубернетес это сделал за тебя
Михаил
и ты из хапрокси можешь придти и прямо к нему тоже
но правильнее прийти к сервису и через него средствами iptables прийти в pod ?
Maxim
с помощью сервиса с кластер-айпи
Михаил
так, стало лучше) Спасибо!
Maxim
$ kubectl get svc --namespace=apps preview NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE preview 10.222.118.166 <none> 8081/TCP 90d
Михаил
хотя бы в общих чертах понятнее
Maxim
$ kubectl get ep --namespace=apps preview NAME ENDPOINTS AGE preview 192.168.160.3:8081,192.168.224.4:8081 90d
Maxim
вот видишь
Maxim
тут сервис один, а пода - два
Maxim
и у каждого пода свой айпишник
Maxim
как ты их будешь в хапрокси искать?
Михаил
теперь мне уже интересно, а как оно между подами рулится? всмысле какой куда
Maxim
не понял вопроса
Михаил
ну вот ты долбишься в сервис например mariadb 3306 в какой под оно уйдет
Михаил
или я че-то еще не понял
Maxim
в любой
Maxim
если их больше одного
Maxim
ну вот если я постучу в preview.apps.svc.kubernetes.local:8081, то оно уйдет ЛИБО в 192.168.160.3:8081, ЛИБО в 192.168.224.4:8081
Михаил
ок, mariadb.myservice.local myservice.local это у меня главная нода, а mariadb.myservice.local тоже должен стучаться в главную ноду?
Михаил
и оттуда уже в ноду на которой под?
Maxim
нет
Maxim
ноды здесь вообще не причем
Maxim
все сервисы "routable" на всех нодах, где есть процесс kube-proxy
Maxim
ну то есть неважно на какой ноде ты постучишь в mariadb.<namespace>.svc.<cluster-name>:3306
Maxim
оно пойдет к какому-то из подов, с которыми связан этот сервис
Maxim
сначала днс выдаст тебе айпишик сервиса mariadb.<namespace>.svc.<cluster-name>
Maxim
потом через ряд цепочек айпитаблес ты попадешь в порт 3306 на одном из подов
Михаил
ок, как мне правильно прописать dns что бы я долбился на mariadb.<namespace>,svc.<cluster-name>
Maxim
?
Михаил
ну то есть вот я пишу со своего компа запрос mariadb.<namespace>,svc.<cluster-name> как он должен правильно отрезолвится
Михаил
во что
Maxim
# dig @10.222.222.222 preview.apps.svc.kubernetes.local +short 10.222.118.166
Maxim
ну ты со своего компа должен иметь доступ к kube-dns по порту 53
Михаил
ага, спасибо большое!
Maxim
то есть вот я выше там показывал, что у сервиса preview два пода
Maxim
путь к ним выглядит так:
Maxim
адрес сервиса: # dig @10.222.222.222 preview.apps.svc.kubernetes.local +short 10.222.118.166 цепочка сервиса: # iptables-save | grep 10.222.118.166 -A KUBE-SERVICES -d 10.222.118.166/32 -p tcp -m comment --comment "apps/preview:preview-port cluster IP" -m tcp --dport 8081 -j KUBE-SVC-HUK3B4EWTJRXREKD поды: # iptables-save | grep KUBE-SVC-HUK3B4EWTJRXREKD :KUBE-SVC-HUK3B4EWTJRXREKD - [0:0] -A KUBE-SERVICES -d 10.222.118.166/32 -p tcp -m comment --comment "apps/preview:preview-port cluster IP" -m tcp --dport 8081 -j KUBE-SVC-HUK3B4EWTJRXREKD -A KUBE-SVC-HUK3B4EWTJRXREKD -m comment --comment "apps/preview:preview-port" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-FKNIPTZJYNJ3PO4C -A KUBE-SVC-HUK3B4EWTJRXREKD -m comment --comment "apps/preview:preview-port" -j KUBE-SEP-EUJT5BGXMZWIKAQE
Maxim
таким образом, с вероятностью 0.50000000000 мы попадаем либо в цепочку KUBE-SEP-FKNIPTZJYNJ3PO4C, либо в KUBE-SEP-EUJT5BGXMZWIKAQE
Maxim
и вот эти цепочки ведут уже к "физическому" поду:
Maxim
# iptables-save | grep KUBE-SEP-FKNIPTZJYNJ3PO4C :KUBE-SEP-FKNIPTZJYNJ3PO4C - [0:0] -A KUBE-SEP-FKNIPTZJYNJ3PO4C -s 192.168.160.3/32 -m comment --comment "apps/preview:preview-port" -j KUBE-MARK-MASQ -A KUBE-SEP-FKNIPTZJYNJ3PO4C -p tcp -m comment --comment "apps/preview:preview-port" -m tcp -j DNAT --to-destination 192.168.160.3:8081
Maxim
через эту мы приходим к 192.168.160.3:8081
Maxim
через вторую, соответственно, ко второму поду
Maxim
@SinTeZoiD сложилось?
Михаил
ага
Михаил
ушёл искать косяки)
Михаил
точнее сначала обедать, потом искать)
Михаил
Если что еще спрошу)
Maxim
ВСЕ эти цепочки формирует kube-proxy
Maxim
если на каком-то хосте он не запущен, то и правил не будет
Maxim
ну и к подам ты не попадешь, соответственно
Maxim
[естественно ничто не мешает все эти правила руками прописать без всяких kube-proxy. какое-то время будет работать, очевидно]
Timur
эээ дык на cluster-ip можно попасть из кластера кубернетса, а не из внешнего ha-proxy
Maxim
teamur а что мешает внешнему хапрокси быть в той же сети?
Maxim
или у тебя кубернетес в одном DC, хапрокси в другом, а роутинга между ними нет?
Timur
просто в разных вланах
Maxim
ну в любом случае тебе нужно будет експозить кубернетес наружу-то
Maxim
просто в разных вланах
ну вот у тебя из дикого интернета приходит запрос к балансеру ему же нужно как-то пророутиться до кубернетеса-то за данными
Timur
ну пока видимл через всякие там ingress и шаблоны для nginx