k8s_intro_2
クバネティス(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
- ① redis ユーザーのホームディレクトリに .kube フォルダを作成
- 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' にも同じように接続します。
- 'KUBECONFIG':
'kubectl' コマンドが K3s 環境で実行されるとき、デフォルトとして
'/etc/rancher/k3s/k3s.yaml' ファイルを先に見るよう、K3s 自身の環境変数または
ラッパー(Wrapper) スクリプトが設定されています。これを
コピーした '~/.kube/config' ファイルを明示的に見るよう 'KUBECONFIG'
環境変数を指定する必要があります。
☸️ 便利なクバネティス コマンド集
- ポッド情報の照会: 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): クバネティスが管理する『最小デプロイ単位』
- 定義: 一つ以上のコンテナを一つに束ね、クバネティスがスケジューリングし管理する最も小さい単位。
- 語源: '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 準備 ③ >> |
|---|
