「クラウドネイティブ」Redis on K8s オーケストレーションの導入解説と実践的な運用

「クラウドネイティブ」Redis on K8s オーケストレーションの導入解説と実践的な運用

1. 概要

REmote DIctionary Server (Redis) は、Salvatore Sanfilippo によって作成されたキー値ストレージ システムです。これはクロスプラットフォームの非リレーショナル データベースです。

Redis には、マスタースレーブモード、Sentinel モード、クラスターモードの 3 つのクラスターモードがあります。この記事では、これら 3 つのモードの展開とオーケストレーションについて紹介し、実装します。

2. Redis マスタースレーブモードオーケストレーションとデプロイメントの実践的な操作

アドレス: https://artifacthub.io/packages/helm/bitnami/redis

1) チャートパッケージをダウンロードする

 helmリポジトリbitnamiを追加しますhttps://charts.bitnami.com/bitnami

helm pull bitnami / redis --version 17.3.7

tar - xf redis - 17.3.7.tgz

2) イメージを構築する

ここではイメージを再構築せず、リモート イメージにタグを付けてローカル ハーバー リポジトリにプッシュし、イメージのダウンロードを高速化します。画像の作成方法がわからない場合は、プライベートメッセージを送信するか、メッセージを残してください。

 docker pull docker .io / bitnami / redis : 7.0.5 - debian - 11 - r7

# タグ
docker タグ docker .io / bitnami / redis : 7.0 .5 - debian - 11 - r7 myharbor .com / bigdata / redis : 7.0 .5 - debian - 11 - r7

# イメージをローカルの Harbor リポジトリにプッシュします
docker push myharbor .com / bigdata / redis : 7.0.5 - debian - 11 - r7

3) YAMLレイアウトを変更する

  • redis/テンプレート/マスター/pv.yaml

次の内容を含む新しい pv.yaml ファイルを追加します。

 { { -範囲.Values ​​.master .persistence .local } }
---
APIバージョン: v1
種類:永続ボリューム
メタデータ:
名前: { { .name } }
ラベル:
名前: { { .name } }
仕様:
ストレージクラス名: { { $ .Values ​​.master .persistence .storageClass } }
容量
ストレージ: { { $ .Values ​​.master .persistence .size } }
アクセスモード:
-一度だけ読み書き可能
地元
パス: { { .path } }
ノードアフィニティ:
必須
ノードセレクタ用語:
-一致する表現:
-キー: kubernetes.io/ホスト名
演算子:

- { { 。ホスト} }
---
{ { -終わり} }
  • redis/テンプレート/レプリカ/pv.yaml

次の内容を含む新しい pv.yaml ファイルを追加します。

 { { -範囲.Values ​​.replica .persistence .local } }
---
APIバージョン: v1
種類:永続ボリューム
メタデータ:
名前: { { .name } }
ラベル:
名前: { { .name } }
仕様:
ストレージクラス名: { { $ .Values ​​.replica .persistence .storageClass } }
容量
ストレージ: { { $ .Values ​​.replica .persistence .size } }
アクセスモード:
-一度だけ読み書き可能
地元
パス: { { .path } }
ノードアフィニティ:
必須
ノードセレクタ用語:
-一致する表現:
-キー: kubernetes.io/ホスト名
演算子:

- { { 。ホスト} }
---
{ { -終わり} }
  • redis/values.yaml
グローバル:
レディス:
パスワード: "123456"

...

画像
レジストリ: myharbor.com
リポジトリ: bigdata / redis
タグ: 7.0 .5 - debian - 11 - r7

マスター
カウント: 1
持続性:
有効: true
サイズ: 8Gi
ストレージクラス: "local-redis-storage"
地元
-名前: redis - 0
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/redis/data/data1"

レプリカ:
レプリカ数: 2
持続性:
有効: true
サイズ: 8Gi
ストレージクラス: "local-redis-storage"
地元
-名前: redis - 1
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/redis/data/data1"
-名前: redis - 2
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/redis/data/data1"

4) 展開を開始する

 # ストレージディレクトリを作成する
mkdir / opt / bigdata / servers / redis / data / data1

# まず構文をチェックする
ヘルムリント./redis

