本教程适用于以下操作系统版本

  • Ubuntu 24.04(Noble Numbat)
  • Ubuntu 22.04(Jammy Jellyfish)

本页内容

  • 先决条件
  • 配置系统
  • 安装 Docker CE 和 Docker Compose
  • 下载 OpenSearch Docker 镜像
  • 创建项目目录
  • 生成 SSL/TLS 证书(生成 CA 证书、生成管理员证书、生成 OpenSearch Dashboards 证书、为 OpenSearch 节点生成证书)
  • 配置用户
  • 配置 docker-compose.yml 脚本
  • 配置 OpenSearch 和 OpenSearch Dashboards
  • 部署 OpenSearch 集群和 OpenSearch Dashboards
  • 访问 OpenSearch Dashboards
  • 结论
  • 生成 CA 证书
  • 生成管理员证书
  • 生成 OpenSearch Dashboards 证书
  • 为 OpenSearch 节点生成证书

OpenSearch 是由 Amazon 主导的社区驱动项目,是 Elasticsearch 和 Kibana 的一个分支。它是一套完全开源的搜索引擎与分析套件,具备丰富的功能与创新特性。OpenSearch 项目的主要组件是 OpenSearch(Elasticsearch 的分支)以及 OpenSearch Dashboards(Kibana 的分支)。这两个组件都提供了企业级安全、告警、机器学习、SQL、索引状态管理等功能。

OpenSearch 是百分之百开源的,采用 Apache 2.0 许可证。它让你可以轻松地对数据进行摄取、保护、搜索、聚合、查看和分析,适用于日志分析、应用搜索、企业搜索等多种使用场景。

在本教程中,你将在 Ubuntu 22.04 服务器上通过 Docker 安装并配置 OpenSearch(一套开源的搜索引擎与分析套件)以及 OpenSearch Dashboards(一个开源的可视化工具)。你将通过 Docker 和 Docker Compose 部署一个由多个容器组成的 OpenSearch 集群以及单个 OpenSearch Dashboard。你还将使用自定义 TLS 证书并启用身份认证与授权来保护你的部署。

本指南使用一台全新的通用 Ubuntu 服务器,因此本教程包含了在 Ubuntu 22.04 系统上安装 Docker 引擎和 Docker Compose 的步骤。

先决条件

要完成本指南,你必须满足以下要求:

  • 一台最低内存 4-8GB 的 Ubuntu 22.04 服务器——本示例使用了一台主机名为 ''、IP 地址为 '' 的 Ubuntu 服务器。
  • 一个具有 sudo/root 管理员权限的非 root 用户。

当这些要求准备就绪后,你就可以开始安装 OpenSearch 了。

配置系统

在第一步中,你将为 OpenSearch 部署准备 Ubuntu 系统。你需要禁用 SWAP(交换分区)和分页机制,然后通过 '/etc/sysctl.conf' 文件增大最大内存映射。

运行以下命令禁用系统上的交换分区。这里的 'sed' 命令会通过向 '/etc/fstab' 文件中交换分区配置行的开头添加注释 '#' 来永久禁用交换分区。'swapoff' 命令则会在当前会话中禁用交换分区。

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a

接下来,通过以下命令验证交换分区状态。如果已禁用,你应该在交换分区(swap)部分看到输出 '0'。

free -m

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

最后,你将向 '/etc/sysctl.conf' 文件添加配置,以增大 Ubuntu 系统上的最大内存映射。

运行以下命令,将参数 'vm.max_map_count=262144' 添加到 '/etc/sysctl.conf' 文件的行末。然后,通过 'sysctl -p' 命令使更改生效。

sudo echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sudo sysctl -p

现在运行以下命令验证最大内存映射。如果成功,你的最大内存映射值应为 '262144'。

cat /proc/sys/vm/max_map_count

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

在禁用交换分区并将最大内存映射增大到 '262144' 之后,接下来你将开始安装 Docker 引擎和 Docker Compose。

安装 Docker CE 和 Docker Compose

部署和安装 OpenSearch 有多种方式,你可以在虚拟机上以传统方式安装 OpenSearch,也可以在容器环境中安装。

