OpenObserve HA模式安装配置

WilliamGates
发布于 2023-11-22 14:53
浏览
0收藏

​前面我们了解到 OpenObserve 的架构支持单节点和 HA 两种模式​,接下来我们来了解下 OpenObserve 的 HA 模式是如何使用的。

OpenObserve HA模式安装配置-鸿蒙开发者社区

OpenObserve 可以在裸机服务器、虚拟机、Kubernetes 和其他平台上以 HA 模式安装和运行,但目前官方提供的使用 Helm Chart 的安装方式,所以需要提前准备一个可用的 Kubernetes 集群。

由于 HA 模式不支持本地磁盘存储,因此必须配置对象存储(例如 s3、minio、gcs 等等),这里我们就以 minio 为例进行说明。

首先添加 openobserve 的 helm 仓库:

$ helm repo add openobserve https://charts.openobserve.ai
$ helm repo update
# 或者直接 clone chart 仓库
$ git clone https://github.com/openobserve/openobserve-helm-chart.git

然后可以使用下面的命令来获取 helm chat 包:

$ tree openobserve-helm-chart
openobserve-helm-chart
├── Chart.lock
├── Chart.yaml
├── LICENSE
├── README.md
├── charts
│   ├── etcd-8.10.1.tgz
│   ├── etcd-8.11.4.tgz
│   └── minio-5.0.7.tgz
├── index.yaml
├── publish.sh
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── alertmanager-deployment.yaml
│   ├── alertmanager-service.yaml
│   ├── compactor-deployment.yaml
│   ├── compactor-hpa.yaml
│   ├── compactor-service.yaml
│   ├── configmap.yaml
│   ├── ingester-hpa.yaml
│   ├── ingester-service.yaml
│   ├── ingester-statefulset.yaml
│   ├── ingress.yaml
│   ├── issuer.yaml
│   ├── querier-deployment.yaml
│   ├── querier-hpa.yaml
│   ├── querier-service.yaml
│   ├── router-deployment.yaml
│   ├── router-hpa.yaml
│   ├── router-service.yaml
│   ├── secret.yaml
│   ├── serviceaccount.yaml
│   ├── zplane-deployment.yaml
│   ├── zplane-ingress.yaml
│   └── zplane-service.yaml
└── values.yaml

2 directories, 34 files

整个包里面还包括 etcd 和 minio 两个依赖的 helm chart 包,创建一个 ​​oo-values.yaml​​ 文件,然后添加如下内容:

auth:
  ZO_ROOT_USER_EMAIL: "root@example.com"
  ZO_ROOT_USER_PASSWORD: "root321"

  # 启用了 minio 不用设置这个
  # ZO_S3_ACCESS_KEY: "console"
  # ZO_S3_SECRET_KEY: "console123"

config:
  # ZO_S3_SERVER_URL: "http://minio:9000"  # 启用了 minio 不用设置这个
  ZO_S3_BUCKET_NAME: "openobserve"
  ZO_S3_REGION_NAME: "us-east-1"
  ZO_S3_PROVIDER: "minio" # 只有在使用 minio 进行对象存储时才需要设置这个,如果启用了minio,将会自动设置。
  ZO_TELEMETRY: "false" # 发送匿名遥测信息以改进OpenObserve,您可以将其设置为false来禁用。
  # ZO_ETCD_ADDR: "openobserve-etcd-headless.openobserve.svc.cluster.local:2379" # etcd endpoint,启用 etcd 会自动配置
  ZO_DATA_DIR: "./data/" # 指定数据目录,主要是 WAL 日志
  ZO_WAL_MEMORY_MODE_ENABLED: "false" # 开启内存模式,开启后不再写入本地文件,wal的数据直接在内存中,然后从内存转存到对象存储,为了解决某些云服务器,本地磁盘性能很差的问题,但是需要大内存。
  ZO_WAL_LINE_MODE_ENABLED: "true" # wal的写入模式,一般写入数据的时候都会批量写入,但是这有个潜在的风险。比如你一次写入了10k数据,如果我一次性写入wal,有可能遇到系统崩溃,掉电,这一批数据不知道断在哪儿,wal文件会出错。可能写入了一半。如果开启line模式,就是虽然你是一次给了我10k数据,我写入wal的时候,一行行的调用write接口,这样wal损坏的可能性小一些,但是性能稍微差一些。

replicaCount: # 可以根据需要调整副本数
  ingester: 1
  querier: 1
  router: 1
  alertmanager: 1
  compactor: 1

ingester:
  persistence: # 持久化 data 目录,主要是 WAL 日志
    enabled: true
    size: 10Gi
    storageClass: "cfsauto" # 指定可用的 storage class
    accessModes:
      - ReadWriteOnce

