こんにちは!花木です。
前回はdocker-compose
を使って複数のコンテナをまとめて管理する方法を学びました。
今回は、いよいよシリーズ最終章。docker-compose
では管理しきれない、大規模なシステムを動かすためのツール、 Kubernetes を体験してみましょう。
1. なぜKubernetesを使うのか?
前回のdocker-compose
は、1台のサーバー上で複数のコンテナを管理するのに便利でした。
しかし、本番環境ではサーバーの故障や急なアクセス増といった、予測不能な事態が起こり、それらに対して手動で対応するのは非常に困難です。
Kubernetesは、これらの問題を解決するための「コンテナオーケストレーション」ツールです。
例えるなら、 コンテナを管理する「自動運転システム」 です。一度設定してしまえば、あとはKubernetesがコンテナの配置、自動スケーリング、故障時の自己修復などを、自動で面倒を見てくれます。
2. Kubernetesの導入:Kindを使おう
Kubernetesを試すには、専用の環境を構築する必要があります。
今回は、Dockerコンテナ内でKubernetesを動かす軽量ツール Kind (Kubernetes IN Docker) を使います。
Kindは、ローカルPCにKubernetes環境を簡単に用意できるため、学習用途に最適です。
① 必要なツールのインストール
Kindを動かすには、以下の2つのツールが必要です。
- Docker: ホストとなるコンテナ実行環境です。Kind自体がDockerコンテナとして動作します。
- kubectl: Kubernetesクラスターを操作するためのコマンドラインツールです。
kind
はdnf
などのパッケージマネージャーからは直接インストールされないため、公式サイトからバイナリを直接ダウンロードして配置するのが一般的です。
ダウンロードのコマンドについては以下のようになっています。
# Kindのインストール
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# kubectlのインストール
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
3. Kubernetesを使ってみよう:WordPressをデプロイ
前回docker-compose
で動かしたWordPressを、今回はKubernetesで動かしてみましょう。
docker-compose
がdocker-compose.yml
という単一ファイルで設定をまとめるのに対し、Kubernetesは、Deployment
やService
といった 「マニフェストファイル」 と呼ばれる設定ファイルを複数作成して、システムの構成を細かく定義します。
今回は、WordPressとMySQLそれぞれの Deployment と Service 、合計4つの要素を一つのファイルにまとめて定義します。
① Kubernetesクラスターの作成
Kindは、たった1つのコマンドでKubernetesクラスターを作成できます。
kind create cluster
② マニフェストファイルの作成
プロジェクトのディレクトリを作成し、その中にwordpress.yaml
というファイルを作成します。
mkdir my-wordpress-k8s
cd my-wordpress-k8s
touch wordpress.yaml
作成したwordpress.yaml
に以下の内容を書き込みます。
サンプルコード
# WordPressのDeployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deployment
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: mysql-service
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: password
- name: WORDPRESS_DB_NAME
value: wordpress
---
# WordPressのService
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
spec:
selector:
app: wordpress
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
---
# MySQLのDeployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: password
- name: MYSQL_DATABASE
value: wordpress
---
# MySQLのService
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
③ YAMLファイルの主な設定項目解説(docker-compose
との比較)
このKubernetes用YAMLファイルは、前回のdocker-compose.yml
と同じ機能を持っていますが、その構造と概念には大きな違いがあります。
Kubernetes (wordpress.yaml ) |
Docker Compose (docker-compose.yml ) |
|
---|---|---|
ファイル構造 | 複数のドキュメント(オブジェクト)から構成される。--- で区切る。 |
services キー以下に全てのサービスを定義する。 |
概念 | 宣言的(Declarative)。最終的に「あるべき状態」を記述する。 | 命令的(Imperative)。どう動かすかを記述する。 |
コンポーネント |
Deployment やService など、役割ごとにオブジェクトが分かれている。 |
services キー以下に、コンテナに関する設定をまとめる。 |
各設定項目の詳細な違い
-
apiVersion
とkind
-
Kubernetes: これらは、Kubernetesのオブジェクトの種類を定義する必須項目です。
kind: Deployment
はアプリケーションのデプロイを管理するオブジェクト、kind: Service
はコンテナへのアクセスを管理するオブジェクトであることを示します -
Docker Compose: これらの概念は存在せず、
services
の下に記述されたものがすべて「サービス」として扱われます
-
Kubernetes: これらは、Kubernetesのオブジェクトの種類を定義する必須項目です。
-
metadata
とlabels
-
Kubernetes:
metadata
セクションで、オブジェクトの名前やラベルを定義します。ラベルは、オブジェクトを識別し、関連付けるための「名札」のようなものです。例えば、Service
はselector: app: wordpress
という設定で、app: wordpress
というラベルを持つPod
を見つけてトラフィックを転送します -
Docker Compose: コンテナ名を指定する
container_name
はありますが、Kubernetesのような柔軟なラベルによる管理概念はありません
-
Kubernetes:
-
spec
-
Kubernetes: オブジェクトの具体的な「あるべき状態(Desired State)」を記述するセクションです。
replicas: 1
と記述することで、「このコンテナを1つ動かしておいてね」と宣言します -
Docker Compose: 設定項目が直接記述されるため、
spec
のようなセクションはありません
-
Kubernetes: オブジェクトの具体的な「あるべき状態(Desired State)」を記述するセクションです。
-
コンテナ間の通信
-
Kubernetes:
Service
が重要な役割を果たします。wordpress
コンテナのWORDPRESS_DB_HOST
に**mysql-service
**と指定することで、WordPressはmysql-service
という名前でデータベースにアクセスできます。これは、Service
が提供する安定した内部DNS名による通信です -
Docker Compose: デフォルトのネットワーク内で、サービス名(この例では
db
)がコンテナのホスト名として機能します。KubernetesのService
のような、より高度なロードバランシング機能はありません
-
Kubernetes:
-
外部からのアクセス
-
Kubernetes:
Service
オブジェクトのtype: NodePort
設定により、クラスター外部から特定のポート経由でサービスにアクセスできるようにします。これは、Kubernetesにおける外部公開の基本的な方法です -
Docker Compose:
ports: "8080:80"
でホストOSのポートを直接コンテナにマッピングします
-
Kubernetes:
Kubernetesは、より多くの設定が必要ですが、その分、Deployment
によるコンテナの自動修復やService
による柔軟なネットワーク管理など、本番環境で必須となる機能を実現できます。
④ アプリケーションのデプロイ
kubectl apply
コマンドを使って、作成したマニフェストファイルをKubernetesクラスターに適用します。
kubectl apply -f wordpress.yaml
このコマンドを実行すると、Kubernetesはファイルの内容を読み込み、WordPressとMySQLのコンテナを自動で立ち上げてくれます。
⑤ 動作確認
kubectl get pods
コマンドで、コンテナ(Pod)が正しく起動しているか確認します。
kubectl get pods
Running
状態のPodが2つ作成されていれば成功です。
NAME READY STATUS RESTARTS AGE
mysql-deployment-xxxx-xxxx 1/1 Running 0 1m
wordpress-deployment-xxxx-xxxx 1/1 Running 0 1m
⑥ 外部からのアクセス
Kind環境では、kubectl port-forward
コマンドを使って、ローカルPCからサービスにアクセスできるようにします。
kubectl port-forward svc/wordpress-service 8080:80 --address サーバのIPアドレス
このコマンドを実行したまま、ウェブブラウザから http://サーバのIPアドレス:8080
にアクセスしてみてください。WordPressの初期設定画面が表示されるはずです。
補足:--addressオプションについて
--address
オプションは、kubectl port-forward
がどのIPアドレスからの接続を待ち受けるかを指定します。
-
--address 0.0.0.0
: すべてのネットワークインターフェース(外部からの接続も含む)をリッスンします -
--address 127.0.0.1
:localhost
からの接続のみをリッスンします(これがデフォルト動作です) -
--address [ゲストOSのIPアドレス]
: 特定のIPアドレスからの接続のみをリッスンします。セキュリティを考慮する場合に有効です
4. まとめと次のステップ
今回は、Kindを使ってKubernetesにWordPressをデプロイしました。docker-compose
が単一ファイルで完結するのに対し、KubernetesではDeployment
やService
といった複数のオブジェクトを組み合わせて、より詳細な設定ができることを体験しました。
次回は、今回デプロイしたアプリケーションのスケーリングや自己修復といった、Kubernetesの強力な機能についてさらに深く掘り下げていきます。お楽しみに!
👤 プロフィール
![]() |
セントラルソフト株式会社
|