|
[[431421]] 環境:
背景: Redis に保存する必要があるファイルを永続的に保存するために、NFS ストレージ ボリュームを使用しています。 I. NFSサーバーの導入- # NFS ストレージ機能を提供するために、サーバーに NFS サービスをインストールします。
- 1. nfs-utilsをインストールする
- yum で nfs-utils をインストール (CentOS)
- あるいは、`apt-get install nfs-kernel-server` (Ubuntu の場合) を使用することもできます。
-
- 2. サービスを開始する
- systemctl nfs-server を有効にする
- systemctl nfs-server を起動する
-
- 3. 共有ディレクトリを作成し、共有設定を完了します。
- mkdir /home/nfs # 共有ディレクトリを作成する
-
- 4. 共有設定を編集する
- vim /etc/exports
- #構文: 共有ファイルパス クライアントアドレス (権限) #ここでのクライアントアドレスには、IP アドレス、ネットワークセグメント、ドメイン名、またはその他の任意の値を指定できます。
- /home/nfs *(rw、非同期、ルートスカッシュなし)
- サービスセルフテストコマンド
- エクスポートfs -arv
-
-
- 5. サービスを再起動する
- systemctl nfs-server を再起動します。
-
-
- 6. ローカルマシン上のNFS共有ディレクトリを表示する
- #showmount -e server_IP_address (コマンドが存在しない場合は、yumを使用してshowmountをインストールする必要があります)
-
- ショーマウント -e 127.0.0.1
- /ホーム/nfs *
-
-
-
- 7. クライアント側のシミュレートされたマウント [クライアントはすべてのKubernetesノードにインストールされている必要があります]
- [root@master-1 ~]# yum install nfs-utils (centos)
- あるいは、`apt-get install nfs-common` (Ubuntu の場合) を使用することもできます。
- [root@master-1 ~]# mkdir /test
- [root@master-1 ~]# マウント -t nfs 172.16.201.209:/home/nfs /test
-
- #アンマウント
- [root@master-1 ~]# /test をアンマウントする
2. PV 動的プロビジョニング (NFS StorageClass) を構成し、PVC を作成します。 #NFS をデプロイして PV プラグインを自動的に作成する: これには合計 4 つの YAML ファイルが関係しており、公式ドキュメントで詳細に説明されています。 https://github.com/kubernetes-incubator/外部ストレージ
- root@k8s-master1:~ # mkdir /root/pvc
- root@k8s-master1:~ # cd /root/pvc
rbac.yamlファイルを作成する - root@k8s-master1:pvc # cat rbac.yaml
- 種類: サービスアカウント
- apiバージョン: v1
- メタデータ:
- 名前: nfs-client-provisioner
-
- 種類: ClusterRole
- apiバージョン: rbac. authorization.k8s.io/v1
- メタデータ:
- 名前: nfs-client-provisioner-runner
- ルール:
- - apiグループ: [ "" ]
- リソース: [ "persistentvolumes" ]
- 動詞: [ 「取得」 、 「一覧表示」 、 「監視」 、 「作成」 、 「削除」 ]
- - apiグループ: [ "" ]
- リソース: [ "persistentvolumeclaims" ]
- 動詞: [ "get" 、 "list" 、 "watch" 、 "update" ]
- - apiグループ: [ "storage.k8s.io" ]
- リソース: [ "ストレージクラス" ]
- 動詞: [ "get" 、 "list" 、 "watch" ]
- - apiグループ: [ "" ]
- リソース: [ "イベント" ]
- 動詞: [ 「作成」 、 「更新」 、 「パッチ」 ]
-
- 種類: ClusterRoleBinding
- apiバージョン: rbac. authorization.k8s.io/v1
- メタデータ:
- 名前: run-nfs-client-provisioner
- 科目:
- - 種類: サービスアカウント
- 名前: nfs-client-provisioner
- 名前空間:デフォルト
- ロールリファレンス:
- 種類: ClusterRole
- 名前: nfs-client-provisioner-runner
- apiグループ: rbac.authorization.k8s.io
-
- 種類: 役割
- apiバージョン: rbac. authorization.k8s.io/v1
- メタデータ:
- 名前: リーダーロックNFSクライアントプロビジョナー
- ルール:
- - apiグループ: [ "" ]
- リソース: [ "エンドポイント" ]
- 動詞: [ "get" 、 "list" 、 "watch" 、 "create" 、 "update" 、 "patch" ]
-
- 種類: ロールバインディング
- apiバージョン: rbac. authorization.k8s.io/v1
- メタデータ:
- 名前: リーダーロックNFSクライアントプロビジョナー
- 科目:
- - 種類: サービスアカウント
- 名前: nfs-client-provisioner
- #交換する プロビジョナーがデプロイされている名前空間
- 名前空間:デフォルト
- ロールリファレンス:
- 種類: 役割
- 名前: リーダーロックNFSクライアントプロビジョナー
- apiグループ: rbac.authorization.k8s.io
デプロイメント.yamlファイルを作成する #中国では公式のデフォルトミラーアドレスはダウンロードできない可能性があります。以下のイメージをご利用ください。 fxkjnj/nfs-client-provisioner:最新 # NFSサーバーのアドレスと共有ディレクトリ名を定義する - root@k8s-master1:pvc # デプロイメント.yamlをcatします
- apiバージョン: v1
- 種類: サービスアカウント
- メタデータ:
- 名前: nfs-client-provisioner
-
- 種類: デプロイメント
- apiバージョン: apps/v1
- メタデータ:
- 名前: nfs-client-provisioner
- 仕様:
- レプリカ: 1
- 戦略:
- タイプ: 再作成
- セレクタ:
- 一致ラベル:
- アプリ: nfs-client-provisioner
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: nfs-client-provisioner
- 仕様:
- サービスアカウント名: nfs-client-provisioner
- コンテナ:
- -名前: nfs-client-provisioner
- イメージ: fxkjnj/nfs-client-provisioner:latest
- ボリュームマウント:
- -名前: nfs-client-root
- マウントパス: /persistentvolumes
- 環境:
- -名前: PROVISIONER_NAME
- 値: fuseim.pri/ifs
- -名前: NFS_SERVER
- 値: 172.16.201.209
- -名前: NFS_PATH
- 値: /home/nfs
- ボリューム:
- -名前: nfs-client-root
- nfs:
- サーバー: 172.16.201.209
- パス: /home/nfs
class.yamlを作成する # archiveOnDelete: "true" は、PVC が削除されたときに、バックエンド データが直接削除されずにアーカイブされることを意味します。 - root@k8s-master1:pvc # cat クラス.yaml
- APIバージョン: storage.k8s.io/v1
- 種類: ストレージクラス
- メタデータ:
- 名前: マネージドNFSストレージ
- プロビジョナー: fuseim.pri/ifs #または別の名前を選択します。デプロイメントの env PROVISIONER_NAME と一致する必要があります。
- パラメータ:
- アーカイブ削除時: "true"
pvc.yaml を作成する #ストレージボリュームの名前としてstorageClassNameを指定します # リクエスト: ストレージ: 100Gi 必要なストレージサイズを指定します。 #PVCインスタンスをRedis名前空間内に作成したことに注意してください。Redisが存在しない場合は、まず作成する必要があります: `kubectl create namespace redis` - root@k8s-master1:pvc # cat pvc.yaml
- apiバージョン: v1
- 種類: PersistentVolumeClaim
- メタデータ:
- 名前: nfs-redis
- 名前空間: redis
- 仕様:
- ストレージクラス名: "managed-nfs-storage"
- アクセスモード:
- - 読み書き多数
- リソース:
- リクエスト:
- ストレージ: 100Gi
- #展開する
- root@k8s-master1:pvc # kubectl apply -f 。
-
-
- #ストレージボリュームを表示
- root@k8s-master1:pvc # kubectl get sc
- 名前プロビジョナー RECLAIMPOLICY ボリュームバインドモード ALLOWVOLUMEEXPANSION 年齢
- managed-nfs-storage fuseim.pri/ifs即時削除false 25h
-
-
- #PVCを見る
- root@k8s-master1:pvc # kubectl get pvc -n redis
- 名前ステータス ボリューム 容量 アクセスモード ストレージクラス 年齢
- nfs-redis バインドされた pvc-8eacbe25-3875-4f78-91ca-ba83b6967a8a 100Gi RWX 管理された nfs-storage 21 時間
III. Redis YAMLファイルの記述- root@k8s-master1:~ # mkdir /root/redis
- root@k8s-master1:~ # cd /root/redis
redis.conf 構成ファイルを書き込み、configmap としてコンテナにマウントします。 # require Redis パスワードの設定 #save 5 1 は、キーの変更が 5 秒ごとに dump.rdb ファイルに書き込まれることを意味します。 # appendonly no は、次回に dump.rdb を使用して Redis スナップショット データを復元できることを示します。 # 名前空間が redis であることに注意してください - root@k8s-master1: redis# cat redis-configmap-rdb.yml
- 種類: ConfigMap
- apiバージョン: v1
- メタデータ:
- 名前: redis-config
- 名前空間: redis
- ラベル:
- アプリ: Redis
- データ:
- redis.conf: |-
- 保護モードなし
- ポート6379
- TCPバックログ511
- タイムアウト0
- TCP キープアライブ 300
- 悪魔化しない
- 監督なし
- pidファイル /data/redis_6379.pid
- ログレベル通知
- ログファイル""
- データベース 16
- 常にロゴを表示する
- 5 1 を節約
- 300 10 節約
- 60 10000を節約
- stop-writes- on -bgsave-error yes
- rdb圧縮はい
- rdbchecksum はい
- dbファイル名 dump.rdb
- ディレクトリ /data
- レプリカサーブ古データ はい
- レプリカ読み取り専用はい
- repl-diskless-syncいいえ
- repl-ディスクレス同期遅延 5
- repl-disable-tcp-nodelayなし
- レプリカ優先度100
- 要求パス 123
- レイジーフリー・レイジーエビクション・ノー
- lazyfree-lazy-expireなし
- lazyfree-lazy-server-del no
- レプリカ遅延フラッシュなし
- 追加のみいいえ
- 追加ファイル名「appendonly.aof」
- 毎秒appendfsync
- -appendfsync-オン-rewriteなし
- 自動Aof書き換え率 100
- auto-aof-rewrite- min -サイズ64MB
- aof-ロード- 切り捨て はい
- aof-use-rdb-preamble はい
- lua-時間制限 5000
- slowlog-log-slower-than-10000
- slowlog- max -len 128
- レイテンシモニターしきい値 0
- キースペースイベント通知""
- ハッシュ最大zipリストエントリ数512
- ハッシュ最大値 -ziplist値 64
- リスト-最大-ziplist-サイズ-2
- リスト圧縮深度 0
- セット-最大 - intset-entries 512
- zset- max- ziplist-entries 128
- zset- max -ziplist-value 64
- hll-sparse- max -bytes 3000
- ストリームノード-max -bytes 4096
- ストリームノード-max -entries 100
- アクティブリハッシュ はい
- クライアント出力バッファ制限 通常 0 0 0
- クライアント出力バッファ制限レプリカ 256MB 64MB 60
- クライアント出力バッファ制限 pubsub 32mb 8mb 60
- 10 Hz
- ダイナミック-hz はい
- aof-rewrite-incremental-fsync はい
- rdb-save-incremental-fsync はい
redis-deployment.yml を書く #名前空間がredisであることに注意してください - root@k8s-master1: redis# cat redis-deployment.yml
- apiバージョン: apps/v1
- 種類: デプロイメント
- メタデータ:
- 名前: レディス
- 名前空間: redis
- ラベル:
- アプリ: Redis
- 仕様:
- レプリカ: 3
- セレクタ:
- 一致ラベル:
- アプリ: Redis
- テンプレート:
- メタデータ:
- ラベル:
- アプリ: Redis
- 仕様:
- # 初期化操作を実行し、システム構成を変更し、Redis の起動時に表示される警告メッセージを解決します。
- 初期化コンテナ:
- -名前: システム初期化
- 画像: ビジーボックス:1.32
- imagePullPolicy: IfNotPresent
- 指示:
- - 「しーっ」
- - 「-c」
- - 「echo 2048 > /proc/sys/net/core/somaxconn && echo never > /sys/kernel/mm/transparent_hugepage/enabled」
- セキュリティコンテキスト:
- 特権: true
- 実行ユーザー: 0
- ボリュームマウント:
- -名前: sys
- マウントパス: /sys
- コンテナ:
- -名前: redis
- 画像: Redis: 5.0.8
- 指示:
- - 「しーっ」
- - 「-c」
- - "redis-server /usr/local/etc/redis/redis.conf"
- ポート:
- - コンテナポート: 6379
- リソース:
- 制限:
- CPU: 1000m
- メモリ: 1024Mi
- リクエスト:
- CPU: 1000m
- メモリ: 1024Mi
- ライブネスプローブ:
- tcpソケット:
- ポート: 6379
- 初期遅延秒数: 300
- タイムアウト秒数: 1
- 期間秒数: 10
- 成功しきい値: 1
- 失敗しきい値: 3
- 準備プローブ:
- tcpソケット:
- ポート: 6379
- 初期遅延秒数: 5
- タイムアウト秒数: 1
- 期間秒数: 10
- 成功しきい値: 1
- 失敗しきい値: 3
- ボリュームマウント:
- -名前: データ
- マウントパス: /data
- -名前: 設定
- マウントパス: /usr/ローカル/etc/redis/redis.conf
- サブパス: redis.conf
- ボリューム:
- -名前: データ
- 永続ボリュームクレーム:
- クレーム名: nfs-redis
- -名前: 設定
- 構成マップ:
- 名前: redis-config
- -名前: sys
- ホストパス:
- パス: /sys
redis-service.yml を書く #名前空間がredisであることに注意してください - #展開する
- root@k8s-master1:~/kubernetes/redis# kubectl get pod -n redis
- 名前準備完了 ステータス 再起動 年齢
- redis-65f75db6bc-5skgr 1/1 実行中 0 21時間
- redis-65f75db6bc-75m8m 1/1 実行中 0 21時間
- redis-65f75db6bc-cp6cx 1/1 実行中 0 21時間
-
- root@k8s-master1:~/kubernetes/redis# kubectl get svc -n redis
- 名前タイプ クラスタIP 外部IP ポート 年齢
- redis-front ノードポート 10.0.0.169 <なし> 6379:36379/TCP 22時間
IV. 検査とアクセスRedis クライアント ツールを使用して、テスト用のキーをいくつか書き込みます。
ポッドを削除して自動的に再度作成した後、キーと値のペアが存在するかどうかを確認します。 - root@k8s-master1:~# kubectl get pods -n redis
- 名前準備完了 ステータス 再起動 年齢
- redis-65f75db6bc-5skgr 1/1 実行中 0 5d20h
- redis-65f75db6bc-75m8m 1/1 実行中 0 5d20h
- redis-65f75db6bc-cp6cx 1/1 実行中 0 5d20h
-
- root@k8s-master1:~# kubectl delete -n redis ポッド redis-65f75db6bc-5skgr
- ポッド「redis-65f75db6bc-5skgr」が削除されました
-
-
- #ポッドを削除した後、レプリカの数に基づいて新しいポッドが取得され、生成されます。
- root@k8s-master1:~# kubectl get pods -n redis
- 名前準備完了 ステータス 再起動 年齢
- redis-65f75db6bc-tnnxp 1/1 実行中 0 54秒
- redis-65f75db6bc-75m8m 1/1 実行中 0 5d20h
- 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
- # 永続ディレクトリから dump.rbd ファイルをルートにコピーします。
- cp dump.rdb /root
-
- #Redisを停止します。つまり、デプロイメントを削除します。
- root@k8s-master1:~/kubernetes/redis# kubectl delete -f redis-deployment.yml
- deployment.apps 「redis」が削除されました
-
- root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
- Redis 名前空間にリソースが見つかりません。
-
- # dump.rdb をターゲット Redis インスタンスの永続ディレクトリにコピーします。
- cp /root/dump.rdb /home/nfs/redis-nfs-redis-pvc-8eacbe25-3875-4f78-91ca-ba83b6967a8a
-
- #ポッドを再起動
- root@k8s-master1:~/kubernetes/redis# kubectl apply -f redis-deployment.yml
- deployment.apps/redis が作成されました
-
- root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
- 名前準備完了 ステータス 再起動 年齢
- redis-65f75db6bc-5jx4m 0/1 初期化:0/1 0 3s
- redis-65f75db6bc-68jf5 0/1 初期化:0/1 0 3s
- redis-65f75db6bc-b9gvk 0/1 初期化:0/1 0 3s
-
- root@k8s-master1:~/kubernetes/redis# kubectl get pods -n redis
- 名前準備完了 ステータス 再起動 年齢
- redis-65f75db6bc-5jx4m 1/1 実行中 0 20秒
- redis-65f75db6bc-68jf5 1/1 実行中 0 20秒
- redis-65f75db6bc-b9gvk 1/1 実行中 0 20秒
(3)データを検証すると、元のRedisソースのすべてのデータが再現されていることがわかります。 |