如果你偏好在虚拟机上进行传统安装,可以通过 Tarball 压缩包手动安装 OpenSearch,或者通过包管理器(适用于基于 RHEL 的发行版)安装。若采用容器化部署,则可以通过 Docker 和 Kubernetes 安装 OpenSearch。

在本示例中,你将通过 Docker 引擎和 Docker Compose 在容器化环境中安装 OpenSearch。因此,接下来你将从容器的官方 Docker 仓库安装 Docker 软件包。

首先,运行以下 apt 命令安装基础依赖。当提示时输入 y 并按 ENTER 继续。

sudo apt install ca-certificates curl gnupg lsb-release

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

接下来,运行以下命令添加 Docker 软件包所需的 GPG 密钥和仓库。

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

之后,通过以下 apt 命令更新并刷新 Ubuntu 的软件包索引。

sudo apt update

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

添加 Docker 仓库后,你现在可以使用以下 apt 命令安装 Docker 引擎和 Docker Compose 插件。当提示时输入 y,然后按 ENTER 继续。

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

Docker 服务将自动启动并启用。你可以通过以下 systemctl 命令工具验证 Docker 服务。

sudo systemctl is-enabled docker
sudo systemctl status docker

你应该会看到 Docker 服务已启用,并会在系统启动时自动运行。同时 Docker 服务的状态为运行中(running)。

最后,为了让非 root 用户能够运行 Docker 容器,你必须将该用户添加到 'docker' 用户组。运行以下 usermod 命令将你的用户添加到 'docker' 用户组。同时,请务必将命令中的用户名替换为你自己的用户。

sudo usermod -aG docker alice

现在你可以以你的用户身份登录,并通过以下命令运行 Docker 容器。

su - alice
docker run hello-world

成功后,你应该会看到来自 Docker 容器的 hello-world 消息,如下图所示。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

下载 OpenSearch Docker 镜像

在这一步中,你将从 DockerHub 下载 OpenSearch 和 OpenSearch Dashboards 镜像。随后,你还会运行一个新的 OpenSearch 容器用于测试。

运行以下命令下载 OpenSearch 和 OpenSearch Dashboards 镜像。

docker pull opensearchproject/opensearch:latest
docker pull opensearchproject/opensearch-dashboards:latest

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

下载完成后,运行以下命令查看系统中的 Docker 镜像列表。你将看到 OpenSearch 和 OpenSearch Dashboards 镜像已经存在于你的系统中。

docker images

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

接下来,你也可以直接使用以下命令通过 Docker 运行 OpenSearch。这将以单节点模式创建并运行 OpenSearch 容器,并在宿主机上开放默认的 TCP 端口 9200 和 9600。

docker run -d -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" opensearchproject/opensearch:latest

通过以下 'docker ps' 命令验证正在运行的容器列表。

docker ps

你应该会看到类似这样的输出——OpenSearch 容器已创建并正在运行。容器和 Docker 宿主机上都开放了 TCP 端口 9200 和 9600。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

你可以通过下面的 curl 命令访问你的 OpenSearch 容器。OpenSearch 容器的默认用户名和密码均为 'admin'。

curl https://localhost:9200 -ku 'admin:admin'

成功后,你应该会看到类似这样的输出——OpenSearch 容器正在运行,并且可以通过 Docker 宿主机访问。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

现在你可以运行以下 'docker' 命令来停止并删除 OpenSearch 容器。因为在下一步中,你将通过 Docker Compose 创建 OpenSearch 集群。请务必将命令中的容器名称替换为你自己的容器名。

docker stop container-name or container-id
docker rm container-name or container-id

为了确保 OpenSearch 容器已被删除,可以运行 'docker ps' 命令并附加选项 '-a'。这将显示所有状态的可用容器,包括运行中和已退出的。

docker ps -a

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

创建项目目录

使用以下命令以你的用户身份登录。本示例使用用户 'alice',因此请务必将命令中的用户名替换为你自己的用户。

su - alice

