DUICUO

Redis シングルノード Rdb データ永続性障害ドリルリカバリの K8S デプロイメント

[[431421]]

環境:


背景: Redis に保存する必要があるファイルを永続的に保存するために、NFS ストレージ ボリュームを使用しています。

I. NFSサーバーの導入

  1. # NFS ストレージ機能を提供するために、サーバーに NFS サービスをインストールします。
  2. 1. nfs-utilsをインストールする
  3. yum で nfs-utils をインストール (CentOS)
  4. あるいは、`apt-get install nfs-kernel-server` (Ubuntu の場合) を使用することもできます。
  5.  
  6. 2. サービスを開始する
  7. systemctl nfs-server を有効にする
  8. systemctl nfs-server を起動する
  9.  
  10. 3. 共有ディレクトリを作成し、共有設定を完了します。
  11. mkdir /home/nfs # 共有ディレクトリを作成する
  12.  
  13. 4. 共有設定を編集する
  14. vim /etc/exports
  15. #構文: 共有ファイルパス クライアントアドレス (権限) #ここでのクライアントアドレスには、IP アドレス、ネットワークセグメント、ドメイン名、またはその他の任意の値を指定できます。
  16. /home/nfs *(rw、非同期、ルートスカッシュなし)
  1. サービスセルフテストコマンド
  2. エクスポートfs -arv
  3.  
  4.  
  5. 5. サービスを再起動する
  6. systemctl nfs-server を再起動します。
  7.  
  8.  
  9. 6. ローカルマシン上のNFS共有ディレクトリを表示する
  10. #showmount -e server_IP_address (コマンドが存在しない場合は、yumを使用してshowmountをインストールする必要があります)
  11.  
  12. ショーマウント -e 127.0.0.1
  13. /ホーム/nfs *
  14.  
  15.  
  16.  
  17. 7. クライアント側のシミュレートされたマウント [クライアントはすべてのKubernetesノードにインストールされている必要があります]
  18. [root@master-1 ~]# yum install nfs-utils (centos)
  19. あるいは、`apt-get install nfs-common` (Ubuntu の場合) を使用することもできます。
  20. [root@master-1 ~]# mkdir /test
  21. [root@master-1 ~]# マウント -t nfs 172.16.201.209:/home/nfs /test
  22.  
  23. #アンマウント
  24. [root@master-1 ~]# /test をアンマウントする

2. PV 動的プロビジョニング (NFS StorageClass) を構成し、PVC を作成します。

#NFS をデプロイして PV プラグインを自動的に作成する: これには合計 4 つの YAML ファイルが関係しており、公式ドキュメントで詳細に説明されています。

https://github.com/kubernetes-incubator/外部ストレージ



  1. root@k8s-master1:~ # mkdir /root/pvc
  2. root@k8s-master1:~ # cd /root/pvc

rbac.yamlファイルを作成する

  1. root@k8s-master1:pvc # cat rbac.yaml
  2. 種類: サービスアカウント
  3. apiバージョン: v1
  4. メタデータ:
  5. 名前: nfs-client-provisioner
  6. ---  
  7. 種類: ClusterRole
  8. apiバージョン: rbac. authorization.k8s.io/v1
  9. メタデータ:
  10. 名前: nfs-client-provisioner-runner
  11. ルール:
  12. - apiグループ: [ "" ]
  13. リソース: [ "persistentvolumes" ]
  14. 動詞: [ 「取得」 「一覧表示」 「監視」 「作成」 「削除」 ]
  15. - apiグループ: [ "" ]
  16. リソース: [ "persistentvolumeclaims" ]
  17. 動詞: [ "get" "list" "watch" "update" ]
  18. - apiグループ: [ "storage.k8s.io" ]
  19. リソース: [ "ストレージクラス" ]
  20. 動詞: [ "get" "list" "watch" ]
  21. - apiグループ: [ "" ]
  22. リソース: [ "イベント" ]
  23. 動詞: [ 「作成」 「更新」 「パッチ」 ]
  24. ---  
  25. 種類: ClusterRoleBinding
  26. apiバージョン: rbac. authorization.k8s.io/v1
  27. メタデータ:
  28. 名前: run-nfs-client-provisioner
  29. 科目:
  30. - 種類: サービスアカウント
  31. 名前: nfs-client-provisioner
  32. 名前空間:デフォルト 
  33. ロールリファレンス:
  34. 種類: ClusterRole
  35. 名前: nfs-client-provisioner-runner
  36. apiグループ: rbac.authorization.k8s.io
  37. ---  
  38. 種類: 役割
  39. apiバージョン: rbac. authorization.k8s.io/v1
  40. メタデータ:
  41. 名前: リーダーロックNFSクライアントプロビジョナー
  42. ルール:
  43. - apiグループ: [ "" ]
  44. リソース: [ "エンドポイント" ]
  45. 動詞: [ "get" "list" "watch" "create" "update" "patch" ]
  46. ---  
  47. 種類: ロールバインディング
  48. apiバージョン: rbac. authorization.k8s.io/v1
  49. メタデータ:
  50. 名前: リーダーロックNFSクライアントプロビジョナー
  51. 科目:
  52. - 種類: サービスアカウント
  53. 名前: nfs-client-provisioner
  54. 交換する プロビジョナーデプロイされている名前空間
  55. 名前空間:デフォルト 
  56. ロールリファレンス:
  57. 種類: 役割
  58. 名前: リーダーロックNFSクライアントプロビジョナー
  59. apiグループ: rbac.authorization.k8s.io

