Использовать PROXY-протокол в кластере Managed Kubernetes
PROXY-протокол работает корректно только с кластерами Managed Kubernetes версии 1.21.10 или выше. Вы можете обновить версию кластера.
Это инструкция для настройки доступа через Ingress Controller Nginx.
-
Скачайте манифест ingresscontroller.yaml.
-
Внесите изменения в поля манифеста, которые отмечены тегом
[EDIT]:- включите PROXY-протокол:
config:use-proxy-protocol: true- создайте Service с параметрами:
type: LoadBalancerexternalTrafficPolicy: Clusterannotations:loadbalancer.openstack.org/proxy-protocol: "true"Не изменяйте значение параметра
externalTrafficPolicy. -
Опционально: добавьте репозиторий ingress-nginx в Helm и обновите его:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo update -
Создайте Ingress Controller с помощью манифеста из шага 1:
helm install ingress-nginx/ingress-nginx --values ingresscontroller.yaml --generate-name -
Проверьте, что Ingress Controller установлен:
kubectl get svcВ выводе команды должен быть внешний IP-адрес с суффиксом nip.io:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx-ingress LoadBalancer 10.100.100.100 123.123.123.123.nip.io 80:31039/TCP,443:31667/TCP 103s -
Создайте тестовый 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 для echo-сервера:
kubectl expose deployment echoserver --type=ClusterIP --target-port=8080 -
Создайте правило Ingress для Service echo-сервера:
cat <<EOF | kubectl apply -f -apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: test-proxy-protocolnamespace: defaultspec:ingressClassName: "nginx"rules:- host: test.comhttp:paths:- path: /pingpathType: Exactbackend:service:name: echoserverport:number: 8080EOF -
Проверьте Ingress:
kubectl get ingВывод команды (IP-адрес может появиться спустя время):
NAME HOSTS ADDRESS PORTS AGEtest-proxy-protocol test.com 123.123.123.123.nip.io 80 2s -
Проверьте соединение:
ip=123.123.123.123.nip.iocurl -sH 'Host: test.com' http://$ip/ping | sed '/^\s*$/d'Вывод команды:
Hostname: echoserver-5c79dc5747-txwnzPod Information:-no pod information available-Server values:server_version=nginx: 1.13.3 - lua: 10008Request Information:client_address=10.10.10.31method=GETreal path=/pingquery=request_version=1.1request_scheme=httprequest_uri=http://test.com:8080/pingRequest Headers:accept=*/*connection=closehost=test.comuser-agent=curl/7.74.0x-forwarded-for=<xxx>x-forwarded-host=test.comx-forwarded-port=80x-forwarded-proto=httpx-real-ip=<xxx>Request Body:-no body in request-