0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VirtualBox × Rocky Linux で 2台構成 Kubernetes クラスタを構築し、Flask + Gunicorn + Nginx をデプロイするまでの完全手順

Last updated at Posted at 2026-01-03

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)

クラウドに移行する前の学習環境として最適です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?