デプロイメント.yamlファイルを作成する

#中国では公式のデフォルトミラーアドレスはダウンロードできない可能性があります。以下のイメージをご利用ください。

fxkjnj/nfs-client-provisioner:最新

# NFSサーバーのアドレスと共有ディレクトリ名を定義する

  1. root@k8s-master1:pvc # デプロイメント.yamlをcatします
  2. apiバージョン: v1
  3. 種類: サービスアカウント
  4. メタデータ:
  5. 名前: nfs-client-provisioner
  6. ---  
  7. 種類: デプロイメント
  8. apiバージョン: apps/v1
  9. メタデータ:
  10. 名前: nfs-client-provisioner
  11. 仕様:
  12. レプリカ: 1
  13. 戦略:
  14. タイプ: 再作成
  15. セレクタ:
  16. 一致ラベル:
  17. アプリ: nfs-client-provisioner
  18. テンプレート:
  19. メタデータ:
  20. ラベル:
  21. アプリ: nfs-client-provisioner
  22. 仕様:
  23. サービスアカウント名: nfs-client-provisioner
  24. コンテナ:
  25. -名前: nfs-client-provisioner
  26. イメージ: fxkjnj/nfs-client-provisioner:latest
  27. ボリュームマウント:
  28. -名前: nfs-client-root
  29. マウントパス: /persistentvolumes
  30. 環境:
  31. -名前: PROVISIONER_NAME
  32. 値: fuseim.pri/ifs
  33. -名前: NFS_SERVER
  34. 値: 172.16.201.209
  35. -名前: NFS_PATH
  36. 値: /home/nfs
  37. ボリューム:
  38. -名前: nfs-client-root
  39. nfs:
  40. サーバー: 172.16.201.209
  41. パス: /home/nfs

class.yamlを作成する

# archiveOnDelete: "true" は、PVC が削除されたときに、バックエンド データが直接削除されずにアーカイブされることを意味します。

  1. root@k8s-master1:pvc # cat クラス.yaml
  2. APIバージョン: storage.k8s.io/v1
  3. 種類: ストレージクラス
  4. メタデータ:
  5. 名前: マネージドNFSストレージ
  6. プロビジョナー: fuseim.pri/ifs #または別の名前を選択します。デプロイメントの env PROVISIONER_NAME と一致する必要があります。  
  7. パラメータ:
  8. アーカイブ削除時: "true"  

pvc.yaml を作成する

#ストレージボリュームの名前としてstorageClassNameを指定します

# リクエスト:

ストレージ: 100Gi 必要なストレージサイズを指定します。

