クバネティス(Kubernetes) 環境での Redis 構築ガイド ②


  k3s  

☸️ k3s は何か?

今回の Redis インストール/テスト環境では、CNCF 認証を受けた軽量クバネティス ディストリビューションである 'K3s' を使いました。

k8s(標準クバネティス)と k3s の違い

比較項目標準クバネティス (k8s)K3s (Lightweight Kubernetes)
目的大規模エンタープライズデータセンター軽量データセンター、Edge、IoT、開発および中小規模クローズドネットワーク
インストールと容量インストールが複雑でメモリ占有率が高い
(>2GB RAM)
単一バイナリ実行ファイル (<512MB RAM)
データストア基本 etcd 専用SQLite(基本)、etcd、外部 DB(MySQL/PostgreSQL) サポート
基本ストレージ別途 StorageClass (CSI) インストールが必要'local-path' StorageClass 内蔵 (すぐ PVC 使用可能)
コンテナ
ランタイム
containerd, CRI-O など別途設定containerd を基本同梱し、イメージ自動ロードをサポート

💡 redisgate's Insight: K3s はリソースを節約すべき環境やインターネットが切れたクローズドネットワーク環境で Redis を検証し 運用するのに、高い性能と利便性を提供します。

k3s インストール

containerd および kubectl を自動同梱
'StatefulSet'、'Headless Service'、'PVC'、'podAntiAffinity'(仮想ノードテスト) など Redis テストに必要なすべての K8s 機能を 100% 同一に提供します。

  • 1段階: K3s インストール (root user を使用)
    • 1) インストール: # curl -sfL https://get.k3s.io | sh -
    • 2) 状態確認: # k3s kubectl get nodes
      💻 Terminal

  • 2段階: 一般(redis) ユーザーが 'kubectl' を使えるよう権限を付与
    K3s がインストールされると K8s 認証ファイルである 'k3s.yaml' が '/etc/rancher/k3s/' ディレクトリに生成されますが、 基本的に 'root' だけが読めるようになっています。 これを redis ユーザーのホームディレクトリへコピーしてくれば、sudo なしでも kubectl コマンドをすぐ使えます。 (sudo 可能な一般(redis) user を使用)
    • ① redis ユーザーのホームディレクトリに .kube フォルダを作成
      $ mkdir -p ~/.kube
    • ② k3s 設定ファイルを redis ユーザーホームへコピー (sudo が必要)
      $ sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
    • ③ コピーしたファイルの所有権を redis ユーザーへ変更 (sudo が必要)
      $ sudo chown $(id -u):$(id -g) ~/.kube/config
    • ④ 権限設定 (セキュリティ強化)
      $ chmod 600 ~/.kube/config
  • 3段階: redis ユーザーで動作確認
    これで redis ユーザー状態から sudo なしで、すぐクバネティスクラスターの状態を照会できます。
    💻 Terminal

  • もう一歩: kubectl コマンドの自動補完および別名(Alias) のヒント
    redis アカウントの '~/.bashrc' ファイルに以下の設定を追加しておくと、テストするとき非常に便利です。
    # redis ユーザーの ~/.bashrc の末尾に追加
    💻 Terminal
    # 変更内容の適用
    $ source ~/.bashrc
    このように設定しておくと 'kubectl get pods' の代わりに 'k get pods' のように短いコマンドで K3s を 簡単に操作できます。
  • スクリプトの説明
    • 'KUBECONFIG': 'kubectl' コマンドが K3s 環境で実行されるとき、デフォルトとして '/etc/rancher/k3s/k3s.yaml' ファイルを先に見るよう、K3s 自身の環境変数または ラッパー(Wrapper) スクリプトが設定されています。これを コピーした '~/.kube/config' ファイルを明示的に見るよう 'KUBECONFIG' 環境変数を指定する必要があります。
    • 'alias k=kubectl': 'k' も 'kubectl' と同じように使えるよう別名(alias) を指定
    • 'kubectl completion bash' 自動補完機能: クバネティスは 'get'、'describe'、'logs'、'statefulset'、'persistentvolumeclaim' など 覚えるべき補助コマンドとリソース種類が非常に長く多いです。
      'kubectl completion bash' コマンドは Bash シェルで使える自動補完ルールスクリプトを出力してくれ、 これを 'source' コマンドでシェルに読み込み、単語入力中に 'Tab' キーを押すと次のコマンドを自動で 推薦するよう作る設定です。
      * 効果の例:
      - 'kubectl get stat' 入力後 'Tab' -> 'kubectl get statefulsets' に自動補完!
      - 'kubectl des' 入力後 'Tab' -> 'kubectl describe' に自動補完!
    • 'complete -o default -F __start_kubectl k': 意味: 先に作った自動補完機能を別名(alias)である 'k' にも同じように接続します。

