Перейти к основному содержимому
Использовать PROXY-протокол
Последнее изменение:

Использовать PROXY-протокол

к сведению

PROXY-протокол работает корректно только с кластерами Managed Kubernetes версии 1.21.10 или выше. Вы можете обновить версию кластера.

  1. Скачайте манифест ingresscontroller.yaml.

  2. Внесите изменения в поля манифеста, которые отмечены тегом [EDIT]:

    • включите PROXY-протокол:
    entries:
    proxy-protocol: "true"
    • создайте Service с параметрами:
    type: LoadBalancer
    externalTrafficPolicy: Cluster
    annotations:
    loadbalancer.openstack.org/proxy-protocol: "true"
  3. Установите менеджер пакетов Helm.

  4. Опционально: добавьте репозиторий ingress-nginx в Helm и обновите его:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
  5. Создайте Ingress Controller с помощью манифеста из шага 1:

    helm install ingress-nginx/ingress-nginx --values ingresscontroller.yaml --generate-name
  6. Проверьте, что Ingress Controller установлен:

    kubectl get svc

    В выводе команды должен быть внешний IP-адрес с суффиксом nip.io:

    NAME                  TYPE         CLUSTER-IP    EXTERNAL-IP          PORT(S)                    AGE
    ingress-nginx-ingress LoadBalancer 10.100.100.100 123.123.123.123.nip.io 80:31039/TCP,443:31667/TCP 103s
  7. Создайте тестовый 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
  8. Создайте Service для echo-сервера:

    kubectl expose deployment echoserver --type=ClusterIP --target-port=8080
  9. Создайте правило Ingress для Service echo-сервера:

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

    kubectl get ing

    Вывод команды (IP-адрес может появиться спустя время):

    NAME                HOSTS    ADDRESS                PORTS AGE
    test-proxy-protocol test.com 123.123.123.123.nip.io 80 2s
  11. Проверьте соединение:

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

    Вывод команды:

    Hostname: echoserver-5c79dc5747-txwnz
    Pod Information:
    -no pod information available-
    Server values:
    server_version=nginx: 1.13.3 - lua: 10008
    Request Information:
    client_address=10.10.10.31
    method=GET
    real path=/ping
    query=
    request_version=1.1
    request_scheme=http
    request_uri=http://test.com:8080/ping
    Request Headers:
    accept=*/*
    connection=close
    host=test.com
    user-agent=curl/7.74.0
    x-forwarded-for=<xxx>
    x-forwarded-host=test.com
    x-forwarded-port=80
    x-forwarded-proto=http
    x-real-ip=<xxx>
    Request Body:
    -no body in request-