Edited at

Djangoアプリの開発環境をKubernetes(minikube)に構築する方法


はじめに

Gaiax Group Advent Calendar 2018の10日目の記事です。

インターン生ながらナチュラルにアドベントカレンダーに参加させてもらえて嬉しい限りです。

今回は、頭の中を整理することも兼ねて、ローカルにDjangoアプリをKubernetes上に構築する方法をまとめました。


目次


  • 前提

  • プロジェクトの作成

  • Dockerfileの作成とビルド


    • 作成

    • ビルド



  • Kubernetesへデプロイ


    • Kubernetes yamlファイルの作成

    • デプロイ

    • ブラウザで確認



  • あとがき

  • 参考


前提


  • pipenvとpyenvを導入済み

  • dockerを導入済み

  • minikubeを導入済み


プロジェクトの作成

pipenvでDjangoプロジェクトを作成します。Djangoのチュートリアルをご参考ください。

$ touch Pipfile

$ pipenv --python=3.7.1
$ pipenv install django
$ pipenv run django-admin startproject config .

実際はALLOWED_HOSTSを動的に設定する必要がありますが、今回の例ではALLOWED_HOSTSを全許可しておきます。

# ALLOWED_HOSTS = []

ALLOWED_HOSTS = ['*']


Dockerfileの作成とビルド


作成

FROM python:3.7.1

RUN mkdir /code/
COPY ./ /code/
WORKDIR /code/

RUN pip install --upgrade pip && \
pip install pipenv && \
pipenv --python /usr/local/bin/python
RUN pipenv install

CMD pipenv run python manage.py runserver 0:8000


ビルド

ビルドの前に、ホストマシンではなくminikubeのDockerを使用するように設定を変更します。

$ eval $(minikube docker-env)

この状態で、 latest 以外のタグを付けてビルドを行います。

$ docker build -t sample/django:v1 .


Kubernetesへデプロイ


Kubernetes yamlファイルの作成

下記の内容を k8s-django.yaml などのファイル名で保存します。

kind: Deployment

apiVersion: apps/v1
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- name: django
image: "sample/django:v1"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
name: django
---
kind: Service
apiVersion: v1
metadata:
name: django-svc
spec:
selector:
app: django
ports:
- protocol: TCP
port: 8000
name: django
type: NodePort


デプロイ

$ kubectl create -f k8s-django.yaml


ブラウザで確認

サーバーが起動したことをブラウザで確認します。

$ minikube service django-svc



:tada: :rocket: :tada:


あとがき

今回はminikubeでDjangoアプリのデプロイをしてみました。

ホストマシンからminikube内のアプリにアクセスするのが思ったより難しいですね。

k8s-django.yaml にDjangoアプリを作成しましたが、同様にDBのyamlを定義してやることで、簡単にDBと接続させることが可能です。

yamlファイルをそのままGKEなどに使いまわしてデプロイできるので、開発ではdocker-compose、本番はk8sみたいな環境に比べると利便性高いですね!


参考