目的
前回の記事の通りにPodを作成すると、クラスタを再起動したときに作成したDjangoプロジェクトが消えると思います。今回はVolumeを用いてPodの中身を保持できるようにしたいと思います。
手順
1. クラスタを作成する
minikube start
2. マニフェストファイルを作成する
次のようなファイルを作成し、保存します。resources:のフィールドは(Visual Studio Codeでは警告が表示されますが)省略可能です。
apiVersion: v1
kind: Pod
metadata:
name: django-pod
labels:
name: django-label
spec:
containers:
- name: django-container
image: python
command: ["sleep", "infinity"]
resources:
limits:
memory: "128Mi"
cpu: "500m"
volumeMounts:
- mountPath: /app
name: django-volume
volumes:
- name: django-volume
次のコマンドを実行すると、Podが作成されます。django.yamlの部分はファイルを作成した場所やファイル名に応じて適宜相対パスで記述してください。
kubectl apply -f django.yaml
しばらく待ってからkubectl get pods
を実行すると次のような結果が出力されると思います。
NAME READY STATUS RESTARTS AGE
django-pod 1/1 Running 0 16m
3. Pod内部にDjangoプロジェクトを作成する
次のコマンドを実行してPodにアクセスします。django-podの部分は、Podのメタデータとして設定した名前を入力します。
kubectl exec -ti django-pod -- bash
上のyamlファイルによってマウント先を/appに設定したので、/appディレクトリは保持されることになります。よってこの内部にDjangoプロジェクトを作成します。IPアドレスなどに留意してサーバーを起動するところまで行ってください。
4. Podを外部に公開する(前回とほぼ同じ)
別の端末で次のコマンドを実行します。ポート番号はDjangoのサーバーを起動させたときのポート番号と合わせてください。(nameオプションは任意)
kubectl expose pod django-pod --name=django-service --port=8000
kubectl get services
を実行すると、次のような結果が出力されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-service ClusterIP 10.99.145.184 <none> 8000/TCP 8s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h5m
minikube service django-service
と入力すると、ブラウザに"Congratulations!"ページが表示されると思います(django-service
の部分は上で取得したサービス名を適宜入力)。Podを消去しない限りはクラスタを再起動してもDjangoプロジェクトの中身は保持されます。