Kubernetes环境OpenSearch部署与应用

发布于2022-09-07,最后编辑于2023-06-02,全文约3175字,阅读时间约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

概述

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

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

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

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

组件版本

配置过程

准备工作

  • 调整节点系统参数

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

    1# https://opensearch.org/docs/2.4/opensearch/install/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

  • 创建内置用户配置文件

    创建两个内置用户:admin:Xa6lr8j4ZYmh9Bq6xSYlk9MNkibanaserver:sNZrllLnoBZgmaZn4b5pInnT,文档中hash字段的值为密码通过Bcrypt算法生成的哈希值。

     1# internal_users.yml
     2# https://opensearch.org/docs/2.4/security-plugin/configuration/yaml#internal_usersyml
     3_meta:
     4  type: "internalusers"
     5  config_version: 2
     6
     7admin:
     8  hash: "$2a$12$z6ook.e3UpLIXKcNR6MLT.pwz4XCYKXE4FrNQW9ofT5SjnFQKMJ2W"
     9  reserved: true
    10  backend_roles:
    11    - "admin"
    12
    13kibanaserver:
    14  hash: "$2a$12$cVhs1VYUhv7DC4YvRMdAk.GKS.YluXB3wmSZ4DmfhP4wJAmftirEu"
    15  reserved: true
    

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

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

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

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

    1helm upgrade --install opensearch --namespace data-opensearch \
    2  --values helm-opensearch.yaml \
    3  opensearch/opensearch
    
  • 查看集群信息

    使用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" : "D6HXaUD3QGKoYvo5_Ea_xg",
     5  "version" : {
     6    "distribution" : "opensearch",
     7    "number" : "2.7.0",
     8    "build_type" : "tar",
     9    "build_hash" : "7203a5af21a8a009aece1474446b437a3c674db6",
    10    "build_date" : "2023-02-24T18:57:04.388618985Z",
    11    "build_snapshot" : false,
    12    "lucene_version" : "9.5.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" : "D6HXaUD3QGKoYvo5_Ea_xg",
     5  "version" : {
     6    "number" : "7.10.2",
     7    "build_type" : "tar",
     8    "build_hash" : "7203a5af21a8a009aece1474446b437a3c674db6",
     9    "build_date" : "2023-02-24T18:57:04.388618985Z",
    10    "build_snapshot" : false,
    11    "lucene_version" : "9.5.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.7.0变为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

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

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

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

采集Kubernetes集群日志

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

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

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

    1kubectl create secret -n apps-filebeat generic opensearch-master-credentials \
    2  --from-literal=username=filebeat --from-literal=password=sSaX3rlZ09J1OBhI0PckTlM0
    
  • 创建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-master-credentials
     8  - name: ELASTICSEARCH_PASSWORD # 设置环境变量,从指定的Secret中引用密码
     9    valueFrom:
    10      secretKeyRef:
    11        key: password
    12        name: opensearch-master-credentials
    13filebeatConfig:
    14  filebeat.yml: | # 配置文件`filebeat.yml`
    15    filebeat.autodiscover: # 启用自动发现
    16      providers:
    17        - type: kubernetes
    18          node: ${NODE_NAME}
    19          hints.enabled: true # 启用Hints
    20          hints.default_config: # Hints默认配置
    21            type: container # 类型:容器
    22            paths:
    23              - /var/log/containers/*${data.kubernetes.container.id}.log # 日志位置
    24    processors: # 添加处理程序
    25      - add_cloud_metadata: # 添加云服务信息
    26      - add_host_metadata: # 添加主机信息
    27    output.elasticsearch: # 输出至ElasticSearch服务(这里实际上是OpenSearch服务)
    28      host: "${NODE_NAME}"
    29      hosts: ["opensearch-cluster-master.data-opensearch:9200"] # 指定ElasticSearch服务主机
    30      protocol: http # 连接协议
    31      username: "${ELASTICSEARCH_USERNAME}" # ElasticSearch服务的用户名
    32      password: "${ELASTICSEARCH_PASSWORD}" # ElasticSearch服务的密码
    33      index: "filebeat-%{[agent.version]}-%{[kubernetes.namespace]:default}-%{+YYYY.MM.dd}" # 修改索引名称,日志文档按命名空间保存在的索引
    34      ilm.enabled: false # 禁用ILM(OpenSearch不支持)
    35    setup.ilm.enabled: false # 禁用ILM(OpenSearch不支持)
    36    setup.template.enabled: true # 启用索引模板
    37    setup.template.overwrite: true # 覆盖当前索引模板
    38    setup.template.name: "filebeat-%{[agent.version]}" # 索引模板名称
    39    setup.template.pattern: "filebeat-%{[agent.version]}-*" # 索引模板匹配规则
    40    setup.template.settings: # 索引模板设置
    41      index.number_of_shards: 1 # 设置分片数量
    42      index.number_of_replicas: 0 # 设置副本数量
    
  • 添加Helm仓库

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

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

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

    1curl -s -XGET https://opensearch.local.choral.io/_cat/indices?v -u 'filebeat:sSaX3rlZ09J1OBhI0PckTlM0'
    
    1health status index                               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    2green  open   filebeat-kube-system-2022.09.05     s_Fh8F2BQcalMtJP3goSHQ   1   0        472            0    357.7kb        357.7kb
    3green  open   filebeat-kube-prometheus-2022.09.06 7aWKDzwVTuCVjsGnMjDSAA   1   0        496            0    328.1kb        328.1kb
    4green  open   filebeat-metallb-system-2022.09.05  jfIi7dMsRe-zTrRM119auQ   1   0        391            0    275.8kb        275.8kb
    5green  open   filebeat-kube-prometheus-2022.09.05 yvXXR4xcSpWYSu2OVtTP5w   1   0        696            0    490.2kb        490.2kb
    6green  open   filebeat-metallb-system-2022.09.07  _zZt5Y_QTaS_4zlElm5iZw   1   0        846            0    398.1kb        398.1kb
    7...
    

参考资料