Kubernetes环境OpenSearch部署与应用

发布于2022-09-07,最后编辑于2024-03-22,全文约3194字,阅读时间约7分钟。

Kubernetes Helm OpenSearch ElasticSearch Filebeat Logging DaemonSet

OpenSearch Dashboard
OpenSearch Dashboard
更新记录
  • 2022-09-13

  • 2022-09-17

    • OpenSearch版本由v2.2.1更新至v2.3.0
    • OpenSearch Helm Charts版本由v2.5.1更新至v2.6.0
    • OpenSearch Dashboards版本由v2.2.0更新至v2.3.0
    • OpenSearch Dashboards Helm Charts版本由v2.4.1更新至v2.5.1
  • 2022-10-14

    • OpenSearch Helm Charts版本由v2.6.0更新至v2.6.2
    • OpenSearch Dashboards Helm Charts版本由v2.5.1更新至v2.5.3
  • 2022-11-12

    • OpenSearch Helm Charts版本由v2.6.2更新至v2.7.0
  • 2022-11-18

    • OpenSearch版本由v2.3.0更新至v2.4.0
    • OpenSearch Helm Charts版本由v2.7.0更新至v2.8.0
    • OpenSearch Dashboards版本由v2.3.0更新至v2.4.0
    • OpenSearch Dashboards Helm Charts版本由v2.5.3更新至v2.6.0
  • 2022-12-19

    • OpenSearch版本由v2.4.0更新至v2.4.1
    • OpenSearch Helm Charts版本由v2.8.0更新至v2.9.0
    • OpenSearch Dashboards版本由v2.4.0更新至v2.4.1
    • OpenSearch Dashboards Helm Charts版本由v2.6.0更新至v2.7.0
  • 2023-01-28

    • OpenSearch版本由v2.4.1更新至v2.5.0
    • OpenSearch Helm Charts版本由v2.9.0更新至v2.10.0
    • OpenSearch Dashboards版本由v2.4.1更新至v2.5.0
    • OpenSearch Dashboards Helm Charts版本由v2.7.0更新至v2.8.0
  • 2023-03-03

    • OpenSearch版本由v2.5.0更新至v2.6.0
    • OpenSearch Helm Charts版本由v2.10.0更新至v2.11.0
    • OpenSearch Dashboards版本由v2.5.0更新至v2.6.0
    • OpenSearch Dashboards Helm Charts版本由v2.8.0更新至v2.9.0
  • 2023-03-22

    • OpenSearch Helm Charts版本由v2.11.0更新至v2.11.1
    • OpenSearch Dashboards Helm Charts版本由v2.9.0更新至v2.9.1
  • 2023-03-27

    • OpenSearch Helm Charts版本由v2.11.1更新至v2.11.2
  • 2023-04-14

    • OpenSearch Helm Charts版本由v2.11.2更新至v2.11.3
    • OpenSearch Dashboards Helm Charts版本由v2.9.1更新至v2.9.2
  • 2023-05-03

    • OpenSearch版本由v2.6.0更新至v2.7.0
    • OpenSearch Helm Charts版本由v2.11.3更新至v2.12.0
    • OpenSearch Dashboards版本由v2.6.0更新至v2.7.0
    • OpenSearch Dashboards Helm Charts版本由v2.9.2更新至v2.10.0
  • 2023-06-24

    • OpenSearch版本由v2.7.0更新至v2.8.0
    • OpenSearch Helm Charts版本由v2.12.0更新至v2.13.3
    • OpenSearch Dashboards版本由v2.7.0更新至v2.8.0
    • OpenSearch Dashboards Helm Charts版本由v2.10.0更新至v2.11.1
  • 2023-07-31

    • OpenSearch版本由v2.8.0更新至v2.9.0
    • OpenSearch Helm Charts版本由v2.13.3更新至v2.14.1
    • OpenSearch Dashboards版本由v2.8.0更新至v2.9.0
    • OpenSearch Dashboards Helm Charts版本由v2.11.1更新至v2.12.0
  • 2023-09-30

    • OpenSearch版本由v2.9.0更新至v2.10.0
    • OpenSearch Helm Charts版本由v2.14.1更新至v2.15.0
    • OpenSearch Dashboards版本由v2.9.0更新至v2.10.0
    • OpenSearch Dashboards Helm Charts版本由v2.12.0更新至v2.13.0
  • 2023-10-28

    • OpenSearch版本由v2.10.0更新至v2.11.0
    • OpenSearch Helm Charts版本由v2.15.0更新至v2.16.1
    • OpenSearch Dashboards版本由v2.10.0更新至v2.11.0
    • OpenSearch Dashboards Helm Charts版本由v2.13.0更新至v2.14.0
  • 2024-01-01

    • OpenSearch版本由v2.11.0更新至v2.11.1
    • OpenSearch Helm Charts版本由v2.16.1更新至v2.17.2
    • OpenSearch Dashboards版本由v2.11.0更新至v2.11.1
    • OpenSearch Dashboards Helm Charts版本由v2.14.0更新至v2.15.1