#PVCインスタンスをRedis名前空間内に作成したことに注意してください。Redisが存在しない場合は、まず作成する必要があります: `kubectl create namespace redis`

  1. root@k8s-master1:pvc # cat pvc.yaml
  2. apiバージョン: v1
  3. 種類: PersistentVolumeClaim
  4. メタデータ:
  5. 名前: nfs-redis
  6. 名前空間: redis
  7. 仕様:
  8. ストレージクラス名: "managed-nfs-storage"  
  9. アクセスモード:
  10. - 読み書き多数
  11. リソース:
  12. リクエスト:
  13. ストレージ: 100Gi
  1. #展開する
  2. root@k8s-master1:pvc # kubectl apply -f 。
  3.  
  4.  
  5. #ストレージボリュームを表示
  6. root@k8s-master1:pvc # kubectl get sc
  7. 名前プロビジョナー RECLAIMPOLICY ボリュームバインドモード ALLOWVOLUMEEXPANSION 年齢
  8. managed-nfs-storage fuseim.pri/ifs即時削除false 25h
  9.  
  10.  
  11. #PVCを見る
  12. root@k8s-master1:pvc # kubectl get pvc -n redis
  13. 名前ステータス ボリューム 容量 アクセスモード ストレージクラス 年齢
  14. nfs-redis バインドされた pvc-8eacbe25-3875-4f78-91ca-ba83b6967a8a 100Gi RWX 管理された nfs-storage 21 時間

III. Redis YAMLファイルの記述

  1. root@k8s-master1:~ # mkdir /root/redis
  2. root@k8s-master1:~ # cd /root/redis

redis.conf 構成ファイルを書き込み、configmap としてコンテナにマウントします。

# require Redis パスワードの設定

#save 5 1 は、キーの変更が 5 秒ごとに dump.rdb ファイルに書き込まれることを意味します。

# appendonly no は、次回に dump.rdb を使用して Redis スナップショット データを復元できることを示します。

# 名前空間が redis であることに注意してください

  1. root@k8s-master1: redis# cat redis-configmap-rdb.yml
  2. 種類: ConfigMap
  3. apiバージョン: v1
  4. メタデータ:
  5. 名前: redis-config
  6. 名前空間: redis
  7. ラベル:
  8. アプリ: Redis
  9. データ:
  10. redis.conf: |-
  11. 保護モードなし 
  12. ポート6379
  13. TCPバックログ511
  14. タイムアウト0
  15. TCP キープアライブ 300
  16. 悪魔化しない 
  17. 監督なし 
  18. pidファイル /data/redis_6379.pid
  19. ログレベル通知
  20. ログファイル""  
  21. データベース 16
  22. 常にロゴを表示する
  23. 5 1 を節約
  24. 300 10 節約
  25. 60 10000を節約
  26. stop-writes- on -bgsave-error yes
  27. rdb圧縮はい
  28. rdbchecksum はい
  29. dbファイル名 dump.rdb
  30. ディレクトリ /data
  31. レプリカサーブ古データ はい
  32. レプリカ読み取り専用はい
  33. repl-diskless-syncいいえ 
  34. repl-ディスクレス同期遅延 5
  35. repl-disable-tcp-nodelayなし 
  36. レプリカ優先度100
  37. 要求パス 123
  38. レイジーフリー・レイジーエビクション・ノー 
  39. lazyfree-lazy-expireなし 
  40. lazyfree-lazy-server-del no  
  41. レプリカ遅延フラッシュなし 
  42. 追加のみいいえ 
  43. 追加ファイル名「appendonly.aof」  
  44. 毎秒appendfsync
  45. -appendfsync-オン-rewriteなし 
  46. 自動Aof書き換え率 100
  47. auto-aof-rewrite- min -サイズ64MB
  48. aof-ロード- 切り捨て はい
  49. aof-use-rdb-preamble はい
  50. lua-時間制限 5000
  51. slowlog-log-slower-than-10000
  52. slowlog- max -len 128
  53. レイテンシモニターしきい値 0
  54. キースペースイベント通知""  
  55. ハッシュ最大zipリストエントリ数512
  56. ハッシュ最大値 -ziplist値 64
  57. リスト-最大-ziplist-サイズ-2
  58. リスト圧縮深度 0
  59. セット-最大 - intset-entries 512
  60. zset- max- ziplist-entries 128
  61. zset- max -ziplist-value 64
  62. hll-sparse- max -bytes 3000
  63. ストリームノード-max -bytes 4096
  64. ストリームノード-max -entries 100
  65. アクティブリハッシュ はい
  66. クライアント出力バッファ制限 通常 0 0 0
  67. クライアント出力バッファ制限レプリカ 256MB 64MB 60
  68. クライアント出力バッファ制限 pubsub 32mb 8mb 60
  69. 10 Hz
  70. ダイナミック-hz はい
  71. aof-rewrite-incremental-fsync はい
  72. rdb-save-incremental-fsync はい