# インストールを開始する
helm で redis をインストールします。/redis -n redis --create-namespace

注記

改訂: 1
テストスイート:なし
注記:
チャート名: redis
チャートバージョン: 17.3.7
アプリバージョン: 7.0.5

**チャート展開されるまでしばらくお待ちください**

Redis® は、クラスター内から次の DNS 名アクセスできます

redis -読み取り/書き込み操作用のマスター.redis .svc .cluster .local (ポート6379 )
redis -読み取り専用操作用のレプリカ.redis .svc .cluster .local (ポート6379 )



パスワードを取得するには、次を実行します:

REDIS_PASSWORD をエクスポートします $ ( kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

Redis® サーバーに接続するには:

1.クライアントとして使用できる Redis® ポッドを実行します

kubectl run --namespace redis redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image myharbor.com/bigdata/redis:7.0.5-debian-11-r7 --command --sleep infinity

ポッドに接続するには、次のコマンドを使用します

kubectl exec --tty -i redis-client \
--namespace redis --bash

2. Redis® CLI を使用して接続します
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h redis -マスター
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h redis -レプリカ

クラスターの外部からデータベースに接続するには、次のコマンドを実行します

kubectl ポート転送--namespace redis svc/redis-master 6379:6379 &
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h 127.0 .0 .1 - p 6379

5) テスト検証

 kubectl get pods  svc - n redis - wide を実行します。 

 # マスターにログインし、読み取りと書き込みが可能
kubectl exec - it redis -マスター- 0 - n redis -- redis-cli -h redis-master -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

# スレーブにログイン、読み取り専用
kubectl exec - it redis -マスター- 0 - n redis -- redis-cli -h redis-replicas -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

6) アンインストール

 helm アンインストール redis - sentinel - n redis - sentinel
# nsを削除
kubectl削除ns redis -センチネル--force
# PVを削除
kubectl で pvを削除します`kubectl で pv を取得します| grep ^ redis -| awk '{print $1}' ` --force