概述

本文用于整理基于Kubernetes环境的OpenSearch部署与应用,实现ElasticSearch OSS兼容的文档索引检索服务,作为后续演练项目的前置环境准备。

随着各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新,请参考更新记录

本次演练环境为Kubernetes集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。

本次演练使用Traefik作为Ingress Controller实现,环境配置可参考笔者另一篇笔记《Kubernetes环境Traefik部署与应用》。

组件版本

配置过程

准备工作

  • 调整节点系统参数

    在Kubernetes集群所有工作节点上执行如下操作。

    1# https://opensearch.org/docs/2.10/install-and-configure/install-opensearch/index/#important-settings
    2cat <<EOF | sudo tee /etc/sysctl.d/99-vm-max_map_count.conf > /dev/null
    3vm.max_map_count = 262144
    4EOF
    5
    6sudo sysctl --system
    
  • 添加Helm仓库

    添加用于安装OpenSearchOpenSearch Dashboards的Helm仓库。

    1helm repo add opensearch https://opensearch-project.github.io/helm-charts/
    2helm repo update
    
  • 创建命名空间

    本次演练中将OpenSearch安装至data-opensearch命名空间,可根据需要替换。

    1kubectl create namespace data-opensearch
    
  • 创建TLS证书Secret

    从已准备好的证书key文件和crt文件创建Secret

    1kubectl create secret tls local-choral-io-tls -n data-opensearch \
    2  --key=local.choral.io.key --cert=local.choral.io.crt
    