现在创建一个新项目目录 'opensearch-project',它将作为你的项目的主根目录,以及一个 'certs' 目录,用于存储自定义 TLS 证书。

mkdir -p ~/opensearch-project/certs; cd ~/opensearch-project

在 'opensearch-project' 目录中,运行以下命令创建用于构建 OpenSearch 容器和 OpenSearch Dashboards 的新文件。

touch docker-compose.yml opensearch.yml opensearch_dashboards.yml internal_users.yml

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

文件列表:

  • docker-compose.yml——OpenSearch 项目的 Docker Compose 主配置文件。
  • opensearch.yml——OpenSearch 容器的自定义配置。
  • opensearch_dashboards.yml——OpenSearch Dashboards 容器的自定义配置。
  • internal_users.yml——OpenSearch 与 OpenSearch Dashboards 的自定义用户身份认证与授权配置。

生成 SSL/TLS 证书

在这一步中,你将生成多份用于保护 OpenSearch 部署的 TLS 证书。你将生成以下证书:

  • 根 CA 证书:这些证书将用于为其他证书签名。
  • 管理员证书:这些证书将用于获取管理员权限,以执行安全插件相关的所有任务。
  • OpenSearch Dashboards 证书:这些证书将用于保护 OpenSearch Dashboards,使你能够通过 HTTPS 连接访问 OpenSearch Dashboards。
  • 节点和客户端证书:这些证书将由 OpenSearch 集群内的节点和客户端使用。

首先,运行以下命令创建用于存储 TLS 证书的新目录。

mkdir -p certs/{ca,os-dashboards}

创建一个名为 'MYDN' 的新环境变量,用于生成新的 TLS 证书。请务必将相关详细信息替换为你自己的信息。

export MYDN="/C=CA/ST=ONTARIO/L=TORONTO/O=HWDOMAIN"

现在你已经准备好为 OpenSearch 部署生成 TLS 证书了。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

生成 CA 证书

使用以下命令为根 CA 证书生成私钥。

openssl genrsa -out certs/ca/ca.key 2048

现在通过以下命令生成自签名根 CA 证书。'-subj' 参数的值使用了你在当前会话中创建的环境变量 'MYDN'。

openssl req -new -x509 -sha256 -days 1095 -subj "$MYDN/CN=CA" -key certs/ca/ca.key -out certs/ca/ca.pem

完成后,你应该会得到根 CA 私钥 'ca.key' 和根 CA 证书 'ca.pem'。你可以通过下面的命令验证已生成的 CA 证书。

ls certs/ca/

输出——你应该会得到 CA 私钥 'ca.key' 和 CA 证书 'ca.pem' 文件。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

生成管理员证书

生成新的管理员证书私钥 'admin-temp.key',并将生成的证书转换为 PKCS#12 兼容算法(3DES)。完成后,你的管理员私钥应为 'admin.key'。

openssl genrsa -out certs/ca/admin-temp.key 2048
openssl pkcs8 -inform PEM -outform PEM -in certs/ca/admin-temp.key -topk8 -nocrypt -v1 PBE-SHA1-3DES -out certs/ca/admin.key

接下来,运行以下命令,基于 'admin.key' 私钥生成管理员 CSR(证书签名请求)。生成后,你的 CSR 应为 'admin.csr' 文件。

openssl req -new -subj "$MYDN/CN=ADMIN" -key certs/ca/admin.key -out certs/ca/admin.csr

现在运行以下命令,使用根 CA 证书和私钥对管理员 CSR 进行签名。生成的管理员证书输出为 'admin.pem' 文件。

openssl x509 -req -in certs/ca/admin.csr -CA certs/ca/ca.pem -CAkey certs/ca/ca.key -CAcreateserial -sha256 -out certs/ca/admin.pem

最后,通过以下命令验证你的证书列表。

ls certs/ca/

输出——你应该会看到管理员证书文件 'admin.pem' 和私钥 'admin.key'。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

生成 OpenSearch Dashboards 证书

生成将用于 OpenSearch Dashboards 的新证书。

