Kubernetes を勉強したいけれど、
「クラウドはお金がかかるし、まずはローカルで練習したい」
という方は多いと思います。
そこで本記事では、
VirtualBox × Rocky Linux × Kubernetes(2台構成)
という “完全ローカル環境” を使って、
Flask アプリ(Gunicorn + Nginx の本番構成)を
実際に Kubernetes 上で動かすところまで を丁寧に解説します。
この記事でわかること:
- irtualBox で Rocky Linux の VM を 2 台作る方法
- Kubernetes(kubeadm)でクラスタを構築する手順
- Flannel による Pod ネットワーク構築
- Nginx Ingress Controller の導入
- Flask + Gunicorn + Nginx の本番構成 Dockerfile
- Deployment / Service / Ingress の YAML
- GitHub Actions を使った CI/CD の基礎
- 最終的に Flask アプリを K8s 上で公開するまでの流れ
全体構成図(2台構成)
[ユーザー]
│
▼
[Ingress Controller]
│
▼
[Service]
│
▼
[Pod × 3 (Flask)]
│
├─ node1(Master + Worker)
└─ node2(Worker)
1. VirtualBox で Rocky Linux の VM を 2 台作成する
● node1(Master + Worker)
→ Kubernetes の Control Plane と Worker を兼任するノード。
● node2(Worker)
→ Pod を分散させるための Worker ノード。
● 推奨スペック
- CPU:2コア
- メモリ:4GB
- ストレージ:20GB
↓
Kubernetes と Docker が安定して動作する最低ライン
2. VirtualBox のネットワーク設定
● アダプター1:NAT
- インターネット接続(yum / docker pull 用)。
● アダプター2:Host-Only Adapter
- ノード間通信(固定IP)を行うため。
● Host-Only の DHCP を無効化
- Kubernetes ノードに固定IPを割り当てるため。
3. Rocky Linux の固定 IP 設定
node1(例:192.168.56.11)
nmcli con mod "Wired connection 1" ipv4.addresses 192.168.56.11/24
nmcli con mod "Wired connection 1" ipv4.gateway 192.168.56.1
nmcli con mod "Wired connection 1" ipv4.method manual
nmcli con up "Wired connection 1"
node2(例:192.168.56.12)
→ 同じコマンドで IP だけ変更。
/etc/hosts に追加(両ノード共通)
192.168.56.11 node1
192.168.56.12 node2
4. Docker と Kubernetes のインストール(両ノード共通)
Docker CE
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce
sudo systemctl enable --now docker
ubernetes コンポーネントをインストール
sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
swap を無効化(K8s 要件)
sudo swapoff -a
5. node1 で Kubernetes クラスタを初期化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
kubectl 設定
mkdir -p ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
6. CNI(Flannel)を導入
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
7. node2 をクラスタに参加させる
sudo kubeadm join 192.168.56.11:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
8. Ingress Controller(Nginx)を導入
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
9. Flask + Gunicorn + Nginx の Dockerfile を作成
ディレクトリ構成(フルパス)
/home/hiro/projects/flask-k8s-ha/
├── app/
├── docker/
├── k8s/
└── .github/workflows/
Dockerfile(最適化版)
FROM python:3.11-slim AS builder
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app/ .
FROM nginx:1.25-alpine
COPY --from=builder /app /app
COPY app/nginx.conf /etc/nginx/nginx.conf
WORKDIR /app
RUN adduser -D flaskuser
USER flaskuser
CMD ["sh", "-c", "gunicorn -c gunicorn.conf.py app:app & nginx -g 'daemon off;'"]
10. Docker イメージをビルドして push
docker build -t <your-dockerhub>/flask-prod:latest -f docker/Dockerfile .
docker push <your-dockerhub>/flask-prod:latest
11. Kubernetes に Flask アプリをデプロイ
Deployment
kubectl apply -f k8s/deployment.yaml
Service
kubectl apply -f k8s/service.yaml
Ingress
kubectl apply -f k8s/ingress.yaml
12. 動作確認
ノード確認
kubectl get nodes
Pod 確認
kubectl get pods -o wide
Ingress 確認
kubectl get ingress
ホストPCの /etc/hosts に追加
192.168.56.11 flask.local
アクセス確認
curl http://flask.local/
まとめ
VirtualBox × Rocky Linux という完全ローカル環境でも、
Kubernetes と Flask の本番構成をここまで再現できます。
- K8sクラスタ構築
- Ingress Controller
- Flask + Gunicorn + Nginx
- Docker
- CI/CD(GitHub Actions)
クラウドに移行する前の学習環境として最適です。