2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
k8s クラスターでステートフル サービスを構築するのは比較的面倒です。現在の主流の Redis 構築アプローチは、共有ストレージ ceph と nas を使用して、ノード アフィニティとホストパスを使用して実装されています。ストレージ。この記事では、ホストパス アフィニティの加重複数コピーを使用して、既存の環境とさまざまなニーズに基づいて Redis クラスターを構築し、データの永続性と Redis サービスの高可用性を実現します。
K8s バージョン k8s-1.29.4 では、環境は通信コンピュータ ルームに構築され、各ノードには非システム ディスク SSD が /data/ パスにマウントされています。現在、redis-operator は共有ストレージを使用します。
注: このソリューションによって構築された Redis は、k8s クラスター内でのみ使用でき、LoadBlancer または NodePort を介してクラスター外で使用するために提供することはできません。これは、Sentinel で選択されたメイン Redis の IP がスイッチ時のポッドの IP であるためです。が発生した場合、どれがメイン Redis であるかを判断できません。
ノード名 | 役割 | ラベル |
---|---|---|
k8s-ワーカー-120-81 | ホスト | ストレージセレクター=ノードマスター |
k8s-ワーカー-120-82 | ホスト | ストレージセレクター=ノードbマスター |
k8s-ワーカー-120-83 | ホスト | ストレージセレクター=ノードcマスター |
k8s-ワーカー-120-84 | 準備する | ストレージセレクター=ノードスレーブ |
k8s-ワーカー-120-85 | 準備する | ストレージセレクター=ノードスレーブ |
k8s-ワーカー-120-86 | 準備する | ストレージセレクター=ノードスレーブ |
注: ここでの役割分担とは、redis には 1 つのマスターと 2 つのスレーブがあるため、各 redis ポッドは 3 つのマスター ノードに属し、マスター ノードに障害が発生すると、バックアップ ノードに切り替えられます。例: 名前は、defaultapp- です。 redis-a-0 のポッドは、デフォルトで storage-selector=node-a-master というラベルの付いたノードに配置されます。ノードに障害が発生すると、storage-selector=node-a-slve というラベルの付いたノードの重みに基づいて照合されます。ノード上で。
構成には 4 つのファイルが含まれており、配布の説明は次のとおりです。
Sentinel.conf: Sentinel 設定ファイル。デフォルトでは、最初の statefulset がメイン Redis として使用され、設定:solve-hostnames がホスト名をサポートします。
redis-master.conf: メインの Redis 構成ファイル。メモリは 256M に構成され、構成ポートは 6379、構成パスワードは redis#123、ストレージ パスは /data/redis です。
redis.conf: redis 構成ファイルから、メモリを 256M に構成し、ポートを 6380 に構成し、パスワードを redis#123 に構成し、ストレージ パスを /data/redis-2 に構成し、データがメインのレディス。
run.sh: 主な機能は、さまざまな構成ファイルを実行する役割を決定し、ホスト名に基づいてディレクトリを作成し、ストレージ ディレクトリにソフト接続することです。この手順は主に、新しい Redis を作成するときに、各サービスの Redis データを独自のディレクトリに保存することで、ノード上でディレクトリの競合が発生しません。
apiVersion: v1
kind: ConfigMap
metadata:
name: defaultapp-redis-config
namespace: default-ns
labels:
appname: default-app
app: defaultapp-redis-config
data:
sentinel.conf: |
sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2
sentinel auth-pass mymaster redis#123
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
SENTINEL resolve-hostnames yes
SENTINEL announce-hostnames yes
redis-master.conf: |
maxmemory 256mb
requirepass redis#123
save 3600 1 300 10 60 100
dir /data/redis
masterauth redis#123
redis.conf: |
maxmemory 256mb
requirepass redis#123
save 3600 1 300 10 60 100
dir /data/redis
replicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379
masterauth redis#123
run.sh: |
#!/bin/sh
role=$1
hname=$(hostname)
if [ $role == "master" ];then
echo "run redis master"
[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
[ -d /data ] || mkdir /data
ln -s /home/redis/$hname /data/redis
redis-server /etc/redis/redis-master.conf
elif [ $role == "sentinel" ];then
echo "run redis sentinel"
mkdir -p /etc/redis
cp /home/redis/sentinel.conf /etc/redis/
redis-sentinel /etc/redis/sentinel.conf
else
echo "run redis slave"
[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
[ -d /data ] || mkdir /data
ln -s /home/redis/$hname /data/redis
redis-server /etc/redis/redis.conf
fi