运行以下命令生成私钥 'os-dashboards-temp.key',并将生成的证书转换为 PKCS#12 兼容算法(3DES)。完成后,你的私钥应为 'os-dashboards.key'。

openssl genrsa -out certs/os-dashboards/os-dashboards-temp.key 2048
openssl pkcs8 -inform PEM -outform PEM -in certs/os-dashboards/os-dashboards-temp.key -topk8 -nocrypt -v1 PBE-SHA1-3DES -out certs/os-dashboards/os-dashboards.key

接下来,运行以下命令为 OpenSearch Dashboards 生成 CSR(证书签名请求)。生成后,你的 CSR 应为 'os-dashboards.csr' 文件。

openssl req -new -subj "$MYDN/CN=os-dashboards" -key certs/os-dashboards/os-dashboards.key -out certs/os-dashboards/os-dashboards.csr

现在运行以下命令,使用根 CA 证书和私钥对 OpenSearch Dashboards 的 CSR 进行签名。生成的证书输出为 'os-dashboards.pem' 文件。

openssl x509 -req -in certs/os-dashboards/os-dashboards.csr -CA certs/ca/ca.pem -CAkey certs/ca/ca.key -CAcreateserial -sha256 -out certs/os-dashboards/os-dashboards.pem

最后,运行以下命令删除 OpenSearch Dashboards 的 CSR 文件,并验证 OpenSearch Dashboards 的证书列表。

rm certs/os-dashboards/os-dashboards-temp.key certs/os-dashboards/os-dashboards.csr
ls certs/os-dashboards/

输出——你应该会看到 OpenSearch Dashboards 证书文件 'os-dashboards.pem' 和私钥 'os-dashboards.key'。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

为 OpenSearch 节点生成证书

运行以下命令生成节点证书。这样,你将在 'certs' 目录下创建多个子目录,并为多个主机生成 TLS 证书。

for NODE_NAME in "os01" "os02" "os03"
do
    mkdir "certs/${NODE_NAME}"
    openssl genrsa -out "certs/$NODE_NAME/$NODE_NAME-temp.key" 2048
    openssl pkcs8 -inform PEM -outform PEM -in "certs/$NODE_NAME/$NODE_NAME-temp.key" -topk8 -nocrypt -v1 PBE-SHA1-3DES -out "certs/$NODE_NAME/$NODE_NAME.key"
    openssl req -new -subj "$MYDN/CN=$NODE_NAME" -key "certs/$NODE_NAME/$NODE_NAME.key" -out "certs/$NODE_NAME/$NODE_NAME.csr"
    openssl x509 -req -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:$NODE_NAME") -in "certs/$NODE_NAME/$NODE_NAME.csr" -CA certs/ca/ca.pem -CAkey certs/ca/ca.key -CAcreateserial -sha256 -out "certs/$NODE_NAME/$NODE_NAME.pem"
    rm "certs/$NODE_NAME/$NODE_NAME-temp.key" "certs/$NODE_NAME/$NODE_NAME.csr"
done

验证 'certs' 目录下的子目录列表。

ls certs/

输出——你应该会看到新目录 'os01、os02 和 os03'。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

最后,通过以下命令验证 os01、os02 和 os03 目录中的证书列表。

ls certs/os01/
ls certs/os02/
ls certs/os03/

输出——在每个目录中,你应该会得到两个证书 'osX.key' 和 'osX.pem'。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

最后,你必须通过以下命令将 'certs' 目录的属主更改为 '1000'。这样 Docker 容器才能访问 'certs' 目录。

sudo chown -R 1000:1000 certs/

生成 TLS 证书后,接下来你将生成密码哈希并定义 OpenSearch 用户。

配置用户

在这一步中,你将生成一个供 OpenSearch 和 OpenSearch Dashboards 使用的密码哈希。你将为两个不同的用户生成两个密码哈希,然后修改配置文件 'internal_users.yml' 来定义 OpenSearch 用户。

运行以下 docker 命令生成新的密码哈希。这将运行一个临时的 OpenSearch 容器,并执行用于生成密码哈希的脚本 'hash.sh'。