ingress:
  enabled: true
  className: "nginx"
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/connection-proxy-header: keep-alive
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-body-size: 32m
  hosts:
    - host: oo.k8s.local
      paths:
        - path: /
          pathType: ImplementationSpecific

etcd:
  enabled: true # 指定 etcd 是否启用
  replicaCount: 1 # 奇数
  persistence:
    size: 20Gi
    storageClass: "cfsauto" # 指定可用的 storage class
    accessModes:
      - ReadWriteOnce

minio:
  enabled: true # 指定 minio 是否启用
  region: "us-east-1"
  rootUser: rootuser
  rootPassword: rootpass123
  drivesPerNode: 1
  replicas: 2
  mode: distributed # or standalone
  buckets:
    - name: openobserve
      policy: none
      purge: false
  persistence:
    enabled: true
    size: 10Gi
    storageClass: "cfsauto" # 指定可用的 storage class
    accessModes:
      - ReadWriteOnce
  consoleIngress:
    enabled: true
    ingressClassName: "nginx"
    annotations:
      kubernetes.io/ingress.allow-http: "true"
      nginx.ingress.kubernetes.io/secure-backends: "true"
      nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0
    path: /
    hosts:
      - minio.k8s.local

在这个文件中我们指定了管理员的邮箱和密码,还有对象存储的相关配置,然后指定了 etcd 和 minio 的相关配置,要注意 ​​auth​​​ 和 ​​config​​​ 部分的配置,如果启用了 minio,那么 ​​ZO_S3_ACCESS_KEY​​​、​​ZO_S3_SECRET_KEY​​​、​​ZO_S3_SERVER_URL​​​ 这些配置都可以省略,因为这些配置项会自动设置,包括如果启用了 etcd,​​ZO_ETCD_ADDR​​ 参数也会自动配置。

另外我们可以看到 ​​ingester​​ 组件我们配置了数据持久化,这主要是为了对 WAL 日志数据的持久化,关于 WAL 主要有两种模式:

  • ​ZO_WAL_MEMORY_MODE_ENABLED​​: 内存模式,开启后不再写入本地文件,wal 的数据直接在内存中,然后从内存转存到对象存储,为了解决某些云服务器,本地磁盘性能很差的问题,但是需要大内存。
  • ​ZO_WAL_LINE_MODE_ENABLED​​: WAL 的写入模式,默认开启,一般写入数据的时候都会批量写入,但是这有个潜在的风险。比如你一次写入了 10k 数据,如果我一次性写入 wal,有可能遇到系统崩溃,掉电,这一批数据不知道断在哪儿,wal 文件会出错。可能写入了一半。如果开启 line 模式,就是虽然你是一次给了我 10k 数据,我写入 wal 的时候,一行行的调用 write 接口,这样 wal 损坏的可能性小一些,但是性能稍微差一些。

所以如果我们使用内存模式的话理论上可以不用持久化数据目录,但有一种情况会落盘,就是当内存中还有数据的时候程序接收到关闭指令,会把内存中的数据 dump 到磁盘,下次启动的时候再转移到对象存储中去。

更多配置可以参考官方文档关于环境变量的说明:https://openobserve.ai/docs/environment-variables/。

然后使用如下命令即可一件安装 OpenObserve:

$ helm upgrade --install openobserve -f oo-values.yaml --namespace openobserve ./openobserve-helm-chart
Release "openobserve" does not exist. Installing it now.
NAME: openobserve
LAST DEPLOYED: Thu Aug 10 15:31:37 2023
NAMESPACE: openobserve
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  http://oo.k8s.local/

安装后我们可以查看一下 OpenObserve 的 Pod 状态:

