k8s_redis_sentinel_1
クバネティス(Kubernetes) 環境で Redis-Sentinel 構築実戦ガイド ①
明細書(YAML) 概要および内容
Redis-Sentinel 概要
Redis-Sentinel は Redis 1個のポッド(Pod)(マスター)にデータを保存(管理)し、2個のバックアップ(レプリカ) ポッド(Pod) を持ちます。
Sentinel 3個のポッド(Pod) は Redis マスターを監視し、Redis マスターがダウンするとレプリカのうち 1つをマスターへ
切り替える役割を担います。
🔗 Redis-Sentinel の全体像はこちらをご覧ください。
1. Redis-Sentinel 明細書(YAML)
クバネティス(Kubernetes) で Redis-Sentinel をデプロイするときは、設定(Config)、サービス(Service)、 Redis ポッド(Pod) 生成、Sentinel ポッド(Pod) 生成(ステートフルセット(StatefulSet) 2個) の役割を分けて 4つの YAML ファイルで管理します。
2. デプロイ順に沿ったファイル別の内容説明
🟢 [1段階] Redis-Sentinel 設定: redis-sentinel-config.yaml
- 種類(kind): ConfigMap
- 名前(metadata:name): redis-sentinel-config
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう厳格に制限されます(大文字は使用不可)
- ConfigMap 設定ファイルです。ここに設定した指示子で redis.conf、sentinel.conf ファイルを作ります。
- 既存の圧縮(tar) ファイルにデフォルトで含まれる redis.conf、sentinel.conf ファイルは使用されません。
- Redis インスタンス(ポッド(Pod))ごとに異なる値が必要なら、 ステートフルセット(StatefulSet) の command スクリプトで動的に設定できます。 例) replica-priority 100, 110, 120
🧑💻 主な値の説明
- bind * -::* # IP が動的に割り当てられ変更されるため、すべての IP を受けられるように設定します。
韓国インターネット振興院(KISA) [クラウド脆弱性点検ガイド]では、セキュリティ目的で bind 項目に IP を設定するよう求めます。 VM/物理サーバではそれが正しいですが、クバネティス(Kubernetes) 環境では設定できません。
(公共/金融などプロジェクトでは監査委員へよく説明する必要があります) - protected-mode no # 'bind *' にしているため 'yes' にすると外部から接続できません。
セキュリティに反するように見えますが、クバネティス(Kubernetes) には独自のセキュリティがあるので、この設定でも問題ありません。 - daemonize no # 'yes' にしてはいけません。
- requirepass password # 💥password は必ず設定してください。
サーバや PC がインターネットに接続されているなら、開発環境でも必ず password を設定してください。
Redis のハッキングは 🕵️人(ハッカー)が行うのではなく、💻 プログラムが 24時間稼働してハッキングします。
Password がなければ、開発用に数分だけ起動していてもすぐにハッキングされることがあります。
詳細はこちらを参照してください。 🔗 Redis Hacking
users.acl を設定した場合は 'requirepass' を設定しなくても構いません。 - masterauth password # 必ず設定してください。
- replica-priority 100 # 📍Redis-0 100, Redis-1 110, Redis-2 120
redis-statefulset.yaml initContainer:command で動的に注入されます。 - replica-announce-ip # 📍redis-0.redis-service...
redis-statefulset.yaml initContainer:command で動的に注入されます。
echo "replica-announce-ip redis-$INDEX.redis-service.default.svc.cluster.local" >> /data/redis.conf - users.acl: 66~67行の設定。 Password('#0cbc...' 64桁)は別途設定する必要があります。
詳細はこちらを参照してください。 🔗 ACL
💾 redis-sentinel-config.yaml を見る
ここに示した値は、redisGate が 100サイト以上にインストール/運用する際、90% 以上で適用した redis.conf 値です。
(maxmemory 値はデータサイズに合わせて調整してください)
💻 物理サーバ/VM の場合は、次のいくつかの値を修正して使ってください。
- bind 114.x.y.z 127.0.0.1 -::1 -> IP 指定
- protected-mode yes
- port -> default 💥6379 ポートはハッキングの主要なターゲットです。必ず別のポートを使ってください。
- daemonize yes
- dir /app/redis -> pidfile、logfile などもこの dir に配置
- aclfile /app/redis/users.acl -> ユーザーごとに権限付与が可能: 使用を推奨
- #maxmemory <bytes> -> コメントアウト(default)
① Redis 専用サーバの場合、システムメモリの 50%~90% まで指定
② メモリに十分な余裕がある場合: システムメモリが 16GB で Redis の使用メモリが 1~2GB なら (現実的には) 無理に設定しなくてもよい
③ 💥 Redis がシステムメモリをすべて使うと、OS(Linux) が Redis プロセスを kill します。 - # replica-announce-ip -> コメントアウト(default)
🟢 [2段階] サービス(Service) 設定: redis-sentinel-service.yaml
- 種類(kind): Service
- 名前(metadata:name): redis-service / sentinel-service
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう厳格に制限されます(大文字は使用不可)
- Service 設定ファイルです。
ポッド(Pod) の IP が変わっても、固定のドメイン名(FQDN:Full Qualified Domain Name) で
個別の Redis にアクセスできるよう、あらかじめネットワークの住所録を作る役割です。
🧑💻 主な値の説明
- clusterIP: None # 📍'None' に設定(個別ポッド(Pod) DNS 単独識別用)
- port: 18504 # Redis ポート
- port: 28504 # Sentinel ポート
💾 redis-sentinel-service.yaml を見る
🟢 [3段階-1] Redis ポッド(Pod) 生成明細書: redis-statefulset.yaml
Redis ポッド(Pod)(replicas, initContainers, memory, pvc(disk volume)) 生成明細書ファイルです。
- 種類(kind): StatefulSet
- 名前: metadata: name: redis
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう制限されます(大文字は使用不可)
この名前に redis-0,1,2 のように数字を付けてポッド(Pod) 名を付けます。
ポッド(Pod) 名と serviceName を使って、次のように FQDN(Full Qualified Domain Name) を作ります。
redis-0.redis-service.default.svc.cluster.local
Redis ごとに固有の FQDN 名で Redis 同士、Sentinel と Redis、または Redis/Sentinel と App の間で通信できます。 IP が変わると、変更後の IP を FQDN に接続(設定)します。
🧑💻 主な値の説明
- configMap: name: redis-sentinel-config (1段階の Redis/Sentinel 設定と接続)
- serviceName: redis-service (2段階の Service と接続)
- replicas: 3 # Master: 1, Replica: 2 -> replicaof 動的設定
- image: redis:8.8.2 # 2026年 08月 17日(月) 発表のバージョン 8.8.2 を使用
- imagePullPolicy: IfNotPresent # ローカルイメージを使用
- command スクリプト: 1段階 ConfigMap の設定ファイルコピーおよび動的設定
- volumeMounts: mountPath: /data: Redis が使用/管理するすべてのファイル (redis.conf, users.acl, aof files など) を保存します。
💾 redis-statefulset.yaml
🧑💻 initContainers: command: スクリプト説明
- ポッド(Pod) インデックス(数字) 抽出(redis-0 -> 0, redis-1 -> 1, redis-2 -> 2)して、ポッド(Pod) ごとに
動的設定するために使います。
- redis.conf ファイルがあればコピーしません。 (初回起動時のみコピー)
Redis は運用中の重要イベント発生時に redis.conf へ書き込む(write)ため、ポッド(Pod) 再起動時に 生成済みファイルをコピーしてはいけません。
🧑💻 containers: command: スクリプト説明
- .bashrc ファイルに使いやすい alias をいくつか指定
'--color=auto' を指定すると、ファイル名が次のように色分けされます。
dir file: redis-sentinel-model
exec file: cluster_create.sh
tar file: file redis-8.8.2.tar
- redis.tar ファイルの基準時刻は UTC(英国) です。 韓国時間(host OS time) に変更します。
🟢 [3段階-2] Sentinel ポッド(Pod) 生成明細書: sentinel-statefulset.yaml
Sentinel ポッド(Pod)(replicas, initContainers, memory, pvc(disk volume)) 生成明細書ファイルです。
- 種類(kind): StatefulSet
- 名前: metadata: name: sentinel
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう制限されます(大文字は使用不可)
この名前に sentinel-0,1,2 のように数字を付けてポッド(Pod) 名を付けます。
ポッド(Pod) 名と serviceName を使って、次のように FQDN(Full Qualified Domain Name) を作ります。
sentinel-0.sentinel-service.default.svc.cluster.local
Redis ごとに固有の FQDN 名で Sentinel 同士、または Sentinel と App の間で通信できます。
IP が変わると、変更後の IP を FQDN に接続(設定)します。
💾 sentinel-statefulset.yaml
➡ 準備ができましたので、ポッド(Pod) を生成しに行きましょう。
| << K8s Redis-Cluster App ② | K8s Redis-Sentinel 構築 ② >> |
|---|
