目的
– Djangoのテスト用アプリを構築する
– Djangoアプリをmicrok8sでデプロイする
環境
– ubuntu 22.04
– MicroK8s v1.27.8 revision 6239
– Python 3.9
– Django 3.2.12
参考
– https://microk8s.io/docs/registry-built-in
イメージ図
Djangoアプリの作成
– テスト用のDjangoアプリを作成する
$ sudo apt install python3-django
$ pip install django ### 未インストールの場合は、django-adminが失敗
$ django-admin startproject myapp
$ cd myapp
※pyhton3-django
・・・Python で書かれた Web アプリケーションフレームワーク Django を提供する Python パッケージ。Django を使用して Web アプリケーションを開発することができる
Docker関連ファイルの作成
Dockerfile
– myappフォルダ直下に作成
# ベースイメージを指定
FROM python:3.9
# 作業ディレクトリを設定
WORKDIR /app
# 現在のディレクトリの内容をコンテナーの作業ディレクトリにコピー
COPY . /app
# 必要なPythonパッケージをインストール
RUN pip install -r requirements.txt
# Djangoアプリケーションを実行
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
※「COPY . /app」→絶対パスを指定しないと、コンテナに関連ファイルがコピーできない。
デプロイ時にエラー「python3: can’t open file ‘manage.py’: [Errno 2] No such file or directory」で失敗する。
requirements.txt
– myappフォルダ直下に作成
Django==3.2.12
settings.py
– myapp/myapp/フォルダ配下に作成
#ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']
Dockerイメージのビルド
$ docker build -t myapp .
[+] Building 15.6s (9/9) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 438B 0.0s
=> [internal] load metadata for docker.io/library/python:3.9 1.7s
=> [1/4] FROM docker.io/library/python:3.9@sha256:383d072c4b840507f25453c710969aa1e1d13e47731f294a8a8890e53f834bdf 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 3.60kB 0.0s
=> CACHED [2/4] WORKDIR /app 0.0s
=> [3/4] COPY . /app 0.1s
=> [4/4] RUN pip install -r requirements.txt 13.0s
=> exporting to image 0.7s
=> => exporting layers 0.7s
=> => writing image sha256:ed6e74d677a72883cae6261162af0d9673b8c1c196bbc59ba8d0d59b9942d931 0.0s
=> => naming to docker.io/library/myapp 0.0s
– ローカルにイメージが登録されていること
$ docker image ls | grep app
myapp latest ed6e74d677a7 46 seconds ago 1.04GB
microk8sのregistryにDockerイメージをpushする
registryの有効化
– 設定後enabledに表示されること
$ microk8s enable registry
$ microk8s status
microk8s is running
high-availability: no
datastore master nodes: 192.168.9.1:19001
datastore standby nodes: none
addons:
enabled:
registry # (core) Private image registry exposed on localhost:32000
microk8sのregistryにpush
– ローカルに作成したDockerイメージを、有効化したmicrok8sのregistryにtag付けしてpushする
$ docker tag myapp:latest localhost:32000/myapp:latest
$ docker push localhost:32000/myapp:latest
$ docker image ls | grep app
myapp latest ed6e74d677a7 46 seconds ago 1.04GB
localhost:32000/myapp latest ed6e74d677a7 46 seconds ago 1.04GB
manifestファイルを作成する
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: localhost:32000/myapp
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 8001
targetPort: 8000
nodePort: 32080
type: NodePort
manifestを適用してデプロイする
$ kubectl apply -f deployment.yaml
deployment.apps/myapp-deployment created
正常性確認
ステータス確認
– PodがRunningの状態であること
$ kubectl get all --all-namespaces | grep -e NAMESPACE -e myapp
NAMESPACE NAME READY STATUS RESTARTS AGE
default pod/myapp-deployment-5bb76cc59d-rztmv 1/1 Running 0 99m
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/myapp-service NodePort 10.152.183.120 8001:32080/TCP 99m
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default deployment.apps/myapp-deployment 1/1 1 1 99m
NAMESPACE NAME DESIRED CURRENT READY AGE
default replicaset.apps/myapp-deployment-5bb76cc59d 1 1 1 99m
NAMESPACE NAME READY AGE
ブラウザアクセス
– 下記にアクセスして、Djangoトップページが表示されること
– http://192.168.9.1:32080/
ログ確認
– エラーが出ていないこと
$ kubectl logs myapp-deployment-5bb76cc59d-tjlnw
Watching for file changes with StatReloader
[22/Feb/2024 02:53:15] "GET / HTTP/1.1" 200 10697
[22/Feb/2024 02:53:15] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[22/Feb/2024 02:53:15] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[22/Feb/2024 02:53:15] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[22/Feb/2024 02:53:15] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
[…] 【Kubernetes】Microk8sでDjangoアプリをデプロイする […]