$ kubectl get pods -n openobserve
NAME                                        READY   STATUS    RESTARTS      AGE
openobserve-alertmanager-7957d8fb79-xzh8z   1/1     Running   4 (31m ago)   32m
openobserve-compactor-d679d4765-gpkgk       1/1     Running   4 (31m ago)   32m
openobserve-etcd-0                          1/1     Running   0             32m
openobserve-ingester-0                      1/1     Running   0             4m31s
openobserve-minio-0                         1/1     Running   0             32m
openobserve-minio-1                         1/1     Running   0             32m
openobserve-querier-56456d48c5-dth52        1/1     Running   4 (31m ago)   32m
openobserve-router-7bd4fcbc6c-nrmbs         1/1     Running   3 (32m ago)   32m
prometheus-756c8c78f5-gkwl8                 1/1     Running   0             2d
$ kubectl get svc -n openobserve
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
openobserve-alertmanager    ClusterIP   10.102.247.215   <none>        5080/TCP            71m
openobserve-compactor       ClusterIP   10.96.24.228     <none>        5080/TCP            71m
openobserve-etcd            ClusterIP   10.103.96.225    <none>        2379/TCP,2380/TCP   71m
openobserve-etcd-headless   ClusterIP   None             <none>        2379/TCP,2380/TCP   71m
openobserve-ingester        ClusterIP   10.108.17.186    <none>        5080/TCP            71m
openobserve-minio           ClusterIP   10.108.196.221   <none>        9000/TCP            71m
openobserve-minio-console   ClusterIP   10.103.65.90     <none>        9001/TCP            71m
openobserve-minio-svc       ClusterIP   None             <none>        9000/TCP            71m
openobserve-querier         ClusterIP   10.99.221.44     <none>        5080/TCP            71m
openobserve-router          ClusterIP   10.101.230.112   <none>        5080/TCP            71m
$ kubectl get ingress -n openobserve
NAME                        CLASS   HOSTS             ADDRESS       PORTS   AGE
openobserve                 nginx   oo.k8s.local      10.98.12.94   80      53m
openobserve-minio-console   nginx   minio.k8s.local   10.98.12.94   80      53m

可以看到 OpenObserve 的几个组件 Router、Querier、Ingester、Alertmanager、Compactor、Minio、Etcd 都已经正常运行了,此外我们为 MinIO 和 OpenObserve 都添加了 Ingress,只需要将 ​​oo.k8s.local​​​ 和 ​​minio.k8s.local​​ 映射到 Ingress 控制器即可访问。

比如现在我们可以通过 ​​minio.k8s.local​​ 来访问 MINIO 的 UI 界面:

OpenObserve HA模式安装配置-鸿蒙开发者社区

使用用户名 ​​rootuser​​​ 和密码 ​​rootpass123​​ 即可登录成功。

可以看到指定的 ​​openobserve​​ bucket 也已经创建成功了:

OpenObserve HA模式安装配置-鸿蒙开发者社区

同样我们也可以通过 ​oo.k8s.local​ 来访问 OpenObserve 的 UI 界面:

OpenObserve HA模式安装配置-鸿蒙开发者社区

只是现在还没有任何数据:

OpenObserve HA模式安装配置-鸿蒙开发者社区

接下来我们只需要将前面日志、指标、链路追踪的数据发送到新的 OpenObserve 地址 ​​http://openobserve-router.openobserve.svc.cluster.local:5080​​ 即可,比如前面我们已经部署的 Fluentd,只需要将日志输出地址修改即可:

# fluentd.yaml
# ...... 省略部分配置
output.conf: |-
  <match **>
    @type http # 使用http插件
    endpoint http://openobserve-router.openobserve:5080/api/default/K8sLogs/_json # 指定接收日志的地址
    content_type json
    json_array true
    <auth>
      method basic
      username root@example.com
      password root321
    </auth>
    <buffer>
      flush_interval 2s   # 每2秒发送一次
    </buffer>
  </match>

然后重启 fluentd 即可,隔一会儿就可以在 OpenObserve 的 UI 界面中看到日志数据了:

OpenObserve HA模式安装配置-鸿蒙开发者社区

同样对于 Prometheus 也是一样的,只需要修改 Prometheus 的配置文件中的远程写入地址即可:

remote_write: # 写入到远程 OO,url 是远程写入接口地址
  - url: http://openobserve-router.openobserve:5080/api/default/prometheus/api/v1/write
    basic_auth:
      username: root@example.com
      password: root321

OpenObserve HA模式安装配置-鸿蒙开发者社区

对于链路追踪数据也是一样的,只需要修改 OpenTelemetry Collector 的配置文件中的远程写入地址即可。

最后我们可以去 MINIO 中验证下数据是否已经写入到对象存储中了:

OpenObserve HA模式安装配置-鸿蒙开发者社区


OpenObserve HA模式安装配置-鸿蒙开发者社区

不过需要注意的是数据并不是实时上传到对象存储中的,默认 10 分钟或者 WAL 达到 32MB 后会上传一次。

到这里 OpenObserve 的 HA 模式就部署完成了,我们可以根据需要设置各个组件的副本数量进行横向扩展,也可以启用 HPA 来自动扩缩容。

其他更多功能请参考官方文档 ​​https://openobserve.ai/docs/​​ 以了解更多相关信息。


文章转载自公众号:k8s技术圈

分类
已于2023-11-22 14:53:29修改
收藏
回复
举报
回复
    相关推荐