docker run -it --rm opensearchproject/opensearch sh -c "/usr/share/opensearch/plugins/opensearch-security/tools/hash.sh"

现在输入你的密码,你将在终端上得到哈希后的密码。复制生成的哈希密码,然后重新运行该命令以生成另一个哈希密码。

输出——为 OpenSearch 用户生成的哈希密码。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

接下来,使用以下 nano 编辑器命令打开文件 'internal_users.yml'。

nano internal_users.yml

在文件中添加以下内容,并务必将哈希密码替换为你自己生成的密码。这样,你将为你 OpenSearch 部署定义两个用户:用户 'admin' 作为 OpenSearch 的管理员,以及用户 'kibanaserver' 用于连接 OpenSearch Dashboards。

---
# This is the internal user database
# The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh
_meta:
  type: "internalusers"
  config_version: 2
# Define your internal users here
admin:
  hash: "$2y$12$y8UzXWoZKQc8GTgGsRz4g.CarjlC6sMPYN8XOD/NPQysRi2oq.Ws6"
  reserved: true
  backend_roles:
  - "admin"
  description: "Admin User"
kibanaserver:
  hash: "$2y$12$AKpGe4tM5nIWYFoM56yRue22pQh0jFfx59MUgUKnBu8qnyGeAm2Ze"
  reserved: true
  description: "OpenSearch Dashboards user"

完成后保存文件并退出编辑器。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

配置 docker-compose.yml 脚本

在这一步中,你将创建一个新的 Docker Compose 脚本来部署 OpenSearch 和 OpenSearch Dashboards。你将创建多个 OpenSearch 容器来组建 OpenSearch 集群,并设置一个连接到该集群的 OpenSearch Dashboards 容器。

使用以下 nano 编辑器命令打开文件 'docker-compose.yml'。

nano docker-compose.yml

在文件中添加以下内容。

version: '3.7'
services:
  os01:
    restart: always
    image: opensearchproject/opensearch:latest
    environment:
      OPENSEARCH_JAVA_OPTS: "-Xms1024m -Xmx1024m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
      node.name: os01
      discovery.seed_hosts: os01,os02,os03
      cluster.initial_master_nodes: os01,os02,os03
      plugins.security.ssl.transport.pemkey_filepath: certificates/os01/os01.key # relative path
      plugins.security.ssl.transport.pemcert_filepath: certificates/os01/os01.pem
      plugins.security.ssl.http.pemkey_filepath: certificates/os01/os01.key
      plugins.security.ssl.http.pemcert_filepath: certificates/os01/os01.pem
      DISABLE_INSTALL_DEMO_CONFIG: "true"
      JAVA_HOME: /usr/share/opensearch/jdk
      bootstrap.memory_lock: "true" # along with the memlock settings below, disables swapping
      network.host: "0.0.0.0"
    ulimits: 
      memlock:
        soft: -1
        hard: -1
    volumes:
      - "./opensearch.yml:/usr/share/opensearch/config/opensearch.yml"
      - "./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml"
      - "os-data1:/usr/share/opensearch/data"
      - "./certs:/usr/share/opensearch/config/certificates:ro"
    ports:
      - 9200:9200
      - 9600:9600 # required for Performance Analyzer
  
  os02:
    restart: always
    image: opensearchproject/opensearch:latest
    environment:
      OPENSEARCH_JAVA_OPTS: "-Xms1024m -Xmx1024m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
      node.name: os02
      discovery.seed_hosts: os01,os02,os03
      cluster.initial_master_nodes: os01,os02,os03
      plugins.security.ssl.transport.pemkey_filepath: certificates/os02/os02.key # relative path
      plugins.security.ssl.transport.pemcert_filepath: certificates/os02/os02.pem
      plugins.security.ssl.http.pemkey_filepath: certificates/os02/os02.key
      plugins.security.ssl.http.pemcert_filepath: certificates/os02/os02.pem
      DISABLE_INSTALL_DEMO_CONFIG: "true"
      JAVA_HOME: /usr/share/opensearch/jdk
      bootstrap.memory_lock: "true" # along with the memlock settings below, disables swapping
      network.host: "0.0.0.0"
    ulimits: 
      memlock:
        soft: -1
        hard: -1
    volumes:
      - "./opensearch.yml:/usr/share/opensearch/config/opensearch.yml"
      - "./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml"
      - "os-data2:/usr/share/opensearch/data"
      - "./certs:/usr/share/opensearch/config/certificates:ro"
  
  os03:
    restart: always
    image: opensearchproject/opensearch:latest
    environment:
      OPENSEARCH_JAVA_OPTS: "-Xms1024m -Xmx1024m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
      node.name: os03
      discovery.seed_hosts: os01,os02,os03
      cluster.initial_master_nodes: os01,os02,os03
      plugins.security.ssl.transport.pemkey_filepath: certificates/os03/os03.key # relative path
      plugins.security.ssl.transport.pemcert_filepath: certificates/os03/os03.pem
      plugins.security.ssl.http.pemkey_filepath: certificates/os03/os03.key
      plugins.security.ssl.http.pemcert_filepath: certificates/os03/os03.pem
      DISABLE_INSTALL_DEMO_CONFIG: "true"
      JAVA_HOME: /usr/share/opensearch/jdk
      bootstrap.memory_lock: "true" # along with the memlock settings below, disables swapping
      network.host: "0.0.0.0"
    ulimits: 
      memlock:
        soft: -1
        hard: -1
    volumes:
      - "./opensearch.yml:/usr/share/opensearch/config/opensearch.yml"
      - "./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml"
      - "os-data3:/usr/share/opensearch/data"
      - "./certs:/usr/share/opensearch/config/certificates:ro"
  
  osdashboards:
    restart: always
    image: opensearchproject/opensearch-dashboards:latest
    ports:
      - 5601:5601
    volumes:
      - "./certs:/usr/share/opensearch-dashboards/config/certificates:ro"
      - "./opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml"
    environment:
      OPENSEARCH_HOSTS: '["https://os01:9200","https://os02:9200","https://os03:9200"]' # must be a string with no spaces when specified as an environment variable
      DISABLE_INSTALL_DEMO_CONFIG: "true"
