KubeSphereログのバックアップとリカバリの実践


なぜログバックアップが必要なのか


KubeSphereログシステムはFluent Bit+ElasticSearchのログ収集ストレージスキームを使用し、CuratorによってIndexのライフサイクル管理を実現し、定期的に古いログをクリーンアップします.ログ監査と災害準備の必要性があるシーンでは、KubeSphereのデフォルトの7日間のログ保持ポリシーは十分ではありません.ElasticSearchデータディスクをバックアップするだけでは、データのリカバリ性と完全性を保証することはできません.
ElasticSearchオープンソースコミュニティは、SnapShot APIを提供し、長期的なストレージスナップショットとリカバリを実現します.この文書では、KubeSphere(バージョン2.1.0)内蔵ElasticSearch(バージョン6.7.0)コンポーネントを改造し、監査と災害準備のニーズを満たすためにログバックアップを実行する方法について説明します.
注意:データ量が少なく、クエリー条件付きのログでシーンをエクスポートする場合は、KubeSphereワンタッチでエクスポートするか、elasticsearch-dumpツールを使用してみてください.市販版ElasticSearchのKubeSphereユーザーは、ElasticSearch X-Packで提供されているSnapShot Lifecycle Management機能を直接開くこともできます.

前提条件


スナップショットを保存する前に、ElasticSearchクラスタにスナップショットファイルを保存する倉庫を登録する必要があります.スナップショット・ウェアハウスでは、NFSなどの共有ファイル・システムを使用できます.AWS 3などの他のストレージタイプは、repositoryプラグインサポートを個別にインストールする必要があります.
私たちはNFSを例に挙げます.共有スナップショット・ウェアハウスは、ElasticSearchのすべてのプライマリ・ノードとデータ・ノードにマウントし、elasticsearchにマウントする必要があります.yamlでpathを構成する.repoパラメータ.NFSはReadWriteManyアクセスモードをサポートしているので、NFSを使用するのに適しています.
まず、このチュートリアルで使用するQingCloud vNASサービスなどのNFSサービスを用意します.共有ディレクトリパスは/mnt/shared_です.dir.
それからKubeSphere環境でNFSタイプのStorageClassを用意して、後でスナップショット倉庫のためにPersistent Volumeを申請するときに使います.この環境では、インストール時にNFSストレージが構成されているので、追加の操作は必要ありません.インストールに必要な読者はKubeSphere公式ドキュメントを参照してconf/commonを変更してください.yamlはinstallを再実行します.shスクリプト.

1. ElasticSearch Setup


KubeSphereでは、ElasticSearchマスターノードはステータスコピーセットelasticsearch-logging-discovery、データノードはelasticsearch-logging-dataであり、このチュートリアル環境はプライマリとセカンダリです.
$ kubectl get sts -n kubesphere-logging-system
NAME                              READY   AGE
elasticsearch-logging-data        2/2     18h
elasticsearch-logging-discovery   1/1     18h

まず、ElasticSearchクラスタsnapshot repositoryの永続化ボリュームを用意します.
cat <

ステップ2でelasticsearchを変更します.ymlプロファイルは、NFSディレクトリパスを各プライマリスレーブノードに登録します.KubeSphereではelasticsearch.ymlはConfigMap elasticsearch-loggingに配置されています.最後の行にpath.repo: ["/usr/share/elasticsearch/backup"]を追加
ステップ3では、StatefulSet YAMLを変更し、ストレージボリュームをElasticSearchの各ノードにマウントし、chownコマンドによりinitContainer起動時にスナップショットウェアハウスフォルダの所有者ユーザーとユーザーグループをelasticsearchに初期化します.
このステップで特に注意しなければならないのは、Statefulを直接kubectl editで修正することはできません.yamlコンテンツをバックアップしてからkubectl applyを再適用する必要があります.
kubectl get sts -n kubesphere-logging-system elasticsearch-logging-data -oyaml > elasticsearch-logging-data.yml
kubectl get sts -n kubesphere-logging-system elasticsearch-logging-discovery -oyaml > elasticsearch-logging-discovery.yml