安装OpenSearch

  • 创建预置用户

    创建internal_users.yml,包含下列预置用户信息:

    • admin : Xa6lr8j4ZYmh9Bq6xSYlk9MN
    • kibanaserver : sNZrllLnoBZgmaZn4b5pInnT
    • logstash : LhKrXnx5w2FT1qsPx4GiPDsL

    注:文档中hash字段的值为密码通过Bcrypt算法生成的哈希值。

     1# https://opensearch.org/docs/2.10/security/configuration/yaml/#internal_usersyml
     2_meta:
     3  type: "internalusers"
     4  config_version: 2
     5
     6admin:
     7  hash: "$2a$12$z6ook.e3UpLIXKcNR6MLT.pwz4XCYKXE4FrNQW9ofT5SjnFQKMJ2W" # Xa6lr8j4ZYmh9Bq6xSYlk9MN
     8  reserved: true
     9  backend_roles:
    10    - "admin"
    11
    12kibanaserver:
    13  hash: "$2a$12$cVhs1VYUhv7DC4YvRMdAk.GKS.YluXB3wmSZ4DmfhP4wJAmftirEu" #sNZrllLnoBZgmaZn4b5pInnT
    14  reserved: true
    15
    16logstash:
    17  hash: "$2a$12$y4/DbsUDpajUVQWOpO1Vl.iBaCq6rCsmdCwu8pP3JC.AECViempEe" # LhKrXnx5w2FT1qsPx4GiPDsL
    18  reserved: false
    19  backend_roles:
    20    - "logstash"
    

    创建包含上述文件的Secret对象。

    1kubectl create secret --namespace data-opensearch generic opensearch-security-secrets \
    2  --from-file=internal_users.yml=internal_users.yml
    
  • 创建helm-opensearch.yaml

    首先,创建OpenSearch的安装配置文件。

     1image:
     2  repository: quay.io/choral-k8s/opensearch
     3extraEnvs:
     4  - name: plugins.security.ssl.http.enabled
     5    value: 'false' # HTTP服务禁用SSL
     6persistence:
     7  storageClass: 'local-path' # 指定存储类,可根据需要替换
     8securityConfig:
     9  path: /usr/share/opensearch/config/opensearch-security # 指定Security插件的配置目录
    10  internalUsersSecret: opensearch-security-secrets # 包含预置用户配置文件的Secret名称
    11ingress:
    12  enabled: true # 启用Ingress
    13  annotations:
    14    kubernetes.io/ingress.class: traefik # 指定IngressClass,可根据需要替换
    15    traefik.ingress.kubernetes.io/router.entrypoints: websecure # 仅限HTTPS访问
    16  hosts:
    17    - opensearch.local.choral.io # 服务对外访问主机名
    18  tls:
    19    - secretName: local-choral-io-tls # 提供TLS证书的Secret名称
    
  • 安装OpenSearch

    1helm pull opensearch/opensearch --version v2.17.2
    2helm upgrade --install opensearch --namespace data-opensearch \
    3  --values helm-opensearch.yaml \
    4  opensearch-2.17.2.tgz
    
  • 查看集群信息

    使用admin用户的用户名和密码做HTTP Basic认证,访问OpenSearch服务,获取服务基本信息,验证服务是否可用。

    1curl -XGET https://opensearch.local.choral.io -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN'
    

    上面的命令会输出类似下面的内容。

     1{
     2  "name" : "opensearch-cluster-master-0",
     3  "cluster_name" : "opensearch-cluster",
     4  "cluster_uuid" : "bfalHqPIR5GJTSgZkZJAyA",
     5  "version" : {
     6    "distribution" : "opensearch",
     7    "number" : "2.11.1",
     8    "build_type" : "tar",
     9    "build_hash" : "6b1986e964d440be9137eba1413015c31c5a7752",
    10    "build_date" : "2023-11-29T21:43:10.135035992Z",
    11    "build_snapshot" : false,
    12    "lucene_version" : "9.7.0",
    13    "minimum_wire_compatibility_version" : "7.10.0",
    14    "minimum_index_compatibility_version" : "7.0.0"
    15  },
    16  "tagline" : "The OpenSearch Project: https://opensearch.org/"
    17}
    

设置兼容模式(可选)

为了与Filebeat OSSLogstash OSS等组件兼容,需要设置OpenSearch为兼容模式。兼容模式下,OpenSearch服务会将版本报告为7.10.x。有关兼容模式的详细信息和兼容性矩阵,可访问OpenSearch文档中的这个页面了解更多。

  • 查看当前设置

    使用admin用户的用户名和密码做HTTP Basic认证,访问OpenSearch服务,查看OpenSearch集群当前设置。

    1curl -XGET https://opensearch.local.choral.io/_cluster/settings -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN'
    2# {"persistent":{"plugins":{"index_state_management":{"template_migration":{"control":"-1"}}}},"transient":{}}
    
  • 设置兼容模式

    通过调用OpenSearch REST API添加兼容模式(compatibility.override_main_response_version)配置。

    1curl -XPUT https://opensearch.local.choral.io/_cluster/settings -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN' \
    2  -H 'Content-Type: application/json' \
    3  -d '{"persistent":{"compatibility.override_main_response_version":true}}'
    4# {"acknowledged":true,"persistent":{"compatibility":{"override_main_response_version":"true"}},"transient":{}}
    
  • 检查设置生效

    再次查看OpenSearch集群的设置,检查兼容模式(compatibility.override_main_response_version)是否已经启用。

    1curl -XGET https://opensearch.local.choral.io/_cluster/settings -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN'
    2# {"persistent":{"compatibility":{"override_main_response_version":"true"},"plugins":{"index_state_management":{"template_migration":{"control":"-1"}}}},"transient":{}}
    

    再次查看集群基本信息。

    1curl -XGET https://opensearch.local.choral.io -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN'
    

    上面的命令会输出类似下面的内容。

     1{
     2  "name" : "opensearch-cluster-master-0",
     3  "cluster_name" : "opensearch-cluster",
     4  "cluster_uuid" : "bfalHqPIR5GJTSgZkZJAyA",
     5  "version" : {
     6    "number" : "7.10.2",
     7    "build_type" : "tar",
     8    "build_hash" : "6b1986e964d440be9137eba1413015c31c5a7752",
     9    "build_date" : "2023-11-29T21:43:10.135035992Z",
    10    "build_snapshot" : false,
    11    "lucene_version" : "9.7.0",
    12    "minimum_wire_compatibility_version" : "7.10.0",
    13    "minimum_index_compatibility_version" : "7.0.0"
    14  },
    15  "tagline" : "The OpenSearch Project: https://opensearch.org/"
    16}
    

    通过对比可以发现,version.distribution已经被移除,version.number2.11.1变为7.10.2,说明兼容模式生效。

