创建 OpenSearch 集群

OpenSearch 集群由 OpenSearchCluster API 组中的 opensearch.org/v1 自定义资源描述。您可以在任何命名空间中创建它,因为 operator 会监视所有命名空间。

开始之前,请确保:

  • 已安装 operator。请参阅安装。
  • 将运行 OpenSearch 的节点上的 vm.max_map_count 至少为 262144。
  • 知道要使用哪个 StorageClass。请参阅存储。

选择 TLS 或纯 HTTP

已启用 TLS(推荐)无 TLS
配置spec.security.tls,包含 transport 和 http无 spec.security.tls
端口 9200 上的 REST APIHTTPS纯 HTTP
节点间流量使用 TLS 加密未加密
OpenSearch security plugin已启用:用户、角色、身份验证已禁用:无身份验证、无访问控制
典型用途生产环境、任何需要保护的数据受信任网络中的短期测试或开发集群

对于包含真实数据或可由受信任客户端之外的其他客户端访问的集群,请使用 TLS。不使用 TLS 时,任何能够访问该服务的人员都可以读取、更改和删除所有数据。

使用 TLS 的集群(推荐)

operator 会生成证书颁发机构并为您签发证书:

  • transport.generate: true 与 transport.perNode: true 会为每个 OpenSearch 节点签发一个传输证书。
  • http.generate: true 会为 REST API 签发证书。
apiVersion: opensearch.org/v1
kind: OpenSearchCluster
metadata:
  name: my-cluster
  namespace: my-namespace
spec:
  general:
    serviceName: my-cluster
    version: 3.8.0
  security:
    tls:
      transport:
        generate: true
        perNode: true
      http:
        generate: true
  dashboards:
    enable: true
    version: 3.8.0
    replicas: 1
    resources:
      requests:
        cpu: 500m
        memory: 1Gi
      limits:
        cpu: 500m
        memory: 1Gi
  nodePools:
    - component: masters
      replicas: 3
      diskSize: 30Gi
      roles:
        - cluster_manager
        - data
      resources:
        requests:
          cpu: "1"
          memory: 2Gi
        limits:
          cpu: "1"
          memory: 2Gi
      persistence:
        pvc:
          storageClass: <storage-class>
          accessModes:
            - ReadWriteOnce

替换 my-namespace 和 <storage-class>,然后应用该文件:

kubectl apply -f my-cluster.yaml

字段说明:

  • spec.general.serviceName 为必填项。它是 REST API 的 Kubernetes Service 名称。
  • spec.general.version 选择引擎版本:3.8.0(此版本的默认版本)或 2.19.6。将 spec.dashboards.version 设置为相同的版本。
  • 至少有一个节点池必须具有 cluster_manager 角色,并且 replicas 至少为 1。对于高可用集群,请使用 3 个符合集群管理器条件的节点。
  • component 在集群内必须唯一。它是 StatefulSet 和 Pod 名称(<cluster-name>-<component>-<index>)的一部分。
  • 如果未为节点池设置 jvm,operator 会将 Java 堆(-Xms 和 -Xmx)设置为该池内存请求的一半。请始终设置内存请求。
  • 未设置 diskSize 时,其默认值为 30Gi。

管理员凭据

除非您提供自己的凭据,否则 operator 会生成内置 admin 用户的密码,并将其存储在集群命名空间中名为 <cluster-name>-admin-password 的 Secret 中,键为 username 和 password。

kubectl -n my-namespace get secret my-cluster-admin-password \
  -o jsonpath='{.data.username}' | base64 -d; echo
kubectl -n my-namespace get secret my-cluster-admin-password \
  -o jsonpath='{.data.password}' | base64 -d; echo

如需使用您管理的凭据,请在创建集群之前创建包含 username 和 password 键的 Secret,并引用该 Secret:

spec:
  security:
    config:
      adminCredentialsSecret:
        name: my-admin-credentials

连接到集群

REST API 由一个以 spec.general.serviceName 命名的 Service 暴露,端口为 9200(spec.general.httpPort)。如需从工作站快速检查:

kubectl -n my-namespace port-forward svc/my-cluster 9200:9200

在另一个终端中:

curl -k -u 'admin:<password>' https://localhost:9200/_cluster/health?pretty

证书由 operator 生成的 CA 签发,而您的工作站不信任该 CA;-k 仅为本次测试跳过验证。

不使用 TLS 的集群

如果 OpenSearchCluster 未配置 TLS,operator 会在禁用安全插件的情况下启动 OpenSearch。REST API 通过端口 9200 上的普通 HTTP 提供服务,且无需身份验证。

apiVersion: opensearch.org/v1
kind: OpenSearchCluster
metadata:
  name: dev-cluster
  namespace: my-namespace
spec:
  general:
    serviceName: dev-cluster
    version: 3.8.0
  nodePools:
    - component: masters
      replicas: 3
      diskSize: 10Gi
      roles:
        - cluster_manager
        - data
      resources:
        requests:
          cpu: 500m
          memory: 2Gi
        limits:
          cpu: 500m
          memory: 2Gi
      persistence:
        pvc:
          storageClass: <storage-class>
          accessModes:
            - ReadWriteOnce

检查集群:

kubectl -n my-namespace port-forward svc/dev-cluster 9200:9200
curl http://localhost:9200/_cluster/health?pretty

注意事项:

  • 如果未配置 spec.security.tls.transport 和 spec.security.tls.http(或两者均设为 enabled: false),则会禁用安全插件。单独配置 spec.security.config 部分不会启用安全插件。
  • operator 仍会创建 <cluster-name>-admin-password Secret,但 OpenSearch 不会检查凭据。
  • 创建集群时,请决定使用 TLS 还是普通 HTTP。本文档不介绍如何在这两种模式之间切换现有集群。

OpenSearch Dashboards

设置 spec.dashboards.enable: true,即可像上面的 TLS 示例一样,随集群一起部署 OpenSearch Dashboards。operator 会:

  • 创建一个包含 spec.dashboards.replicas 个 Pod 的 Deployment,以及一个名为 <serviceName>-dashboards、端口为 5601 的 Service;
  • 使用专用的内部用户(kibanaserver)将 Dashboards 连接到集群,并将该用户的凭据存储在 <cluster-name>-dashboards-password Secret 中。

Service 类型默认为 ClusterIP。如需将 Dashboards 暴露到集群外部,请将 spec.dashboards.service.type 设置为 NodePort 或 LoadBalancer,也可以在 Service 前配置 Ingress。快速检查方法如下:

kubectl -n my-namespace port-forward svc/my-cluster-dashboards 5601:5601

然后打开 http://localhost:5601,使用用户名 admin 和 <cluster-name>-admin-password Secret 中的密码登录。

如需使用 operator 生成的证书通过 HTTPS 提供 Dashboards 服务,请添加:

spec:
  dashboards:
    tls:
      enable: true
      generate: true

Dashboards 未就绪

如果 Dashboards 持续记录另一实例正在迁移其索引,且始终无法就绪,请参阅 Dashboards 等待另一个迁移。

检查集群状态

kubectl -n my-namespace get opensearchclusters.opensearch.org
kubectl -n my-namespace get pods -l opensearch.org/opensearch-cluster=my-cluster

首次创建集群时,operator 会启动一个临时引导 Pod(<cluster-name>-bootstrap-0)来组建集群,并在集群组建完成后将其删除。当 OpenSearchCluster 的 status.phase 为 RUNNING,且所有节点池 Pod 均为 Ready 时,集群即已就绪。

自定义资源上的事件会说明 operator 正在执行的操作:

kubectl -n my-namespace describe opensearchclusters.opensearch.org my-cluster

删除集群

kubectl -n my-namespace delete opensearchclusters.opensearch.org my-cluster

默认情况下,删除集群时会保留节点池的数据 PVC。如果在同一命名空间中再次创建同名集群,它会重新使用这些卷,并根据磁盘上的数据重新组建之前的集群。如果要创建全新的集群,也请删除 PVC。请参阅存储。


OpenSearch® 是 LF Projects, LLC 的注册商标。