volumes:
  os-data1:
  os-data2:
  os-data3:

完成后保存并退出文件 'docker-compose.yml'。

这样,你将为 OpenSearch 部署创建 4 个容器/服务。以下是每个容器的详细信息。

  • 3 个 OpenSearch 容器 os01、os02 和 os03——用于创建 OpenSearch 集群。这些容器基于镜像 'opensearchproject/opensearch:latest',并使用相同的配置 'opensearch.yml' 和 'internal_users.yml'。
  • 一个 OpenSearch Dashboards 容器 'osdashboards' 基于镜像 'opensearchproject/opensearch-dashboards:latest',并连接到三个 OpenSearch 主机 os01、os02 和 os03。同时,你将在 OpenSearch Dashboards 容器上禁用演示配置。
  • 所有 OpenSearch 和 OpenSearch Dashboards 容器都将通过 'certs' 目录中提供的自定义 TLS 证书进行安全保护。
  • OpenSearch 容器将开放 9200 和 9600 两个端口,OpenSearch Dashboards 容器将开放端口 5601。

配置 OpenSearch 和 OpenSearch Dashboards

在这一步中,你将为 OpenSearch 创建新配置文件 'opensearch.yml',并为 OpenSearch Dashboards 创建 'opensearch_dashboards.yml'。最后,你必须确保 OpenSearch 项目目录中包含所有必要的配置和证书。

使用以下 nano 编辑器命令打开 OpenSearch 配置文件 'opensearch.yml'。

sudo nano opensearch.yml

在文件中添加以下内容。请务必修改 CA 证书的路径以及管理员证书和节点证书的 DN。这样,你将建立一个名为 'os-cluster' 的 OpenSearch 集群。

cluster.name: os-cluster
network.host: 0.0.0.0
bootstrap.memory_lock: "true" # along with the memlock settings below, disables swapping
plugins.security.allow_unsafe_democertificates: true
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemtrustedcas_filepath: certificates/ca/ca.pem
plugins.security.ssl.transport.enabled: true
plugins.security.ssl.transport.pemtrustedcas_filepath: certificates/ca/ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.authcz.admin_dn:
  - 'CN=ADMIN,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