redis-deployment.yml を書く

#名前空間がredisであることに注意してください

  1. root@k8s-master1: redis# cat redis-deployment.yml
  2. apiバージョン: apps/v1
  3. 種類: デプロイメント
  4. メタデータ:
  5. 名前: レディス
  6. 名前空間: redis
  7. ラベル:
  8. アプリ: Redis
  9. 仕様:
  10. レプリカ: 3
  11. セレクタ:
  12. 一致ラベル:
  13. アプリ: Redis
  14. テンプレート:
  15. メタデータ:
  16. ラベル:
  17. アプリ: Redis
  18. 仕様:
  19. # 初期化操作を実行し、システム構成を変更し、Redis の起動時に表示される警告メッセージを解決します。
  20. 初期化コンテナ:
  21. -名前: システム初期化
  22. 画像: ビジーボックス:1.32
  23. imagePullPolicy: IfNotPresent
  24. 指示:
  25. - 「しーっ」  
  26. - 「-c」  
  27. - 「echo 2048 > /proc/sys/net/core/somaxconn && echo never > /sys/kernel/mm/transparent_hugepage/enabled」  
  28. セキュリティコンテキスト:
  29. 特権: true  
  30. 実行ユーザー: 0
  31. ボリュームマウント:
  32. -名前: sys
  33. マウントパス: /sys
  34. コンテナ:
  35. -名前: redis
  36. 画像: Redis: 5.0.8
  37. 指示:
  38. - 「しーっ」  
  39. - 「-c」  
  40. - "redis-server /usr/local/etc/redis/redis.conf"  
  41. ポート:
  42. - コンテナポート: 6379
  43. リソース:
  44. 制限:
  45. CPU: 1000m
  46. メモリ: 1024Mi
  47. リクエスト:
  48. CPU: 1000m
  49. メモリ: 1024Mi
  50. ライブネスプローブ:
  51. tcpソケット:
  52. ポート: 6379
  53. 初期遅延秒数: 300
  54. タイムアウト秒数: 1
  55. 期間秒数: 10
  56. 成功しきい値: 1
  57. 失敗しきい値: 3
  58. 準備プローブ:
  59. tcpソケット:
  60. ポート: 6379
  61. 初期遅延秒数: 5
  62. タイムアウト秒数: 1
  63. 期間秒数: 10
  64. 成功しきい値: 1
  65. 失敗しきい値: 3
  66. ボリュームマウント:
  67. -名前: データ
  68. マウントパス: /data
  69. -名前: 設定
  70. マウントパス: /usr/ローカル/etc/redis/redis.conf
  71. サブパス: redis.conf
  72. ボリューム:
  73. -名前: データ
  74. 永続ボリュームクレーム:
  75. クレーム名: nfs-redis
  76. -名前: 設定
  77. 構成マップ:
  78. 名前: redis-config
  79. -名前: sys
  80. ホストパス:
  81. パス: /sys

redis-service.yml を書く

#名前空間がredisであることに注意してください

  1. #展開する
  2. root@k8s-master1:~/kubernetes/redis# kubectl get pod -n redis
  3. 名前準備完了 ステータス 再起動 年齢
  4. redis-65f75db6bc-5skgr 1/1 実行中 0 21時間
  5. redis-65f75db6bc-75m8m 1/1 実行中 0 21時間
  6. redis-65f75db6bc-cp6cx 1/1 実行中 0 21時間
  7.  
  8. root@k8s-master1:~/kubernetes/redis# kubectl get svc -n redis
  9. 名前タイプ クラスタIP 外部IP ポート 年齢
  10. redis-front ノードポート 10.0.0.169 <なし> 6379:36379/TCP 22時間

IV. 検査とアクセス

Redis クライアント ツールを使用して、テスト用のキーをいくつか書き込みます。