☸️ 便利なクバネティス コマンド集

  • ポッド情報の照会: kubectl get pods
    💻 Terminal

  • ポッド詳細情報の照会(IP、実行ノードを含む): kubectl get pods -o wide
    💻 Terminal

  • 特定ポッドの詳細情報およびイベント確認 (問題発生時の原因分析用): kubectl describe pod redis-0
    💻 Terminal

  • ポッド名と IP アドレスだけきれいに出力:
    kubectl get pods -o custom-columns=POD_NAME:.metadata.name,POD_IP:.status.podIP
    💻 Terminal

  • ディスクボリューム(PersistentVolumeClaim) 照会: kubectl get pvc
    💻 Terminal

  • Linux shell 接続: kubectl exec -it redis-0 -- /bin/bash
    kubectl exec -it redis-0 -- /bin/bash -> 一般イメージ: bash で接続
    kubectl exec -it redis-0 -- /bin/sh -> Alpine イメージ: sh で接続(alpine イメージには bash がない)
  • Redis 接続: kubectl exec -it redis-0 -- redis-cli -p 18504 -a password
  • Redis コマンド実行: kubectl exec -it redis-0 -- redis-cli -p 18504 -a password info
  • Redis ログ表示: kubectl exec -it redis-0 -- tail -f /data/redis.log
  • YAML ファイル適用: kubectl apply -f redis-config.yaml
  • ポッド削除: kubectl delete pod redis-0
  • redis ポッドをすべて削除: kubectl delete statefulset redis
  • ストレージ(pvc) 削除: kubectl delete pvc redis-data-redis-0
    複数指定可能: kubectl delete pvc redis-data-redis-0 redis-data-redis-1 redis-data-redis-2
  • ストレージ(pvc) をすべて削除: kubectl delete pvc --all

☸️ Redis エンジニアが必ず知っておくべきクバネティスのコア概念

  • ① StatefulSet (状態維持のためのポッド集合)
    一般の Web サーバー(Stateless)は 'Deployment' で管理されますが、Redis のようなデータベース(Stateful)は 必ず 'StatefulSet' で管理する必要があります。
    • ポッドに 'redis-0'、'redis-1'、'redis-2' のように順次で固定された名前(Ordinal Index)が付与されます。
    • ポッドが再起動すると IP は変わりますが、名前と割り当てられたディスク(PVC)はそのまま維持されます。 Redis 7.0 から『名前』通信をサポートするため、IP が変わっても問題ありません。
  • ② Headless Service ('clusterIP: None')
    一般サービスはポッドたちの単一代表 IP(ClusterIP)を提供しますが、Redis Cluster/Sentinel は ノード個別アドレスを知る必要があります。
    • 'clusterIP: None' 設定時、K3s 内部 DNS が 'redis-0.redis-service.default.svc.cluster.local' のような 固定 FQDN ドメイン名を各ポッドの仮想 IP へ自動マッピングします。
  • ③ initContainers (初期化コンテナ)
    メイン 'redis-server' プロセスが起動する前に実行される一回限りのコンテナです。
    • ConfigMap の読み取り専用設定を書き込み可能な '/data' パスへコピーします。
    • ポッドのインデックス('redis-0' -> '0')を抽出して 'replica-priority'、'cluster-announce-hostname'、 'replicaof' などのオプションを動的に計算および注入します。

☸️ ドッカー(Docker)、コンテナ(Container)、ポッド(Pod) の概念および関連関係

これまでベアメタル(Bare-Metal/物理サーバー)や仮想マシン(VM) 環境で Redis を扱っていたエンジニアが クバネティス エコシステムに入るとき、最初に混乱するのがまさに Docker、コンテナ、ポッドの概念差です。 三つの技術概念と、それらがどのように接続されて動作するかを体系的に整理します。
Docker とクバネティスは競争関係ではなく、役割の異なるパートナーです。 Docker はコンテナを『作る』道具であり、クバネティスはそのコンテナを『管理する』道具です。

1. 個別概念の説明

