我想在Kubernetes上的Elasticsearch上进行快照

首先

因為我也想在居家的 Kubernetes Elasticsearch 做資料備份,所以我開始學習如何使用快照。

前提条件

以下是根据这篇文章构建的环境。我们会定期更新elasticsearch到最新版本。

此外,我們也使用Synology的NAS作為NFS持久性儲存器。

创建snapshot库。

我家的elasticsearch是通过statefulset部署在3个节点上的,因此需要使用支持同时读写的可持久化存储进行设置。也就是说,需要使用支持ReadWriteMany的卷插件。

因为我已经在家中使用了Ceph,所以Ceph看起来也不错。但是这次为了备份以应对Ceph的故障,我想要使用我家NAS上可用的共享服务NFS。

创建NFS持久存储(PV、PVC)。

因为要保存在NFS(NAS)上,所以创建NFS的持久卷(NFS共享已创建)。为了让所有节点都能进行读写操作,将accessModes设置为“ReadWriteMany”。这是第一次使用它…

apiVersion: v1
kind: PersistentVolume
metadata:
  name: es-snapshot-pv
spec:
  capacity:
    storage: 300Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs-es-snapshot
  mountOptions:
    - hard
  nfs:
    server: 192.168.1.4
    path: /volume1/elastic_backup

对于PVC,将accessModes设置为”ReadWriteMany”。
※作为个人操作策略,我将PVC的容量设置为与PV相同,并将PV和PVC配对成1对1。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-snapshot-pvc
  namespace: elastic
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 300Gi
  storageClassName: nfs-es-snapshot

我会申请双方。

# kubectl apply -f es-snapshot-pv.yaml
# kubectl apply -f es-snapshot-pvc.yaml

将文件系统挂载到elasticsearch容器中

Elasticsearch的清单文件前提如下所述。在此编辑statefulset的yaml文件。

作为编辑的内容是:
– 在elasticsearch容器的环境变量“path.repo”中指定用于快照的目录
– 将之前创建的NFS永久存储卷挂载到elasticsearch容器的快照目录中
– 为了将包括快照在内的文件创建为elastic用户所拥有,需要在securityContext.fsGroup中指定elastic用户的UID。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: elastic
spec:
  selector:
    matchLabels:
      app: elasticsearch
  serviceName: "elasticsearch"
  replicas: 3
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      initContainers:
      # 略
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
        # 略
        env:
# envにelasticsearchの環境変数path.repoを追記
        - name: path.repo
          value: /es-snapshot
        volumeMounts:
# volumeMountsに/es-snapshotにmountする定義を追記
        - name: es-snapshot
          mountPath: /es-snapshot
      volumes:
# volumesにNFSのpvcを追記
        - name: es-snapshot
          persistentVolumeClaim:
            claimName: es-snapshot-pvc
# securityContextのfsGroupを1000(elasticsearchコンテナ内でのelasticユーザ)に設定
      securityContext:
        fsGroup: 1000
    # 略

因为胆小,所以先完全停止并删除,然后再应用(应用没有意义)。

# kubectl delete -f elasticsearch-sts-sec.yaml
# kubectl apply -f elasticsearch-sts-sec.yaml

快照存储库的注册

使用elasticsearch的快照存储库API来注册存储库。

我是从Node-RED注册的,但是我想使用curl命令可能会是这样的(尚未确认)。

# curl -H 'Content-Type: application/json' -XPUT -u elastic http://elasticsearch:9200/_snapshot/full -d '
{
    "type" : "fs",
    "settings" : {
        "location" : "/es-snapshot/snapshot",
        "compress" : true
    }
}'

确认操作

通过在存储库中创建类似于elasticsearch中的文档,将快照(备份)采集。通过在indices中指定“*”,采集所有索引的快照。

# curl -H 'Content-Type: application/json' -XPUT -u elastic http://elasticsearch:9200/_snapshot/full/full_2021-04-27_120000 -d '
{
    "indices": "*",
    "ignore_unavailable": true,
    "include_global_state": false
}'

您可以使用GET请求来查看所采取的快照。

# curl -XGET -u elastic http://elasticsearch:9200/_snapshot/full/\*?pretty
Enter host password for user 'elastic':
{
  "snapshots" : [
    {
      "snapshot" : "full_2021-04-27_120000",
      "uuid" : "hmFb8IzXSzOZpyynJtd29w",
      "version_id" : 7120099,
      "version" : "7.12.0",
      "indices" : [
        "ilm-history-3-000003",
        ".kibana-event-log-7.11.1-000003",
        "ilm-history-2-000003",
        ".kibana-event-log-7.11.0-000003",
        ".kibana-event-log-7.10.1-000004",
        "sensor-temperature",
        ".kibana-event-log-7.10.1-000002",
                 :

由于它是一个REST API,因此我认为可以将其集成到各种应用中以进行运营。

最后

在备份elasticsearch的时候,刚开始我以为可能只需要一个命令就能搞定,但实际上它是一款像正规的备份软件一样需要预先准备存储并采集的高级备份工具。这次我只触及了使用方便的部分直到备份完成的那一部分。

当前我在Node-RED上每天进行完全备份(实际上是自动差异备份)并自动删除旧备份。
虽然我没有详细确认其具体操作,但是似乎它会删除最旧的快照,然后将次旧的作为基准,看起来相当智能。

广告
将在 10 秒后关闭
bannerAds