#{ commentsCount } comment.
Kubernetes环境OpenSearch部署与应用
发布于2022-09-07
,最后编辑于2024-10-25
,全文约3194
字,阅读时间约7
分钟。
Kubernetes Helm OpenSearch ElasticSearch Filebeat Logging DaemonSet
更新记录
-
2022-09-13
- 添加Filebeat OSS日志采集方案示例;
-
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部署与应用》。
组件版本¶
-
OpenSearch
v2.11.1
-
OpenSearch Helm Charts
v2.17.2
-
OpenSearch Dashboards
v2.11.1
-
Filebeat OSS
v7.12.1
配置过程¶
准备工作¶
-
调整节点系统参数
在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仓库
添加用于安装
OpenSearch
和OpenSearch 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
-
首先,创建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 OSS、Logstash 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.number
由2.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
-
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...