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

推薦する

serverastra: ハンガリー 10Gbps 無制限の高性能 VPS、Windows サポート、月額 2.99 ユーロから

このサイトは 2008 年に一度 serverastra を紹介しました。当時はまだ 1Gbps の...

1.2 フレームワークとは何か

1.2 フレームワークとは何かフレームワークは、特定の問題領域内でアプリケーションの一部を実装する再...

詳細記事 | UCloud データベース製品の進化

先日、「UCloud User Open Day」の最新イベントが無事に開催されました。 UClou...

ブランドマーケティングへの正しいアプローチ

従来のeコマースのキーワードとは異なり、ブランドのコアキーワードはサイトの内外両方で作成する必要があ...

ローカルウェブサイトはユーザーのニーズに合わせる必要がある

合肥フォーラムが南京365.comを活用して株式を公開するにつれ、ますます多くのウェブマスターが地元...

ツァイニャオ氏は、百度とグーグルのアルゴリズム調整に関するいくつかの疑問をまとめている。

ウェブマスターは、Baidu が木曜日と土曜日の夜にアップデートを行うことも知っていると思われます。...

マーケティングとは何ですか?消費者の「欲」をつかみ、「良い」商品を見せる

ブログを閉鎖して再開してから、長い間ブログを書いていませんでした。一方で、Web サイトの構築テクニ...

ネットワーク仮想化の簡単な紹介

[[257098]]ネットワーク仮想化の背景次の 2 つの条件を満たすことはできません。 1. コ...

ウェブサイトのSEO最適化: 顧客第一

現在、ウェブサイトの最適化を行う人員は絶えず変化しており、Baiduアルゴリズムはどのような方向に進...

複数製品を扱う企業ウェブサイトの SEO の核心: キーワードレイアウト

キーワードレイアウトはSEOを始めるための第一歩であり、将来のウェブサイトプロモーション効果の核心で...

タオバオの化粧品販売業者のうち利益を上げているのはわずか5%だが、大手企業は依然として電子商取引市場に参入している。

ジュメイ・ヨウピンは最近、偽造品販売のスキャンダルに巻き込まれた。同社はハッキングされたと主張してい...

「Alipay」をあと9つ作る?アント・ファイナンシャルのCTOが雲奇カンファレンスで初めて手法を説明

「アリペイ」の韓国版であるカカオペイの取引高が1年で8倍に増加した…火曜日のアリババ投資家カンファレ...

Linodeはどうですか?米国西海岸シアトルデータセンターのクラウドサーバーの評価

Linodeは現在、米国西海岸に3つのデータセンターを所有しており、南から北にロサンゼルス、フリーモ...

外部リンクを構築するためのフォーラム戦略(パート 1)

コンテンツは王様、外部リンクは女王様です。この文が意味するのは、成功するウェブサイトには、高品質のオ...

100万ドル規模のSEO最適化事例

ある友人が私にこんな話をしてくれました。ダニウ兄弟が経営する会社は、主にインターネット事業を行ってい...