クバネティス(Kubernetes) 環境で Redis-Sentinel Sidecarパターン 構築 実践ガイド ①


Sidecarパターンの概念

1つのポッド(Pod) に密接に結合した協働構造(2つのコンテナ(Container)/プロセス)を扱うためです。 例えば、Webサーバー(メイン)コンテナ(Container)(例: Nginx, Node.js)の横にログ収集器やセキュリティプロキシ (サイドカー(Sidecar))コンテナ(Container) を付ける必要があるときがあります。 サイドカー(Sidecar) コンテナ(Container) はメインコンテナ(Container) に従属しているときに使います。 つまりメインコンテナ(Container) がダウンすると、サイドカー(Sidecar) コンテナ(Container) が生きていても意味がないときに使います。

概念は少し異なり、Sentinel は Redis と別に運用するのが正しいですが(Redis を監視するため、同じポッド(Pod) に置いて 一緒に落ちてはいけません。Sentinel は別ポッド(Pod) で構成するのが正しいです)、Redis-Sentinel 構成を3ポッド(Pod) で作らなければならない場合に 試してみることができます。   そして(幸い)Sentinel は CPU(1core) を平時は1〜2%使い、ピーク時でも5%以下で 使い、メモリも約10MBしか使わないので Sidecarパターン で構成してみましょう。

1. Redis-Sentinel Sidecarパターン 仕様書(YAML)

クバネティス(Kubernetes) で Redis-Sentinel Sidecarパターン をデプロイするときは設定(Config)、サービス(Service)、 作成(StatefulSet) の役割を明確に分けて3つの YAML ファイルで管理します。

┌──────────────────────────────────────────────────────────┐ │ 1. redis-sentinel-sidecar-config.yaml (ConfigMap) │ │ : redis.conf, sentinel.conf, users.acl │ └──────────────────┬───────────────────────────────────────┘ │ [1段階: 設定の提供] ▼ ┌──────────────────────────────────────────────────────────┐ │ 2. redis-sentinel-sidecar-service.yaml (Service) │ │ : redis-sentinel-service, port, sentinel-port │ └──────────────────┬───────────────────────────────────────┘ │ [2段階: サービスの準備] ▼ ┌──────────────────────────────────────────────────────────┐ │ 3. redis-sentinel-sidecar-statefulset.yaml (StatefulSet) │ │ : Config, Service -> redis-sentinel-0~3 (3Pods) │ │ Persistent Volume Claim (PVC) │ └──────────────────────────────────────────────────────────┘ [3段階: Redis/Sentinel ポッド作成]

2. デプロイ順に沿ったファイル別の内容説明

🟢 [1段階] Redis-Sentinel Sidecarパターン 設定: redis-sentinel-sidecar-config.yaml

  • 種類(kind): ConfigMap
  • 名前(metadata:name): redis-sentinel-sidecar-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
    statefulset.yaml の initContainer:command で動的に注入されます。
  • replica-announce-ip # 📍redis-0.redis-service...
    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-sidecar-config.yaml を表示 ▼
📄 redis-sentinel-sidecar-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 します。
  • # replica-announce-ip -> コメントアウト(default)

🟢 [2段階] サービス(Service) 設定: redis-sentinel-sidecar-service.yaml

  • 種類(kind): Service
  • 名前(metadata:name): redis-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-sidecar-service.yaml を表示 ▼
📄 redis-sentinel-sidecar-service.yaml

🟢 [3段階] Redis/Sentinel ポッド(Pod) 作成仕様書: redis-sentinel-sidecar-statefulset.yaml

Redis ポッド(Pod)(replicas, initContainers, memory, pvc(disk volume))作成仕様書ファイルです。

  • 種類(kind): StatefulSet
  • 名前: metadata: name: redis-sentinel
    ⚠️ 名前は小文字(a-z)、数字(0-9)、ハイフン(`-`)のみ使うよう制限します(大文字は使用不可)
    この名前で redis-sentinel-0,1,2 のように数字を付けてポッド(Pod) 名を付けます。
    ポッド(Pod) 名と serviceName を使って、次のように FQDN(Full Qualified Domain Name) を作ります。
    redis-sentinel-0.redis-sentinel-service.default.svc.cluster.local
    Redis ごとに固有の FQDN 名で、Redis 間、Sentinel と Redis 間、または Redis/Sentinel と App 間で通信できます。 IP が変わると、変わった IP を FQDN に接続(設定)します。

🧑‍💻 主な値の説明

  • configMap: name: redis-sentinel-sidecar-config (1段階の Redis/Sentinel 設定と接続)
  • serviceName: redis-sentinel-service (2段階の Service と接続)
  • replicas: 3
    • ポッド(Pod)① Redis-0(Master)/Sentinel-0
    • ポッド(Pod)② Redis-1(Replica-1)/Sentinel-1
    • ポッド(Pod)③ Redis-2(Replica-2)/Sentinel-2
  • 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-sentinel-sidecar-statefulset.yaml ▼
📄 redis-sentinel-sidecar-statefulset.yaml

🧑‍💻 initContainers: command: スクリプト説明

  • ポッド(Pod) インデックス(数字)抽出(redis-sentinel-0 -> 0, redis-sentinel-1 -> 1, redis-sentinel-2 -> 2)してポッド(Pod) ごとに 動的設定に使います。
    📄 initContainers: command

  • redis.conf ファイルがあればコピーしません。(初回起動時のみコピーして設定を注入)
    Redis は運用中の重要イベント発生時に redis.conf へ書き込む(write) ため、ポッド(Pod) 再起動時に 生成済みファイルをコピーしてはいけません。
    📄 initContainers: command: redis.conf

  • users.acl ファイルがあればコピーしません。(初回起動時のみコピー)
    📄 initContainers: command: users.acl

  • sentinel.conf ファイルがあればコピーしません。(初回起動時のみコピーして設定を注入)
    📄 initContainers: command: sentinel.conf

🧑‍💻 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
  • 基準時刻は UTC(英国)です。韓国時間(host OS time)に変更します。
    📄 containers: command: 韓国時間(host OS time)に変更

➡ 準備できたので、ポッド(Pod) を作成しに行きましょう。


<< K8s Redis-Sentinel App ② K8s Sidecarパターン 構築 ② >>

Email 返事がかかってなれば、メールでお知らせします。