┌───────────────────────────────────────┐ │ Pod (K8s deployment unit / Bean pod) │ │ IP: 10.42.0.125 │ │ │ │ ┌────────────────────────┐ │ │ │ Container │ │ │ │ (redis-server) │ │ │ │ [Docker image based] │ │ │ └────────────────────────┘ │ └───────────────────────────────────────┘

  • ① ポッド(Pod): クバネティスが管理する『最小デプロイ単位』
    • 定義: 一つ以上のコンテナを一つに束ね、クバネティスがスケジューリングし管理する最も小さい単位。
    • 語源: 'Pod' は植物の『豆のさや(Bean Pod)』を意味します。さやの中に複数のエンドウ豆(コンテナ)が 入っている姿を形にしたものです。
    • 役割: クバネティスはコンテナ単独では管理せず、必ずポッド(Pod)という殻で包んで管理します。 一つのポッド内に属するコンテナは同一の Pod IP、同一のネットワーク(Port は複数設定可能)空間、 同一の保存領域(Volume)を共有します。
  • ② コンテナ(Container): 隔離されて実行される『プロセス』
    • 定義: Docker イメージという『型』をもとに Host OS 上で独立したメモリ、ファイルシステム、プロセス 空間を割り当てられ、隔離されて実行中の実際のプログラム(プロセス)です。
    • 比喩: 型から焼いて出てきた『本物のたい焼き』または『実際の貨物ボックス』
    • 役割: Host OS のカーネルを共有するため仮想マシン(VM)のように heavy ではなく、数秒以内に速く 起動し停止する『Stateless な実行オブジェクト』です。 しかしストレージ(PVC)を使って状態を保存/照会でき、元の状態へ復元できます。 つまり Stateful 可能。➡ Redis では redis.conf、sentinel.conf、nodes.conf ファイルを rewrite して ポッド再起動時にも以前の状態へ復元できます。
  • ③ ドッカー(Docker): コンテナを作る『型』であり『プラットフォーム』
    • 定義: アプリケーションと実行に必要なすべてのライブラリ/エンジンを『コンテナイメージ』という標準規格 ファイルとしてパッケージし実行してくれるプラットフォーム(道具)です。
    • 比喩: 『たい焼きの型』または『標準貨物コンテナ規格およびクレーン』
    • 役割: 'docker build' を通じて 'redis:8.8.2' のような実行可能なイメージファイルを作り、 それを中央保存領域(Docker Hub など)へ上げたり引いてくる役割を担当します。

2. 一目で理解する簡単な比喩

区分比喩 (生態系)実際の Redis 環境の比喩
ポッド(Pod)エンドウ豆が入った『さや』[Redis]が入っている 'redis-0' ポッド
コンテナ(Container)殻の中の『エンドウ豆一粒』実行中の 'redis-server' プロセス
ドッカー(Docker)『エンドウ豆の品種 (種)』'redis:8.8.2' イメージファイル

3. 三つの技術の関連関係および階層構造

三つの概念は独立したものではなく、下位概念が上位概念に含まれる包含関係(Hierarchy)を持ちます。
[ Docker Image ] ──(実行)──> [ Container ] ──(包装/管理)──> [ Pod ]
(hub.docker.com)                           (実際のプロセス)                               (k8s が管理する)

  • 1) イメージビルド段階 (Docker の領域):
    • Docker Hub からダウンロードした場合: 'https://hub.docker.com/' からダウンロードします。
    • 自分で作る: エンジニアはドッカー(Docker)を使い、Redis ソースコードと設定ファイル(redis.conf)を束ねて 'redis:8.8.2' という Docker イメージを生成します。
  • 2) コンテナ生成段階 (Runtime の領域):
    Docker イメージを実行すると OS 上に独立したメモリ空間を持つコンテナが生成されます。 比喩すれば、実行中の Redis プロセス一つが起動したことです。
  • 3) クバネティス ポッド構成段階 (Kubernetes の領域):
    クバネティスはこのコンテナを直接制御せず、ポッド(Pod)という単位で包みます。
    • 単一コンテナポッド (Redis Cluster など): 1 個 Pod = 1 個 'redis-server' コンテナ
    • マルチコンテナポッド (Redis Sentinel Sidecar パターンなど): 1 個 Pod = 1 個 'redis-server' コンテナ + 1 個 'redis-sentinel' コンテナ (サイドカー)


<< クバネティス 入門 ① クバネティス Redis 準備 ③ >>

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