Использовать PROXY-протокол в кластере Managed Kubernetes для Ingress Controller Traefik
Настроить использование PROXY-протокола можно в существующем балансировщике.
Если вы подключаетесь к поду через балансировщик c правилом TCP → PROXY, в логах пода будет указан реальный IP-адрес подключающегося, а не адрес балансировщика.
-
Убедитесь, что версия кластера Managed Kubernetes 1.21.10 или выше:
kubectl versionВы можете обновить версию кластера.
-
Получите значения Ingress Controller Traefik и сохраните их в файл
values.yaml:helm inspect values traefik/traefik > values.yaml -
В файл
values.yamlвнесите изменения:4.1. В блок
annotationsдобавьтеloadbalancer.openstack.org/proxy-protocol: "true".4.2. Опционально: чтобы разрешить подключение без TLS-сертификата, в блок
proxyProtocolдобавьтеinsecure: true.4.3. Сохраните изменения.
-
Обновите Ingress Controller Traefik:
helm upgrade traefik traefik/traefik --values values.yaml -
Создайте тестовый объект Deployment echo-сервера. Например:
cat <<EOF | kubectl apply -f -apiVersion: apps/v1kind: Deploymentmetadata:name: echoservernamespace: defaultlabels:app: echoserverspec:replicas: 1selector:matchLabels:app: echoservertemplate:metadata:labels:app: echoserverspec:containers:- name: echoserverimage: gcr.io/google-containers/echoserver:1.10imagePullPolicy: IfNotPresentports:- containerPort: 8080EOF -
Создайте объект Service типа ClusterIP для echo-сервера:
kubectl expose deployment echoserver --type=ClusterIP --target-port=8080 -
Создайте объект Ingress для echo-сервера. Например:
cat <<EOF | kubectl apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: test-proxy-protocolnamespace: defaultannotations:traefik.ingress.kubernetes.io/router.entrypoints: webspec:ingressClassName: "traefik"rules:- host: test.comhttp:paths:- path: /pingpathType: Exactbackend:service:name: echoserverport:number: 8080EOF -
Проверьте объект Ingress:
kubectl get ingВ ответе появится информация об объекте Ingress. IP-адрес может появиться не сразу. Например:
NAME CLASS HOSTS ADDRESS PORTS AGEtest-proxy-protocol traefik test.com 123.123.123.123 80 5s -
Проверьте соединение:
ip=123.123.123.123.nip.iocurl -sH 'Host: test.com' http://$ip/ping | sed '/^\s*$/d'В ответе появится информация о соединении. Например:
Hostname: echoserver-78d689cddd-5bmnkPod Information:-no pod information available-Server values:server_version=nginx: 1.13.3 - lua: 10008Request Information:client_address=10.10.246.7method=GETreal path=/pingquery=request_version=1.1request_scheme=httprequest_uri=http://test.com:8080/pingRequest Headers:accept=*/*accept-encoding=gziphost=test.comuser-agent=curl/8.7.1x-forwarded-for=<xxx>x-forwarded-host=test.comx-forwarded-port=80x-forwarded-proto=httpx-forwarded-server=traefik-54dc77dc47-zd8pxx-real-ip=<xxx>Request Body:-no body in request-