yamlファイルを変更して、上で生成したelasticsearch-logging-dataを変更します.ymlを例にとると、プライマリノードのyamlファイルと同じように変更されます.
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    #  , 
    # ...
  name: elasticsearch-logging-data
  namespace: kubesphere-logging-system  
  # -------------------------------------------------
  #     labels、name、namespace     
  # ------------------------------------------------- 
  # resourceVersion: "109019"
  # selfLink: /apis/apps/v1/namespaces/kubesphere-logging-system/statefulsets/elasticsearch-logging-data
  # uid: 423adffe-271f-4657-9078-1a75c387eedc
spec:
  # ...
  template:
    # ...
    spec:
      # ...
      containers:
      - name: elasticsearch
        # ...
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: data
        # --------------------------
        #     backup Volume     
        # --------------------------
        - mountPath: /usr/share/elasticsearch/backup
          name: backup  
        - mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
          name: config
          subPath: elasticsearch.yml
        # ...
      initContainers:
      - name: sysctl
        # ...
      - name: chown
        # --------------------------------------
        #     command,    
        # --------------------------------------
        command:
        - /bin/bash
        - -c
        - |
          set -e; set -x; chown elasticsearch:elasticsearch /usr/share/elasticsearch/data; for datadir in $(find /usr/share/elasticsearch/data -mindepth 1 -maxdepth 1 -not -name ".snapshot"); do
            chown -R elasticsearch:elasticsearch $datadir;
          done; chown elasticsearch:elasticsearch /usr/share/elasticsearch/logs; for logfile in $(find /usr/share/elasticsearch/logs -mindepth 1 -maxdepth 1 -not -name ".snapshot"); do
            chown -R elasticsearch:elasticsearch $logfile;
          done; chown elasticsearch:elasticsearch /usr/share/elasticsearch/backup; for backupdir in $(find /usr/share/elasticsearch/backup -mindepth 1 -maxdepth 1 -not -name ".snapshot"); do
            chown -R elasticsearch:elasticsearch $backupdir;
          done
        # ...
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: data
        # --------------------------
        #     backup Volume     
        # --------------------------
        - mountPath: /usr/share/elasticsearch/backup
          name: backup  
      # ...
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      - effect: NoSchedule
        key: dedicated
        value: log
      volumes:
      - configMap:
          defaultMode: 420
          name: elasticsearch-logging
        name: config
      # -----------------------
      #     PVC   
      # -----------------------
      - name: backup
        persistentVolumeClaim:
          claimName: elasticsearch-logging-backup
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: nfs-client
      volumeMode: Filesystem
# --------------------------------------
#     status     
# --------------------------------------
#     status:
#       phase: Pending
# status:
#   ...

変更後、ElasticSearch StatefulSetを削除し、新しいyamlを再適用できます.
kubectl delete sts -n kubesphere-logging-system elasticsearch-logging-data
kubectl delete sts -n kubesphere-logging-system elasticsearch-logging-discovery

kubectl apply -f elasticsearch-logging-data.yml
kubectl apply -f elasticsearch-logging-discovery.yml

最後に、ElasticSearchのすべてのノードが起動するのを待って、Snapshot APIを呼び出してks-log-snapshotsというrepositoryを作成し、圧縮機能をオンにします.
curl -X PUT "elasticsearch-logging-data.kubesphere-logging-system.svc:9200/_snapshot/ks-log-snapshots?pretty" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/usr/share/elasticsearch/backup",
    "compress": true
  }
}
'

「acknowledged」を返します.trueは成功を表します.これで、ElasticSearchクラスタスナップショット機能の準備が整いました.後で、Snapshot APIをタイミング的に呼び出すだけでインクリメンタルバックアップを実現できます.ElasticSearch自動インクリメンタルバックアップは、Curatorによって実行できます.

