はじめに
Kubernetes(k8s)は、
現代のWebアプリケーション運用において 事実上の標準技術 となっています。
DockerやDocker Composeでアプリを動かせるようになった次の壁が、
- Kubernetesでは何をどう書けばいいのか分からない
- Node.js / Pythonアプリをどうやってデプロイするのかイメージできない
- YAMLファイルが多くて混乱する
という点です。
本記事では、Node.js / PythonアプリをKubernetes上で動かすまでの全体像を、
- 設計思想の解説
- 用語の整理
- 実践ハンズオン
を交えながら、初心者が迷わないように文章多めで丁寧に解説します。
Kubernetes × アプリ開発の全体像
Kubernetesでアプリを動かす流れは、次のステップに分解できます。
- アプリを作る(Node.js / Python)
- Dockerでコンテナ化する
- Kubernetes用のYAMLを書く
- Deploymentでアプリを管理
- Serviceで外部公開
この流れを理解できると、本番運用レベルの基礎が身につきます。
Docker Composeとの思想の違い
Docker Composeは「開発効率」が主目的です。
一方、Kubernetesは「運用の自動化・安定性」が目的です。
| 観点 | Docker Compose | Kubernetes |
|---|---|---|
| 想定規模 | 小〜中 | 中〜大 |
| 障害時 | 手動対応 | 自動復旧 |
| Pod/Container数 | 少数 | 多数 |
| 本番運用 | 限定的 | 前提 |
Kubernetesは「落ちる前提で設計する」思想が特徴です。
KubernetesでNode.js / Pythonを使うメリット
Node.jsやPythonはAPI・Webアプリで非常によく使われます。
Kubernetesと組み合わせることで、次のような恩恵があります。
- プロセスが落ちても自動で再起動
- アクセス増加時にPodを増やせる
- バージョンアップ時も無停止で切り替え可能
- クラウド(GKE / EKS / AKS)にそのまま移行可能
「ローカルで動いたものを、そのまま本番へ」
これを実現できるのがKubernetesです。
Kubernetesの基本リソース(復習+深掘り)
Pod
- 1つ以上のコンテナをまとめた実行単位
- IP・ストレージを共有する
Deployment
- Podの数(replicas)を管理
- 再起動・ローリングアップデートを制御
Service
- Podの前段に立つ入口
- Podが増減してもアクセス先を固定できる
この3つが 最重要リソース です。
【ハンズオン①】Kubernetes × Node.js(Express)
使用技術
- Node.js
- Express
- Kubernetes(Docker Desktop)
① Node.jsアプリ作成
index.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello Kubernetes with Node.js!");
});
app.listen(3000, () => {
console.log("Node.js app running on port 3000");
});
ポイント
- ポートは3000固定
- ステートレス(重要)
② Dockerfile(Node.js)
FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "index.js"]
Kubernetesでは 軽量イメージ(alpine) が基本です。
③ イメージをビルド
docker build -t node-k8s-sample .
④ Deployment作成
node-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app
spec:
replicas: 2
selector:
matchLabels:
app: node
template:
metadata:
labels:
app: node
spec:
containers:
- name: node
image: node-k8s-sample
ports:
- containerPort: 3000
ここが重要
replicas: 2→ 冗長化- Podが落ちても自動復旧
⑤ Service作成
node-service.yaml
apiVersion: v1
kind: Service
metadata:
name: node-service
spec:
type: NodePort
selector:
app: node
ports:
- port: 3000
targetPort: 3000
nodePort: 30001
⑥ デプロイ
kubectl apply -f node-deployment.yaml
kubectl apply -f node-service.yaml
⑦ 動作確認
http://localhost:30001
【ハンズオン②】Kubernetes × Python(Flask)
使用技術
- Python
- Flask
- Kubernetes
① Pythonアプリ作成
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello Kubernetes with Python!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
hostを0.0.0.0にする理由
→ コンテナ外からアクセスするため
② Dockerfile(Python)
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
③ Deployment & Service
Pythonも Node.jsと構造は同じ です。
言語が変わってもKubernetesの考え方は共通です。
スケーリングを体験する
kubectl scale deployment node-app --replicas=4
kubectl get pods
アクセスが増えたらPodを増やす
これがKubernetes最大の強みです。
よくある設計ミス(初心者向け注意点)
- コンテナ内に状態を持つ
- ポート番号がServiceと不一致
- latestタグを本番で使う
- リソース制限を書かない
実務でよく使うkubectl
kubectl get pods
kubectl get svc
kubectl logs <pod名>
kubectl describe pod <pod名>
まとめ
Kubernetes × Node.js / Pythonを理解すると、
- 本番運用を見据えた設計ができる
- スケーラブルなAPIを構築できる
- クラウドネイティブ開発に対応できる
Dockerの次に学ぶべき 実践的スキル がここにあります。
コメントを残す