Keycloak и Docker Swarm redirect l oop с репликами - PullRequest
1 голос
/ 24 февраля 2020
version: '3.7'
services:
  shinyproxy:
    build: /home/administrator/shinyproxy
    deploy: 
      replicas: 3
      #placement: 
        #constraints: 
          #- node.hostname==node1
    user: root:root
    hostname: shinyproxy
    image: localhost:5000/shinyproxy-example
    networks:
      - sp-example-net
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /home/administrator/shinyproxy/application.yml
        target: /opt/shinyproxy/application.yml  
    ports:
      - 4000:4000
  mariadb:
    image: mariadb
    networks:
      - sp-example-net
    volumes:
      - type: bind
        source: /home/administrator/mariadbdata
        target: /var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: password
    deploy: 
      placement: 
        constraints: 
          - node.hostname==spm1anadev1 
  keycloak:
    image: jboss/keycloak
    networks:
      - sp-example-net
    volumes:
      - type: bind
        source: /home/administrator/certs/fullchain.pem
        target: /etc/x509/https/tls.crt
      - type: bind
        source: /home/administrator/certs//privkey.pem
        target: /etc/x509/https/tls.key
      #- /theme/govuk-social-providers/:/opt/jboss/keycloak/themes/govuk-social-providers/
    environment:
      - PROXY_ADDRESS_FORWARDING=true
      - KEYCLOAK_USER=myadmin
      - KEYCLOAK_PASSWORD=mypassword
    ports:
      - 8443:8443
    deploy: 
      placement: 
        constraints: 
          - node.hostname==node1


networks:
  sp-example-net:
    driver: overlay
    attachable: true

Я использую следующую настройку для моего docker -warm кластера. Развертывание работает нормально, но когда я создаю 3 реплики моей службыinyproxy, я заканчиваю перенаправление l oop. Проблема может заключаться в том, что keycloak не знает, из какой реплики службы происходит перенаправление, поэтому я получаю отправку взад и вперед от экземпляраinyproxy до аутентификации keycloak.

Полагаю, я не первый, кто сталкивается с этой проблемой, но я не нашел решения для этого. Кто-нибудь может мне помочь?

Спасибо!

Редактировать: я использую следующий Dockerfile для создания моего сервиса Shinyproxy.

FROM openjdk:8-jre

COPY certificate.pfx $JAVA_HOME/jre/lib/security/certificate.pfx

RUN \
    cd $JAVA_HOME/jre/lib/security \
    keytool -importkeystore -srckeystore certificate.pfx -srcstorepass -changeit -srcstoretype pkcs12 -destkeystore cacerts -deststorepass changeit -deststoretype JKS

RUN mkdir -p /opt/shinyproxy/
RUN wget https://www.shinyproxy.io/downloads/shinyproxy-2.3.0.jar -O /opt/shinyproxy/shinyproxy.jar
COPY application.yml /opt/shinyproxy/application.yml
COPY templates /opt/shinyproxy/templates

WORKDIR /opt/shinyproxy/
CMD ["java", "-jar", "/opt/shinyproxy/shinyproxy.jar"]

Этот сервис также использует файл application.yml, который использует секретные данные ключей ключей для аутентификации:

proxy:
  port: 4000
  template-path: /opt/shinyproxy/templates/2col
  authentication: keycloak
  admin-groups: admins
  container-backend: docker-swarm
  docker:
      internal-networking: true
      container-network: test_sp-example-net
  specs:
  - id: 01_hello
    display-name: Hello Application
    description: Application which demonstrates the basics of a Shiny app
    container-cmd: ["R", "-e", "shinyproxy::run_01_hello()"]
    container-image: openanalytics/shinyproxy-demo
    container-network: "${proxy.docker.container-network}"
    access-groups: test
  - id: euler
    display-name: Euler's number
    container-cmd: ["R", "-e", "shiny::runApp('/root/euler')"]
    container-image: euler-docker
    container-network: "${proxy.docker.container-network}"
    access-groups: test
  keycloak:
      realm: master
      auth-server-url: https://analytics.data-mastery.com/auth/
      resource: shinyoid
      credentials-secret: xxx


logging:
  file:
    shinyproxy.log

1 Ответ

1 голос
/ 02 марта 2020

https://support.openanalytics.eu/t/setting-kubernetes-pod-fields-and-using-multiple-replica-sets/783/2

ShinyProxy - это приложение с состоянием

Приложение с состоянием = каждый контейнер блестящего прокси управляет собственным состоянием. Поэтому, когда вы вошли в первую реплику, вторая / третья реплики не знают об этом -> они перенаправляют браузер на Keycloak. Уже открыт сеанс IDP, поэтому Keycloak перенаправляет с ответом кода авторизации немедленно. Однако этот код авторизации может быть обработан другим контейнером ->, так что будет происходить перенаправление снова и снова. Только потому, что блестящие прокси не разделяют одно состояние, но каждая реплика имеет собственное состояние.

Если вам нужно горизонтальное масштабирование, используйте липкий сеанс (например, traefik перед службой Shinyproxy - ссылка ) поэтому каждый запрос будет обрабатываться одной и той же репликой блестящего прокси. В противном случае масштабируйте глянцевый прокси по вертикали (больше ресурсов процессора / памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...