安装OpenSearch Dashboards

本次演练中将OpenSearch Dashboards安装至data-opensearch命名空间,可根据需要替换。

  • 创建OpenSearch认证凭据

    创建包含kibanaserver用户认证信息的Secret对象。

    1# cookie=                            会创建名为`COOKIE_PASS`的环境变量,查遍了文档和源码也没找到这个变量是干嘛用的,但Secret中没有这个Key会报错,暂时先这样😥
    2# username=kibanaserver              `kibanaserver`用户的用户名
    3# password=sNZrllLnoBZgmaZn4b5pInnT  `kibanaserver`用户的密码
    4kubectl create secret --namespace data-opensearch generic opensearch-dashboards-credentials \
    5  --from-literal=cookie= \
    6  --from-literal=username=kibanaserver \
    7  --from-literal=password=sNZrllLnoBZgmaZn4b5pInnT
    
  • 创建helm-opensearch-dashboards.yaml

     1image:
     2  repository: quay.io/choral-k8s/opensearch-dashboards
     3extraEnvs:
     4  - name: SERVER_BASEPATH
     5    value: '/_dashboards' # 设置OpenSearch Dashboards服务的访问路径
     6  - name: SERVER_REWRITEBASEPATH
     7    value: 'true'
     8opensearchHosts: "http://opensearch-cluster-master:9200" # 设置OpenSearch服务的地址
     9opensearchAccount:
    10  secret: opensearch-dashboards-credentials # 包含`kibanaserver`用户认证信息的`Secret`名称
    11ingress:
    12  enabled: true # 启用Ingress
    13  annotations:
    14    kubernetes.io/ingress.class: traefik # 指定IngressClass,可根据需要替换
    15    traefik.ingress.kubernetes.io/router.entrypoints: websecure # 仅限HTTPS访问
    16  hosts:
    17    - host: opensearch.local.choral.io # 服务对外访问主机名
    18      paths:
    19        - path: /_dashboards # 服务对外访问路径前缀
    20          backend: {} # 空对象,没什么用,查看了charts的源码,不这样会报错😥
    21  tls:
    22    - secretName: local-choral-io-tls # 提供TLS证书的Secret名称
    
  • 安装OpenSearch Dashboards

    1helm pull opensearch/opensearch-dashboards --version v2.15.1
    2helm upgrade --install opensearch-dashboards --namespace data-opensearch \
    3  --values helm-opensearch-dashboards.yaml \
    4  opensearch-dashboards-2.15.1.tgz
    5# ...
    6# NOTES:
    7# 1. Get the application URL by running these commands:
    8#   https://opensearch.local.choral.io/_dashboards
    

    使用浏览器打开上述命令输出中的链接,访问OpenSearch Dashboards界面。

采集Kubernetes集群日志

作为OpenSearch文档存储和检索的应用案例,笔者将部署以DeamonSet模式运行的Filebeat组件来采集Kubernetes集群产生的日志文档,并保存至OpenSearch中。