ポッドを削除して自動的に再度作成した後、キーと値のペアが存在するかどうかを確認します。

  1. root@k8s-master1:~# kubectl get pods -n redis
  2. 名前準備完了 ステータス 再起動 年齢
  3. redis-65f75db6bc-5skgr 1/1 実行中 0 5d20h
  4. redis-65f75db6bc-75m8m 1/1 実行中 0 5d20h
  5. redis-65f75db6bc-cp6cx 1/1 実行中 0 5d20h
  6.  
  7. root@k8s-master1:~# kubectl delete -n redis ポッド redis-65f75db6bc-5skgr
  8. ポッド「redis-65f75db6bc-5skgr」が削除されました
  9.  
  10.  
  11. #ポッドを削除した後、レプリカの数に基づいて新しいポッドが取得され、生成されます。
  12. root@k8s-master1:~# kubectl get pods -n redis
  13. 名前準備完了 ステータス 再起動 年齢
  14. redis-65f75db6bc-tnnxp 1/1 実行中 0 54秒
  15. redis-65f75db6bc-75m8m 1/1 実行中 0 5d20h
  16. redis-65f75db6bc-cp6cx 1/1 実行中 0 5d20h

NFS 共有ディレクトリに dump.rdb が存在するかどうかを確認します。


V. 断層掘削による復旧

(1)データのバックアップ

ソース Redis インスタンスは永続性のために構成されているため、永続性ディレクトリから dump.rdb ファイルをコピーするだけです。

永続ディレクトリに直接移動し、dump.rdb ファイルをコピーします。

ソース Redis が永続性をサポートしていない場合は、コンテナ内に dump.rdb ファイルが生成され、コピーされます。

コンテナに入ります: kubectl exec -it redis-xxx /bin/bash -n redis

Redis コマンドプロンプトにアクセスします: redis-cli

パスワード認証: auth 123

データを保存し、dump.rdbファイルを生成します: save

Redisコマンドコンソールを終了します: quit

コンテナを終了する: exit

コンテナからローカルマシンにデータを取得します: `kubectl cp -n redis Pod_Name:/data/dump.rdb ./`

リモートホストに転送: scp dump.rdb root@targetserver:/directory

(2)データ復旧

  • Redis を停止し、作成されたデプロイメントを直接削除します。
  • dump.rdb をターゲット Redis インスタンスの永続ディレクトリにコピーします (注: これにより、ターゲット Redis インスタンスのデータが上書きされます)。
  • ポッドを再起動します: kubectl apply -f redis-deployment.yml
  1. # 永続ディレクトリから dump.rbd ファイルをルートにコピーします。
  2. cp dump.rdb /root
  3.  
  4. #Redisを停止します。つまり、デプロイメントを削除します。
  5. root@k8s-master1:~/kubernetes/redis# kubectl delete -f redis-deployment.yml
  6. deployment.apps 「redis」が削除されました
  7.  
  8. root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
  9. Redis 名前空間リソースが見つかりません
  10.  
  11. # dump.rdb をターゲット Redis インスタンスの永続ディレクトリにコピーします。
  12. cp /root/dump.rdb /home/nfs/redis-nfs-redis-pvc-8eacbe25-3875-4f78-91ca-ba83b6967a8a
  13.  
  14. #ポッドを再起動
  15. root@k8s-master1:~/kubernetes/redis# kubectl apply -f redis-deployment.yml
  16. deployment.apps/redis が作成されました
  17.  
  18. root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
  19. 名前準備完了 ステータス 再起動 年齢
  20. redis-65f75db6bc-5jx4m 0/1 初期化:0/1 0 3s
  21. redis-65f75db6bc-68jf5 0/1 初期化:0/1 0 3s
  22. redis-65f75db6bc-b9gvk 0/1 初期化:0/1 0 3s
  23.  
  24. root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
  25. 名前準備完了 ステータス 再起動 年齢
  26. redis-65f75db6bc-5jx4m 1/1 実行中 0 20秒
  27. redis-65f75db6bc-68jf5 1/1 実行中 0 20秒
  28. redis-65f75db6bc-b9gvk 1/1 実行中 0 20秒

(3)データを検証すると、元のRedisソースのすべてのデータが再現されていることがわかります。