k8s_redis_cluster_1
クバネティス(Kubernetes) 環境で Redis-Cluster 準備 実戦ガイド ①
仕様書(YAML) 概要と内容
Redis-Cluster 概要
Redis-Clusterは Redis 3個のポッド(Pod)(マスター)にデータを分散して保存(管理)し、
各ポッド(Pod)(マスター)はバックアップ(複製)ポッド(Pod)を持っています。
Redis マスター ポッド(Pod)がダウンすると、バックアップ(複製) Redis がマスターに昇格します。
6個のポッド(Pod)(マスター 3個、複製 3個)で Redis-Cluster を構成してみましょう。
🔗
Redis-Clusterの全体的な内容はこちらをご覧ください。
1. Redis-Cluster 仕様書(YAML)
クバネティス(Kubernetes)で Redis-Clusterをデプロイするときは、設定(Config)、サービス(Service)、 生成(StatefulSet)の役割に分けて 3つの YAML ファイルで管理します。
2. デプロイ順に見るファイル別の内容説明
🟢 [1段階] Redis 設定: redis-cluster-config.yaml
- 種類(kind): ConfigMap
- 名前(metadata:name): redis-cluster-config
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう厳しく制限されています(大文字は使用不可)
- ConfigMap 設定ファイルです。ここに設定した指示子で redis.conf ファイルを作ります。
- 既存の圧縮(tar)ファイルにデフォルトで含まれる redis.conf ファイルは使用しません。
- Redis インスタンス(ポッド(Pod))ごとに異なる値が必要なら、 ステートフルセット(StatefulSet)で command スクリプトを使って動的に設定できます。 例) cluster-announce-hostname redis-cluster-0,1,2...
🧑💻 主な値の説明
- 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 # 必ず設定してください。
- cluster-node-timeout 3000 # ノード(Node) ダウン検知時間(3000ms(3sec)): 3秒に設定します。
- cluster-announce-hostname, cluster-announce-human-nodename の2項目はポッド(Pod) 生成時に
statefulset.yaml ファイルの initContainer:command でポッド(Pod) 名を求めて動的に注入します。
したがってここでは設定しません。
echo "cluster-announce-hostname ${POD_FQDN}" >> /data/redis.conf
echo "cluster-announce-human-nodename ${POD_NAME}" >> /data/redis.conf
- users.acl: 90~91行の設定。Password('#0cbc...' 64桁)は別に設定する必要があります。
詳しい内容はこちらを参照してください。 🔗 ACL
💾 redis-cluster-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 portはハッキングの主なターゲットです。必ず別のポートを使ってください。
- 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 します。 - #cluster-announce-hostname "" -> コメントアウト(default)
- #cluster-announce-human-nodename "" -> コメントアウト(default)
🟢 [2段階] サービス(Service) 設定: redis-cluster-service.yaml
- 種類(kind): Service
- 名前(metadata:name): redis-cluster-service
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう厳しく制限されています(大文字は使用不可)
- Service 設定ファイルです。
ポッド(Pod)の IP が変わっても、固定のドメイン名(FQDN:Full Qualified Domain Name)で
個別 Redis にアクセスできるよう、あらかじめネットワークの住所録を作る役割です。
🧑💻 主な値の説明
- clusterIP: None # 📍'None' に設定(個別ポッド(Pod) DNS 単独識別用)
- port: 18504 # Redis ポート
- port: 28504 # Redis クラスタ ポート
💾 redis-cluster-service.yaml を見る
🟢 [3段階] Redis ポッド(Pod) 生成仕様書: redis-cluster-statefulset.yaml
Redis ポッド(Pod)(replicas, initContainers, memory, pvc(disk volume)) 生成仕様書ファイルです。
- 種類(kind): StatefulSet
- 名前(metadata:name): redis-cluster
⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使用するよう制限されています(大文字は使用不可)
この名前で redis-cluster-0,1,2 のように数字を付けてポッド(Pod) 名を付けます。
ポッド(Pod)名と serviceName を使って、次のように FQDN(Full Qualified Domain Name) を作ります。
redis-cluster-0.redis-cluster-service.default.svc.cluster.local
Redis ごとに固有の FQDN 名で、Redis 間または Redis と App 間で通信できます。
IP が変わると、変わった IP を FQDN に接続(設定)します。
🧑💻 主な値の説明
- configMap: name: redis-cluster-config (1段階の Redis 設定と接続)
- serviceName: redis-cluster-service (2段階の Service と接続)
- replicas: 6 # Redis ポッド(Pod) 6個を生成、Master(3個)、Replica(3個)への役割分けは Redis-Cluster 構成(生成)時に決まります。
- 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-cluster-statefulset.yaml を見る
🧑💻 initContainers: command: スクリプト説明
- ① ConfigMapから読み取り専用 redis.conf を書き込み可能な /data へコピー
Redis は 'config rewrite' コマンドで conf ファイルを書き直すこともあり、 Master-Replica の役割が変わると 'replicaof' 指示子が書き直されます。 そのため redis.conf ファイルは read-write 可能な dir にある必要があります。
📄 initContainers: command: cp redis.conf - ② users.acl ファイルのコピーと権限付与
📄 initContainers: command: cp users.acl - ③ Redis Cluster で動的に FQDN を求めて cluster-announce-*name に注入
📄 initContainers: command: cluster-announce-*name
🧑💻 containers: command: スクリプト説明
- ④ 🚩 .bashrc ファイルに使いやすい alias をいくつか指定
📄 containers: command: .bashrc
'--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)に変更します。
📄 containers: command: localtime
➡ 準備できたので、ポッド(Pod) を生成しに行きましょう。
| << クバネティス Redis 準備 ③ | K8s Redis-Cluster 構築 ② >> |
|---|