plugins.security.nodes_dn:
  - 'CN=os00,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os01,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os02,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os03,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os04,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os05,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os06,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=os07,O=HWDOMAIN,L=TORONTO,ST=ONTARIO,C=CA'
plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
cluster.routing.allocation.disk.threshold_enabled: false
opendistro_security.audit.config.disabled_rest_categories: NONE
opendistro_security.audit.config.disabled_transport_categories: NONE

完成后保存文件 'opensearch.yml' 并退出编辑器。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

接下来,使用以下 nano 编辑器命令打开 OpenSearch Dashboards 配置文件 'opensearch_dashboards.yml'。

nano opensearch_dashboards.yml

在文件中添加以下内容。请务必将 OpenSearch Dashboards 的用户名和密码替换为 'internal_users.yml' 文件中用户 'kibanaserver' 对应的信息。

server.name: os_dashboards
server.host: "0.0.0.0"
opensearch.username: kibanaserver
opensearch.password: password
opensearch.requestHeadersWhitelist: [authorization, securitytenant]
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.preferred: [Private, Global]
opensearch_security.readonly_mode.roles: [kibana_read_only]
# Use this setting if you are running opensearch-dashboards without https
opensearch_security.cookie.secure: false
# Encrypt traffic between the browser and OpenSearch-Dashboards
server.ssl.enabled: true
server.ssl.certificate: "/usr/share/opensearch-dashboards/config/certificates/os-dashboards/os-dashboards.pem"
server.ssl.key: "/usr/share/opensearch-dashboards/config/certificates/os-dashboards/os-dashboards.key"
# Encrypt traffic between OpenSearch-Dashboards and Opensearch
opensearch.ssl.certificateAuthorities: ["/usr/share/opensearch-dashboards/config/certificates/ca/ca.pem"]
opensearch.ssl.verificationMode: full

完成后保存并退出文件。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

最后,运行以下 apt 命令安装 tree 软件包,并验证 OpenSearch 部署的文件和目录列表。

sudo apt install tree
tree .

你应该会看到类似这样的输出。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

至此,通过 Docker 部署 OpenSearch 的所有准备工作都已完成。你已经可以开始通过 Docker 和 Docker Compose 部署 OpenSearch 了。

部署 OpenSearch 集群和 OpenSearch Dashboards

开始前,请确保你位于 OpenSearch 项目目录 'opensearch-project' 中。然后,运行以下 'docker compose' 命令来创建并启动 OpenSearch 部署。

docker compose up -d

你应该会看到类似这样的输出——已创建并启动 3 个 OpenSearch 容器 os01、os02 和 os03。同时,OpenSearch Dashboards 容器 'osdashboards' 也已创建并启动。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

通过以下命令验证 OpenSearch 项目中正在运行的服务/容器列表。

docker compose ps

如果你看到 'STATUS' 为 'Up',则说明该容器/服务正在运行。在 'PORTS' 部分,你应该能看到容器暴露给宿主机的端口。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

在 OpenSearch 集群运行后,你现在必须应用你通过 'internal_users.yml' 文件创建的新用户配置。为此,你可以运行以下 'docker' 命令。同时,请务必在运行该命令前等待约 30 到 60 秒,以确保 OpenSearch 集群已处于运行状态。

以下命令将在 'os01' 容器/服务上运行 bash 脚本 'securityadmin.sh',并向你的 OpenSearch 集群应用新用户。

docker compose exec os01 bash -c "chmod +x plugins/opensearch-security/tools/securityadmin.sh && bash plugins/opensearch-security/tools/securityadmin.sh -cd config/opensearch-security -icl -nhnv -cacert config/certificates/ca/ca.pem -cert config/certificates/ca/admin.pem -key config/certificates/ca/admin.key -h localhost"

输出:

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

接下来,运行以下命令确认容器正在运行。然后,你可以通过下面的 ss 命令验证 Docker 宿主机上开放的端口列表。