rm - fr / opt / bigdata /サーバー/ redis /データ/ data1 /*

3. Redis Sentinel モードのオーケストレーションとデプロイメントの実践的な操作

マスタースレーブモードの欠点は、可用性が高くないことです。マスターに障害が発生すると、Redis は外部書き込み操作を提供できなくなるため、Sentinel が誕生しました。

1) イメージを構築する

ここでもイメージが再構築されます。イメージの構築方法がわからない場合は、コメントの下にメッセージを残してください。ここでは、リモート イメージをローカル ハーバーにプッシュするだけです。

 docker pull docker.io/bitnami/redis-sentinel:7.0.5-debian-11-r6
# タグ
docker タグ docker.io/bitnami/redis-sentinel:7.0.5-debian-11-r6 myharbor.com/bigdata/redis-sentinel:7.0.5-debian-11-r6
# 押す
docker push myharbor.com/bigdata/redis-sentinel:7.0.5-debian-11-r6

2) YAMLレイアウトを変更する

  • redis-sentinel/値.yaml
レプリカ:
# replica .replicaCountは sentinel .quorumと同じです
レプリカ数: 3
ストレージクラス: "local-redis-storage"
地元
-名前: redis - 0
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/redis/data/data1"
-名前: redis - 1
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/redis/data/data1"
-名前: redis - 2
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/redis/data/data1"

センチネル:
有効: true
画像
レジストリ: myharbor.com
リポジトリ: bigdata / redis - sentinel
タグ: 7.0 .5 - debian - 11 - r6
定足数: 3
  • redis-sentinel/テンプレート/レプリカ/pv.yaml

次の内容を含む新しい pv.yaml ファイルを追加します。

 { { -範囲.Values ​​.sentinel .persistence .local } }
---
APIバージョン: v1
種類:永続ボリューム
メタデータ:
名前: { { .name } }
ラベル:
名前: { { .name } }
仕様:
ストレージクラス名: { { $ .Values ​​.sentinel .persistence .storageClass } }
容量
ストレージ: { { $ .Values ​​.sentinel .persistence .size } }
アクセスモード:
-一度だけ読み書き可能
地元
パス: { { .path } }
ノードアフィニティ:
必須
ノードセレクタ用語:
-一致する表現:
-キー: kubernetes.io/ホスト名
演算子:

- { { 。ホスト} }
---
{ { -終わり} }

3) 展開を開始する

 # ストレージディレクトリを作成する
mkdir -p /opt/bigdata/servers/redis/data/data1

helm で redis-sentinel をインストールします。/redis-sentinel -n redis-sentinel --create-namespace

注記

名前: redis - sentinel
最終配備: 2022年114金曜日22:42:52
名前空間: redis - sentinel
ステータス:展開済み
改訂: 1
テストスイート:なし
注記:
チャート名: redis
チャートバージョン: 17.3.7
アプリバージョン: 7.0.5

**チャート展開されるまでしばらくお待ちください**

Redis® には、クラスター内から次の DNS 名ポート6379経由でアクセスできます

読み取り専用操作の場合は redis - sentinel .redis - sentinel .svc .cluster .local

読み取り/書き込み操作の場合はまず上記と同じドメイン名を使用してポート26379利用可能な Redis® Sentinelクラスターにアクセスします。



パスワードを取得するには、次を実行します:

REDIS_PASSWORD をエクスポートします $ ( kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d)

Redis® サーバーに接続するには:

1.クライアントとして使用できる Redis® ポッドを実行します

kubectl run --namespace redis-sentinel redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image myharbor.com/bigdata/redis:7.0.5-debian-11-r7 --command --sleep infinity

ポッドに接続するには、次のコマンドを使用します

kubectl exec --tty -i redis-client \
--namespace redis-sentinel --bash

2. Redis® CLIを使用して接続します
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h redis - sentinel - p 6379 # 読み取り専用操作
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h redis - sentinel - p 26379 # Sentinel アクセス

クラスターの外部からデータベースに接続するには、次のコマンドを実行します

kubectl ポート転送--namespace redis-sentinel svc/redis-sentinel 6379:6379 &
REDISCLI_AUTH = "$REDIS_PASSWORD" redis - cli - h 127.0 .0 .1 - p 6379

チェック

 kubectl get pods  svc - n redis - sentinel - wide を実行します。

4) 模擬故障テスト

 # チェック
kubectl exec - it redis - sentinel - node - 0 - n redis - sentinel -- redis-cli -h redis-sentinel -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d) レプリケーション情報

障害をシミュレートしてマスターポッドを強制終了する

 kubectl ポッド redis -センチネル-ノード- 0 - n redis -センチネルを削除します

マスターノードを再度確認すると、マスターノードが他のノードに切り替わっています。

読み書きの再テスト

 # マスターノードにログインする
kubectl exec -it redis - sentinel - node - 0 - n redis - sentinel --redis-cli -h redis-sentinel-node-2.redis-sentinel-headless -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d) を実行します。

# スレーブノードにログインする
kubectl exec -it redis - sentinel - node - 0 - n redis - sentinel --redis-cli -h redis-sentinel-node-0.redis-sentinel-headless -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d) を実行します。

5) アンインストール

 helm アンインストール redis-sentinel -n redis
# nsを削除
kubectl ns redis を削除します --force
# PVを削除
kubectl で pv を削除します `kubectl で pv を取得します|grep ^redis-|awk '{print $1}'` --force

rm -fr /opt/bigdata/servers/redis/data/data1/*

4. Redis クラスターモードのオーケストレーションとデプロイメントの実践的な操作

クラスターモードは、センチネルモードとマスタースレーブモードを組み合わせたものと言えます。クラスターはマスタースレーブ機能とマスター再選出機能を実現できるため、レプリカ 2 つとシャード 3 つを構成する場合、6 つの Redis インスタンスが必要になります。 Redis データは一定のルールに従ってクラスター内の異なるマシンに分散されるため、データの量が多すぎる場合は、拡張のために新しいマシンを追加できます。

1) チャートパッケージをダウンロードする

 helmリポジトリbitnamiを追加しますhttps://charts.bitnami.com/bitnami

helm pull bitnami / redis -クラスター--version 8.2.7

tar - xf redis -クラスター- 8.2 .7 .tgz

2) イメージを構築する

ここではイメージを再構築せず、リモート イメージにタグを付けてローカル ハーバー リポジトリにプッシュし、イメージのダウンロードを高速化します。画像の作成方法がわからない場合は、プライベートメッセージを送信するか、メッセージを残してください。

 docker pull docker .io / bitnami / redis -クラスター: 7.0 .5 - debian - 11 - r9

# タグ
docker タグ docker .io / bitnami / redis - cluster : 7.0 .5 - debian - 11 - r9 myharbor .com / bigdata / redis - cluster : 7.0 .5 - debian - 11 - r9

# イメージをローカルの Harbor リポジトリにプッシュします
docker push myharbor .com / bigdata / redis -クラスター: 7.0 .5 - debian - 11 - r9

3) YAMLレイアウトを変更する

  • redis-cluster/テンプレート/pv.yaml

次の内容を含む新しい pv.yaml ファイルを追加します。

 { { -範囲.Values ​​.persistence .local } }
---
APIバージョン: v1
種類:永続ボリューム
メタデータ:
名前: { { .name } }
ラベル:
名前: { { .name } }
仕様:
ストレージクラス名: { { $ .Values ​​.persistence .storageClass } }
容量
ストレージ: { { $ .Values ​​.persistence .size } }
アクセスモード:
-一度だけ読み書き可能
地元
パス: { { .path } }
ノードアフィニティ:
必須
ノードセレクタ用語:
-一致する表現:
-キー: kubernetes.io/ホスト名
演算子:

- { { 。ホスト} }
---
{ { -終わり} }
パスワード: "123456"

...

画像
レジストリ: myharbor.com
リポジトリ: bigdata / redis -クラスター
タグ: 7.0 .5 - debian - 11 - r9

...

持続性:
ストレージクラス: "local-redis-cluster-storage"
地元
-名前: redis -クラスター- 0
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/redis-cluster/data/data1"
-名前: redis -クラスター- 1
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/redis-cluster/data/data2"
-名前: redis -クラスター- 2
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/redis-cluster/data/data3"
-名前: redis -クラスター- 3
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/redis-cluster/data/data1"
-名前: redis -クラスター- 4
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/redis-cluster/data/data2"
-名前: redis -クラスター- 5
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/redis-cluster/data/data3"
-名前: redis -クラスター- 6
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/redis-cluster/data/data1"
-名前: redis -クラスター- 7
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/redis-cluster/data/data2"
-名前: redis -クラスター- 8
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/redis-cluster/data/data3"

クラスター:
初期化:
# マスター 1 台とスレーブ 2 台 (3 つのグループ)
ノード数: 9
レプリカ 2

4) 展開を開始する

 # ストレージディレクトリを作成する
mkdir -p /opt/bigdata/servers/redis-cluster/data/data{1..3}

helm で redis-cluster をインストールします。/redis-cluster -n redis-cluster --create-namespace

注記

注記:
チャート名: redis-cluster
チャートバージョン: 8.2.7
アプリバージョン: 7.0.5** チャートが展開されるまでしばらくお待ちください**


パスワードを取得するには、次を実行します:
REDIS_PASSWORD=$(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) をエクスポートします。

Kubernetes クラスター内からのみアクセス可能な Redis® クラスターをデプロイしました。情報: クラスターを作成するジョブが作成されます。Redis® クラスターに接続するには:

1. クライアントとして使用できる Redis® ポッドを実行します。
kubectl 実行 --namespace redis-cluster redis-cluster-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image myharbor.com/bigdata/redis-cluster:7.0.5-debian-11-r9 -- bash

2. Redis® CLI を使用して接続します。

redis-cli -c -h redis-cluster -a $REDIS_PASSWORD

チェック

 kubectl get pods  svc - n redis -クラスター全体

5) 故障シミュレーションテスト

 kubectl exec -it redis - cluster - 0 - n redis - cluster --redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsnotallow="{.data.redis-password}" | base64 -d) クラスター情報

kubectl exec - it redis - cluster - 0 - n redis - cluster -- redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) クラスターノード

マスターノードの1つを削除する

 kubectl ポッド redis -クラスター- 1 - n redis -クラスターを削除します

# ノードのステータスを再度確認する
kubectl exec - it redis - cluster - 0 - n redis - cluster -- redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) クラスターノード

6) アンインストール

 helm アンインストール redis -クラスター- n redis -クラスター
# nsを削除
kubectl削除ns redis -クラスター--force
# PVを削除
kubectl で pvを削除します`kubectl で pv を取得します| grep ^ redis -クラスター-| awk '{print $1}' ` --force

rm - fr / opt / bigdata / servers / redis - cluster / data / data { 1 .. 3 } /*

Git アドレス: https://gitee.com/hadoop-bigdata/redis-on-k8s​

<<:  Alibaba Cloudの「Automotive Cloud」がYunqiカンファレンスでデビューしました。 Xpeng、FAW、Great Wall、Horizo​​nなどはすべてクラウドに移行しました

>>:  Kubecon 2022 概要: Kubernetes は産業化に向けて前進

推薦する

Flash ウェブサイト SEO のベスト プラクティス

Flash SEO はよくある問題ではありません。Flash を使用して Web サイト全体を作成す...

クラウド データベースの選択に必読: 要件を整理するにはどうすればよいでしょうか?

[[419550]]クラスター化されたデータベースが必要ですか?クラスター化されたデータベースには、...

苦情防止 VPS: BuyVM、ルクセンブルク VPS + ルクセンブルク「ブロック ストレージ」、補充用の特別ポスト

この投稿は、buyvm ルクセンブルク データ センターの VPS とブロック ストレージの補充に関...

マルチエントリーパフォーマンスストレステストのキラー:ワンストップストレステストプラットフォーム OPM の背後にあるテクノロジーを明らかにする

課題アリババの「双十一」は世界的なスーパープロジェクトとなった。このスーパープロジェクトでは、フルリ...

ウェブサイトのトラフィック統計分析についてもう一度お話しします

人生日記には、喜び、悲しみ、怒り、幸せ、そして成長体験を記録できます。では、ウェブサイトのトラフィッ...

心温まる!高齢者に優しい健康コードソリューションがさまざまな地域でリリースされ、テンセントテクノロジーは「デジタルデバイド」の解消に貢献しています。

健康コードがないと旅行が困難な高齢者の問題に解決策が見つかりました!現在、広東省、北京市、四川省、河...

ドメイン名の信頼性が低い場合の欠点と解決策の事例分析

ドメイン名の信頼性とは何ですか? これは、検索エンジンによるドメイン名コンテンツの認識度を指します。...

K8sにVictoriametricsをインストールする

背景前回は、victoriametrics とそのインストール時の注意事項について紹介しました。今日...

Alibaba Cloudは、究極のパフォーマンス、セキュリティ、信頼性を備えた初のエンタープライズレベルのブロックストレージ製品、Apsara Block Storageをリリースしました。

6月14日、アリババクラウドは、ローカルデータセンターに導入できる初のエンタープライズレベルのブロッ...

中国オーディオブック著作権侵害防止連盟が設立され、初の権利保護訴訟を開始

中国オーディオブック著作権侵害防止連盟の設立式新浪科技は4月23日、電子書籍やモバイル読書の発展に伴...

Hostkvm 香港 VPS の簡単なレビュー: 香港の湾仔にある 80Mbps の帯域幅を備えた KVM VPS

数日前、hostkvm の香港 VPS のプロモーション情報を公開しました: hostkvm: 香港...

SEO神話の崩壊と復活の解釈

SEO という言葉は外国製品ですが、国内の検索市場プラットフォームに登場して以来、謎めいた印象を与え...

ウェブサイトの最初の画面に表示されるコンテンツが成功か失敗かを決定します

私の考えでは、SEO 担当者はウェブサイト運営全体の立役者になるべきです。ウェブサイトの構造設計、コ...

#11.11# RackNerd: 複数の安価な米国 VPS、最低 $12/年、オプションのデータセンター 6 つ

Racknerd は、2018 年の China Double Eleven プロモーションを正式に...

元航自動車学校の SEO 千夜一夜物語 · 2012 年 12 月 4 日

冒頭の言葉本日より、私(ID:yuanhangjx、ニックネーム:袁航自動車学校SEO)は、自分の仕...