在 Traefik 背后部署 OpenSearch

问题描述 投票:0回答:1

我正在尝试在反向代理(Traefik)后面部署 OpenSearch。我正在使用 docker 和 docker-compose 来实现此目的。我在 OpenSearch Dashboards 方面取得了成功。因此我觉得我已经接近解决方案了,但肯定还缺少一些东西。

问题是,我想更改管理员密码,为此我需要启用安全插件(如果没有,任何人都可以连接到它)。但如果我启用它,OpenSearch 会强制我使用 SSL 进行连接。如果我有 SSL 连接,我需要生成证书,但 Traefik 和 OpenSearch 之间的连接会导致下一个错误:

DecoderException: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS

我理解,有意义(也是我想要的)的架构是 Traefik 处理 SSL 连接,使用服务器域自动更新证书。在内部,traefik 不使用 SSL 与 OpenSearch 进行普通连接。

我发现 Elastic Search 允许禁用 SSL 连接并仍然启用其他安全功能,但我没有发现任何类似于 OpenSearch 的内容。

我在 OpenSearch 上使用“SERVER_BASEPATH”和“SERVER_REWRITEBASEPATH”。我在 OpenSearch 仪表板上找到了此信息,并且似乎该信息也适用于 OpenSearch,因为流量已正确重定向。

docker-compose 文件:

  opensearch-node1: 
    image: opensearchproject/opensearch:latest
    container_name: opensearch-node1
    restart: always
    environment:
      - TZ=Europe/Madrid
      - cluster.name=opensearch-cluster 
      - node.name=opensearch-node1 
      - discovery.seed_hosts=opensearch-node1
      - cluster.initial_cluster_manager_nodes=opensearch-node1
      - http.port=9200
      - bootstrap.memory_lock=true
      - DISABLE_INSTALL_DEMO_CONFIG=true
      - "OPENSEARCH_JAVA_OPTS=-Xms1024m -Xmx1024m"
      - "OPENSEARCH_INITIAL_ADMIN_PASSWORD=${adminPassword}"
      # - "DISABLE_SECURITY_PLUGIN=true"
      - plugins.security.ssl.transport.enforce_hostname_verification=false
      - plugins.security.ssl.transport.enabled=true
      - plugins.security.ssl.transport.pemkey_filepath=certs/admin-key.pem
      - plugins.security.ssl.transport.pemcert_filepath=certs/admin.pem
      - plugins.security.ssl.transport.pemtrustedcas_filepath=certs/root-ca.pem
      - plugins.security.ssl.http.enabled=true
      - plugins.security.ssl.http.pemkey_filepath=certs/admin-key.pem
      - plugins.security.ssl.http.pemcert_filepath=certs/admin.pem
      - plugins.security.ssl.http.pemtrustedcas_filepath=certs/root-ca.pem
      - "SERVER_BASEPATH=/opensearch"
      - "SERVER_REWRITEBASEPATH=true"
    labels:
      - "traefik.enable=true"
      - "traefik.backend=opensearch-node1"
      - "traefik.http.routers.opensearch.entrypoints=https"
      - "traefik.http.routers.opensearch.tls.certresolver=https"
      - "traefik.http.routers.opensearch.rule=(Host(`${machine_domain}`) && PathPrefix(`/opensearch`))"
      - "traefik.docker.network=containers"
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
      - ./certs:/usr/share/opensearch/config/certs:ro
    ports:
      - 9200:9200 # REST API
      - 9600:9600 # Performance Analyzer
    expose:
      - 9200
    networks:
      - containers

目前,Traefik 正在将流量从

my.domain.com/opensearch
正确重定向到 OpenSearch docker 容器。但 OpenSearch 拒绝了:

我想要实现的目标:

  • 在 Traefik 后面运行 OpenSearch。这简化了我在多个服务器上部署时的配置。
  • 尽可能避免在 OpenSearch 上生成自定义证书,因为 Traefik 可以完美处理它们。
  • 避免使用特定端口和/或子域。

我测试过的:

  • 禁用安全插件。这允许对系统的任何访问。
  • 在 OpenSearch 上创建自定义证书。如上所述,此后我无法将 Traefik 与 OpenSearch 连接。
  • 启用安全插件,但使用
    plugins.security.ssl.http.enabled
    禁用 ssl。安全插件抱怨并且服务器无法启动。
  • 尝试重用 Traefik 中的“acme.json”来获取 OpenSearch 的证书。这不是完美的解决方案,但可以帮助解决问题的某些部分。
docker ssl traefik opensearch
1个回答
0
投票

尝试设置目标服务端口,镜像可能会暴露多个,明确告诉Traefik使用哪一个,例如:

  whoami:
    image: traefik/whoami:v1.8
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.mywhoami.rule=Host(`whoami.example.com`) || Host(`www.whoami.example.com`)
      - traefik.http.services.mywhoami.loadbalancer.server.port=80

如果您的目标服务的自定义 TLS 证书存在问题,您可以在 Traefik 静态配置中全局设置

insecureSkipVerify
或在您的个人 Traefik 服务中设置
serversTaransport

© www.soinside.com 2019 - 2024. All rights reserved.