Перейти к основному содержимому

Использовать PROXY-протокол в кластере Managed Kubernetes для Ingress Controller Traefik

Настроить использование PROXY-протокола можно в существующем балансировщике.

Если вы подключаетесь к поду через балансировщик c правилом TCP → PROXY, в логах пода будет указан реальный IP-адрес подключающегося, а не адрес балансировщика.

  1. Убедитесь, что версия кластера Managed Kubernetes 1.21.10 или выше:

    kubectl version

    Вы можете обновить версию кластера.

  2. Подключитесь к кластеру.

  3. Получите значения Ingress Controller Traefik и сохраните их в файл values.yaml:

    helm inspect values traefik/traefik > values.yaml
  4. В файл values.yaml внесите изменения:

    4.1. В блок annotations добавьте loadbalancer.openstack.org/proxy-protocol: "true".

    4.2. Опционально: чтобы разрешить подключение без TLS-сертификата, в блок proxyProtocol добавьте insecure: true.

    4.3. Сохраните изменения.

  5. Обновите Ingress Controller Traefik:

    helm upgrade traefik traefik/traefik --values values.yaml
  6. Создайте тестовый объект Deployment echo-сервера. Например:

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: echoserver
    namespace: default
    labels:
    app: echoserver
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: echoserver
    template:
    metadata:
    labels:
    app: echoserver
    spec:
    containers:
    - name: echoserver
    image: gcr.io/google-containers/echoserver:1.10
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    EOF
  7. Создайте объект Service типа ClusterIP для echo-сервера:

    kubectl expose deployment echoserver --type=ClusterIP --target-port=8080
  8. Создайте объект Ingress для echo-сервера. Например:

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: test-proxy-protocol
    namespace: default
    annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
    spec:
    ingressClassName: "traefik"
    rules:
    - host: test.com
    http:
    paths:
    - path: /ping
    pathType: Exact
    backend:
    service:
    name: echoserver
    port:
    number: 8080
    EOF
  9. Проверьте объект Ingress:

    kubectl get ing

    В ответе появится информация об объекте Ingress. IP-адрес может появиться не сразу. Например:

    NAME CLASS HOSTS ADDRESS PORTS AGE
    test-proxy-protocol traefik test.com 123.123.123.123 80 5s
  10. Проверьте соединение:

    ip=123.123.123.123.nip.io
    curl -sH 'Host: test.com' http://$ip/ping | sed '/^\s*$/d'

    В ответе появится информация о соединении. Например:

    Hostname: echoserver-78d689cddd-5bmnk
    Pod Information:
    -no pod information available-
    Server values:
    server_version=nginx: 1.13.3 - lua: 10008
    Request Information:
    client_address=10.10.246.7
    method=GET
    real path=/ping
    query=
    request_version=1.1
    request_scheme=http
    request_uri=http://test.com:8080/ping
    Request Headers:
    accept=*/*
    accept-encoding=gzip
    host=test.com
    user-agent=curl/8.7.1
    x-forwarded-for=<xxx>
    x-forwarded-host=test.com
    x-forwarded-port=80
    x-forwarded-proto=http
    x-forwarded-server=traefik-54dc77dc47-zd8px
    x-real-ip=<xxx>
    Request Body:
    -no body in request-