「クラウドネイティブ」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 は産業化に向けて前進

推薦する

新しいウェブサイトは公開後2日間で30,000の利益を上げました。高コンバージョンウェブサイト外部リンク構築

昨日のハイライト:電話 1 本、注文 1 件、Web サイト 1 つ、チーム 1 つ、Web サイト...

ウェブサイト上で高品質な内部リンクを構築する方法についての簡単な説明

多くの友人がウェブサイトを最適化する際、外部リンクの構築を SEO のすべてとみなしています。これは...

ライブストリーミングが欧米で普及しない理由

電子商取引大手アマゾンにとって、ここ数カ月は決して楽な時期ではなかった。業績の伸び悩みから、アマゾン...

検索エンジンとウェブサイト: 違いは引き付け合い、類似点は反発する (パート 1)

物理学には常に「反対のものは引き合い、同じものは反発する」という法則があります。現実の世界では、この...

incero-$499/10G ポート/無制限サーバー/ダラス/シアトル

Incero は、金持ちでハンサムな男性に適した、月額 499 ドルの特別価格のサーバーを立ち上げま...

なぜ Zuipin Mall のウェブサイトは今回のアルゴリズム更新によって順位が下がったのでしょうか?

Baidu がアルゴリズムを更新するたびに、ウェブマスターの間で騒動が起こります。喜ぶ人もいれば、心...

楊衛清:地域化と認識の要素を持つサービスには最も多くのビジネスチャンスがある

8月2日、2日から5日まで北京でMacworld Asia 2012 Digital World A...

企業ウェブサイトの運営とプロモーションモデル:O2Oを選択することは後退となる可能性がある

インターネットで生き残りたいなら、インターネット思考が必要です。多くの企業ウェブサイトは、インターネ...

新しい時代のメディア専門家に必要な資質は何でしょうか?

みなさんこんにちは、シャオシです。セルフメディアとは何でしょうか?私がこの概念に出会ったのは2006...

起業から上場まで、Chubao CTO の Wang Jian が AWS との 10 年間の取り組みについて語る

[51CTO.comより引用] モバイルインターネットの時代において、多くの中国の起業家企業が海外に...

高速でおすすめの香港クラウドサーバー、最速の香港クラウドサーバー

どの香港クラウドサーバーの方が速いですか?香港で最も高速なクラウド サーバーの推奨事項は何ですか?高...

onevps: シンガポール直接接続 VPS レビュー、1Gbps 帯域幅/10T トラフィック

onevpsはどうですか? onevps ping、onevps テスト、onevps の速度はどれ...

「WeChat版JD」における検索ロジックの弱体化カテゴリの解釈。

【Ebrun News】5月28日、噂されていたJD.com WeChatポータルが昨日ついに正式に...

パブリッククラウド、プライベートクラウド、ハイブリッドクラウドの比較

現在、ほぼすべての企業がクラウド コンピューティングを計画または使用していますが、すべての企業が同じ...