docker compose ps
ss -tulpn

输出——端口 9200 和 9600 由 OpenSearch 集群使用,端口 5601 由 OpenSearch Dashboards 使用。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

最后,你可以通过在 'internal_users.yml' 文件中创建的用户名和密码,验证是否能成功认证访问 OpenSearch 集群。

以 admin 用户身份向 OpenSearch 集群进行认证。

curl https://192.168.5.100:9200 -u admin:password -k

输出——认证成功,你应该会看到当前集群中使用的 OpenSearch 软件的详细信息。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

以 kibanaserver 用户身份向 OpenSearch 集群进行认证。

curl https://192.168.5.100:9200 -u kibanaserver:password -k

输出——认证成功,你应该会看到当前集群中使用的 OpenSearch 软件的详细信息。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

至此,你已经通过 Docker 和 Docker Compose 部署了 OpenSearch 集群和 OpenSearch Dashboards。在下一步中,你将访问 OpenSearch Dashboards 部署,并验证 OpenSearch Dashboards 与 OpenSearch 集群之间的连接。

此外,当你的 OpenSearch 部署出现错误时,你可以通过下面的 'docker compose' 命令查看各个容器的日志。

查看日志的 'docker compose' 基本用法。

docker compose logs
docker compose logs SERVICE

通过 'docker compose' 命令查看特定容器/服务的日志。

docker compose logs osdashboards
docker compose logs os01
docker compose logs os02
docker compose logs os03

访问 OpenSearch Dashboards

打开你的网页浏览器,访问你的服务器 IP 地址加上 OpenSearch Dashboards 端口 '5601'(例如:https://192.168.5.100:5601/)。你应该会看到 OpenSearch Dashboards 登录页面。

输入用户 'kibanaserver' 和密码,然后点击 'Log in'(登录)。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

成功后,你应该会看到以下页面。点击 'Explore on my own'(自行探索),你应该会看到 OpenSearch Dashboard 主页。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

至此,OpenSearch Dashboards 已经运行,并且身份认证已启用。同时,OpenSearch Dashboards 正通过你生成的 SSL/TLS 证书在安全的 HTTPS 连接下运行。

接下来,通过 OpenSearch API 验证 OpenSearch Dashboards 与 OpenSearch 集群之间的连接。

点击左侧菜单,进入 Management(管理)部分,然后点击 'Dev Tools'(开发工具)。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

现在在控制台中输入查询 'GET /',然后点击播放按钮。成功后,你应该会在右侧看到包含 OpenSearch 服务器详细信息的输出。同时,你能在右上方看到 HTTP 状态码 '200 - OK',这表明查询已无错误地执行。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

输入另一个查询 'GET _cat/nodes?format=json&filter_path=ip,name',以验证 OpenSearch 集群上可用的节点。你应该会在 OpenSearch 集群上看到三个不同的节点:os01 的 IP 地址为 172.23.0.5,os02 的 IP 地址为 '172.23.0.3',os3 的 IP 地址为 '172.23.0.2'。

在 Ubuntu 22.04 系统中使用 Docker 部署 OpenSearch 搜索引擎

这证实了 OpenSearch Dashboards 已成功连接到 OpenSearch 集群。

结论

在本教程中,你在 Ubuntu 22.04 服务器上通过 Docker 和 Docker Compose 安装了 OpenSearch。你在 Docker 上创建了由 3 个不同容器组成的 OpenSearch 集群。你还使用 TLS 证书对 OpenSearch 进行了安全加固,启用了身份认证与授权,并在 OpenSearch 中配置了用户。此外,你还对 Ubuntu Linux 服务器进行了配置和优化,以便于部署 OpenSearch。

你还通过 Docker 和 Docker Compose 安装了 OpenSearch Dashboards。随后,你还将 OpenSearch Dashboards 容器连接到了 OpenSearch 集群。

通过这套部署,你现在可以进一步探索 OpenSearch、为你的 OpenSearch 添加一些集成、设置额外的身份认证等。你可以从 OpenSearch 的官方文档中了解更多相关内容。