KubeSphereログのバックアップとリカバリの実践
11518 ワード
なぜログバックアップが必要なのか
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プラットフォーム、エッジコンピューティングなどの業務シーン.