В Kubernetes, интегрированном с облаком Oxide, пользователи ждут от Service типа LoadBalancer стандартного поведения: создал объект — облачный провайдер поднял инфраструктуру и опубликовал адрес в статусе. Oxide же собственного балансировщика пока не предлагает. Зато у него есть floating IP — адреса из внешних пулов стойки, которые можно прикреплять к инстансам и откреплять, открывая доступ к ним снаружи VPC. Их и решили использовать.
Floating IP доставляет трафик на один узел Kubernetes, а Service dataplane распределяет его по нужным подам. Но для инстанса эти IP прозрачны: Oxide переписывает адрес назначения входящего трафика на внутренний IP инстанса, и в самом инстансе нет интерфейса с floating IP. Трафик идёт так: клиент шлёт запрос на floating IP 45.154.216.233:80; сеть Oxide меняет адрес назначения на внутренний IP 172.30.0.5:80; узел Kubernetes получает пакет на внутреннем IP; Service dataplane выбирает endpoint; под принимает трафик на целевом порту.
Из-за переписывания адреса dataplane должен считать внутренний IP узла фронтендом Service: именно этот адрес реально есть в пакете. Поэтому сервисный контроллер публикует в status.loadBalancer.ingress две записи: floating IP с ipMode: Proxy и внутренний IP узла с ipMode: VIP. kubectl get service nginx показывает в колонке EXTERNAL-IP обе записи — 45.154.216.233 и 172.30.0.5, хотя снаружи доступен только floating IP. Абстракция получается не идеальная, но зато поддерживается привычный Kubernetes workflow, пока нет нативного балансировщика Oxide.
Сейчас реализация работает с externalTrafficPolicy: Cluster: выбранный узел может переслать трафик на endpoint в любом месте кластера. Если узел пропадает, CCM переносит floating IP на другой подходящий узел и обновляет внутренний адрес в статусе Service. Когда Oxide добавит нативный load-balancing сервис, сервисный контроллер можно будет переключить на него, не меняя интерфейс Kubernetes. Пользователи продолжат создавать те же LoadBalancer-сервисы — поменяется только инфраструктура за ними. Инструкция по установке Oxide CCM — в гайде CCM.