2.Curatorタイミングスナップショットの使用


ElasticSearch Curatorは、ElasticSearchインデックスとスナップショットの管理を支援します.次に、Curatorを使用して、タイミングログの自動バックアップを行います.KubeSphereログコンポーネントのデフォルトには、インデックスを管理するためにCurator(CronJobとして配置され、毎日午前1時に実行される)が含まれています.同じCuratorを使用することができます.Curatorの実行規則はConfigMapで見つけることができます.
ここではaction_file.ymlフィールド値に2つのactionを追加:snapshotとdelete_snapshots.このルールの優先度をdelete_に上げますindices前.この構成では、snapshotの作成方法をsnapshot-%Y%m%d%H%M%Sと規定し、45日間snapshotsを保持します.具体的なパラメータの意味は、Curator Referenceを参照してください.
actions:
  1:
    action: snapshot
    description: >-
      Snapshot ks-logstash-log prefixed indices with the default snapshot 
      name pattern of 'snapshot-%Y%m%d%H%M%S'.
    options:
      repository: ks-log-snapshots
      name: 'snapshot-%Y%m%d%H%M%S'
      ignore_unavailable: False
      include_global_state: True
      partial: False
      wait_for_completion: True
      skip_repo_fs_check: False
      # If disable_action is set to True, Curator will ignore the current action
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      # You may change the index pattern below to fit your case
      value: ks-logstash-log-
  2: 
    action: delete_snapshots
    description: >-
      Delete snapshots from the selected repository older than 45 days
      (based on creation_date), for 'snapshot' prefixed snapshots.
    options:
      repository: ks-log-snapshots
      ignore_empty_list: True
      # If disable_action is set to True, Curator will ignore the current action
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: snapshot-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y%m%d%H%M%S'
      unit: days
      unit_count: 45
  3:
    action: delete_indices
    #  
    # ...

3.ログのリカバリと表示


数日前のログを振り返る必要がある場合は、11月12日のログなどのスナップショットでリカバリできます.まず、最新のSnapshotをチェックする必要があります.
curl -X GET "elasticsearch-logging-data.kubesphere-logging-system.svc:9200/_snapshot/ks-log-snapshots/_all?pretty"

次に、指定した日付のインデックスを最新のSnapshotで復元します(すべてを復元することもできます).このAPIはログインデックスをデータディスクに復元するので、データディスクのストレージ容量が十分であることを確認してください.また、対応するPVを直接バックアップしたり(Snapshot倉庫対応のストレージボリュームは直接バックアップに使用できます)、他のElasticSearchクラスタにマウントしたり、ログを他のElasticSearchクラスタに復元したりして使用することもできます.
curl -X POST "elasticsearch-logging-data.kubesphere-logging-system.svc:9200/_snapshot/ks-log-snapshots/snapshot-20191112010008/_restore?pretty" -H 'Content-Type: application/json' -d'
{
  "indices": "ks-logstash-log-2019.11.12",
  "ignore_unavailable": true,
  "include_global_state": true,
}
'

ログの大きさによって、待つ時間は数分で異なります.KubeSphereログDashboardでログを表示できます.

リファレンスドキュメント


ElasticSearch Reference: Snapshot And Restore
Curator Reference: snapshot

Meetup予告


KubeSphere (https://github.com/kubesphere...はアプリケーション中心のオープンソースコンテナ管理プラットフォームであり、あらゆるインフラストラクチャの上に配置されることをサポートし、使いやすいUIを提供し、日常開発、テスト、メンテナンスの複雑さを極めて軽減し、Kubernetes自体に存在するストレージ、ネットワーク、セキュリティ、使いやすさなどの痛みを解決し、企業が迅速な開発と自動化監視メンテナンス、エンドツーエンドアプリケーションの提供、マイクロサービス管理、マルチテナント管理、マルチクラスタ管理、サービスとネットワーク管理、ミラー倉庫、AIプラットフォーム、エッジコンピューティングなどの業務シーン.