使用Filebeat OSS连接到OpenSearch,需要配置兼容模式,可参考设置兼容模式一节

  • 创建包含OpenSearch认证凭据的Secret对象

    1kubectl create secret -n kube-system generic opensearch-logstash-credentials \
    2  --from-literal=username=logstash --from-literal=password=LhKrXnx5w2FT1qsPx4GiPDsL
    
  • 创建helm-filebeat.yaml

     1image: docker.elastic.co/beats/filebeat-oss # 指定镜像仓库,使用开源版本
     2extraEnvs:
     3  - name: ELASTICSEARCH_USERNAME # 设置环境变量,从指定的Secret中引用用户名
     4    valueFrom:
     5      secretKeyRef:
     6        key: username
     7        name: opensearch-logstash-credentials
     8  - name: ELASTICSEARCH_PASSWORD # 设置环境变量,从指定的Secret中引用密码
     9    valueFrom:
    10      secretKeyRef:
    11        key: password
    12        name: opensearch-logstash-credentials
    13tolerations:
    14  - effect: NoSchedule # 允许在control-plane节点中运行
    15    key: node-role.kubernetes.io/control-plane
    16    operator: Equal
    17filebeatConfig:
    18  filebeat.yml: | # 配置文件`filebeat.yml`
    19    filebeat.autodiscover: # 启用自动发现
    20      providers:
    21        - type: kubernetes
    22          node: ${NODE_NAME}
    23          hints.enabled: true # 启用Hints
    24          hints.default_config: # Hints默认配置
    25            type: container # 类型:容器
    26            paths:
    27              - /var/log/containers/*${data.kubernetes.container.id}.log # 日志位置
    28    processors: # 添加处理程序
    29      - add_cloud_metadata: # 添加云服务信息
    30      - add_host_metadata: # 添加主机信息
    31    output.elasticsearch: # 输出至ElasticSearch服务(这里实际上是OpenSearch服务)
    32      host: "${NODE_NAME}"
    33      hosts: ["opensearch-cluster-master.data-opensearch:9200"] # 指定ElasticSearch服务主机
    34      protocol: http # 连接协议
    35      username: "${ELASTICSEARCH_USERNAME}" # ElasticSearch服务的用户名
    36      password: "${ELASTICSEARCH_PASSWORD}" # ElasticSearch服务的密码
    37      max_bytes: 10485760 # 最大传输字节数
    38      index: "filebeat-%{[agent.version]}-%{[kubernetes.namespace]:default}-%{+YYYY.MM.dd}" # 修改索引名称,日志文档按命名空间保存
    39      ilm.enabled: false # 禁用ILM(OpenSearch不支持)
    40    setup.ilm.enabled: false # 禁用ILM(OpenSearch不支持)
    41    setup.template.enabled: true # 启用索引模板
    42    setup.template.overwrite: true # 覆盖当前索引模板
    43    setup.template.name: "filebeat-%{[agent.version]}" # 索引模板名称
    44    setup.template.pattern: "filebeat-%{[agent.version]}-*" # 索引模板匹配规则
    45    setup.template.settings: # 索引模板设置
    46      index.number_of_shards: 1 # 设置分片数量
    47      index.number_of_replicas: 0 # 设置副本数量
    
  • 添加Helm仓库

    添加用于安装Filebeat的Helm仓库。

    1helm repo add elastic https://helm.elastic.co/
    2helm repo update
    
  • 安装Filebeat

    1helm pull elastic/filebeat --version 7.12.1
    2helm upgrade --install filebeat --namespace kube-system \
    3  --values helm-filebeat.yaml \
    4  filebeat-7.12.1.tgz
    
  • 验证日志索引成功

    1curl -s -XGET https://opensearch.local.choral.io/_cat/indices?v -u 'admin:Xa6lr8j4ZYmh9Bq6xSYlk9MN'
    
    1health status index                                      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    2green  open   filebeat-7.12.1-kube-system-2022.09.05     s_Fh8F2BQcalMtJP3goSHQ   3   0        472            0    357.7kb        357.7kb
    3green  open   filebeat-7.12.1-metallb-system-2022.09.05  jfIi7dMsRe-zTrRM119auQ   3   0        391            0    275.8kb        275.8kb
    4green  open   filebeat-7.12.1-apps-choral-2022.09.06     7aWKDzwVTuCVjsGnMjDSAA   3   0        496            0    328.1kb        328.1kb
    5...
    

参考资料