Proxy mesh в Kubernetes: Tor exit nodes и гео-маршрутизация через hola-proxy
Published: 2026-04-19
В кластере infra работает namespace proxy с двумя видами исходящих прокси: кластер Tor с ротацией exit node и экземпляры hola-proxy, которые туннелируют трафик через residential IP в конкретных странах.
Namespace proxy
namespace: proxy
├── tor-proxy ← rotating-tor-http-proxy (HAProxy + N Tor-цепочек)
├── hola-proxy-jp ← японский exit node через Hola peer network
├── hola-proxy-sg ← сингапурский exit node
└── hola-proxy-au ← австралийский exit node
Все прокси слушают на порту 8080 внутри кластера. Внешний доступ — через маршруты APISIX или напрямую по VPN.
Tor rotating proxy
Использует zhaow-de/rotating-tor-http-proxy — контейнер, запускающий N пар Privoxy+Tor за HAProxy. Каждая цепочка — отдельная Tor-идентичность, HAProxy выбирает их по round-robin.
yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: tor-proxy
namespace: proxy
spec:
replicas: 1
template:
spec:
containers:
- name: tor-proxy
image: registry.example.com/docker/proxy/rotating-tor-http-proxy:latest
env:
- name: TOR_INSTANCES
value: "10"
ports:
- containerPort: 30118 # порт HAProxy frontend
resources:
requests:
memory: "512Mi"
cpu: "200m"
limits:
memory: "1Gi"
cpu: "500m"
10 экземпляров Tor = 10 одновременных цепочек, round-robin. Каждый запрос получает другой IP exit node. Контейнер открывает HAProxy на порту 30118.
Экземпляры hola-proxy (маршрутизация через Tor)
Каждая страна — отдельный Deployment. hola-proxy направляет трафик через Tor-прокси для анонимизации:
yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: hola-proxy-jp
namespace: proxy
spec:
replicas: 1
template:
spec:
containers:
- name: hola-proxy-jp
image: registry.example.com/docker/proxy/hola-proxy:latest
args:
- -bind-address
- 0.0.0.0:8080
- -country
- jp
- -proxy
- http://tor-proxy.proxy.svc.cluster.local:30118
- -timeout
- 35s
- -verbosity
- "20"
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "300m"
startupProbe:
tcpSocket:
port: 8080
failureThreshold: 30
periodSeconds: 5
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 20
failureThreshold: 3
Hola использует P2P residential exit node. Tor анонимизирует подключение от кластера к Hola peer network.
startupProbe с 30 попытками (150 секунд суммарно) даёт hola-proxy время на установку первого peer-соединения.
Service
yamlapiVersion: v1
kind: Service
metadata:
name: hola-proxy-jp
namespace: proxy
spec:
type: ClusterIP
selector:
app: hola-proxy
country: jp
ports:
- name: http
port: 8080
targetPort: 8080
Аналогично для sg, au. Внутренний адрес: hola-proxy-jp.proxy.svc.cluster.local:8080.
Маршрут APISIX для внешнего доступа
Публикация прокси через APISIX (доступ по VPN):
yamlapiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: proxy-jp
namespace: proxy
spec:
http:
- name: proxy-jp
match:
hosts:
- proxy-jp.infra.example.com
paths:
- "/*"
backends:
- serviceName: hola-proxy-jp
servicePort: 8080
Почему сырые манифесты, а не HelmRelease
Deployments лежат в spoke/proxy/ как обычный YAML, а не как HelmRelease:
- Шаблонизация по окружениям не нужна — эти прокси существуют только на
infra - Страновые прокси не имеют смысла на
dev/test - Спецификация пода простая — сырой YAML читается чище, чем чарт с единственным шаблоном
Источник образа
Образ hola-proxy собирается из внутреннего GitLab-проекта и пушится в registry.example.com. Учётные данные для pull — из imagePullSecret gitlab-registry-docker (SealedSecret в spoke/secrets/).
Проверка состояния прокси
Проверить все поды прокси:
bashkubectl get pods -n proxy -o wide
Протестировать конкретный exit node:
bash# Тест японского IP
curl -x http://hola-proxy-jp.proxy.svc.cluster.local:8080 https://api.myip.com
# Тест Tor rotating proxy
curl -x http://tor-proxy.proxy.svc.cluster.local:30118 https://check.torproject.org/api/ip
Проверить логи на ошибки соединения:
bashkubectl logs -n proxy deployment/hola-proxy-jp -f