Code Django Django Kubernetes Server

【Kubernetes】Microk8sでDjangoアプリをデプロイする

2024年2月22日


目的

– 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

CATEGORIES & TAGS

Code, Django, Django, Kubernetes, Server,

Author:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

カテゴリー

むるし

フリーランスのインフラ系エンジニア。
備忘録で色々書いていきます。
お問い合わせは↓
mo-gyu@murci.net
LPIC303 Security
%d人のブロガーが「いいね」をつけました。