目的
マニフェストファイル、Dockerfileなどを使わずにコマンドラインのみでKubernetesクラスタを作成、実行することを目指します。
今回はDjangoを例にとり、"Congratulations!"ページを表示させるところまで行います。
環境・使用したツール
OS | コマンドラインツール | Docker | Kubernetes |
---|---|---|---|
Windows11 | powershell7.4.1 | Docker Desktop | minikube |
手順
1. クラスタを作成する
minikube start
2. デプロイメントを作成する
デプロイメントを作成するため、次のコマンドを実行します。
kubectl create deployment django --image=python -- sleep infinity
注意
sleep infinity
のコマンドについては、CrashLoopBackOffを防ぐために仮に指定しています。もっと合理的な方法があるかもしれません。
このコマンドを実行してしばらく待ってからkubectl get pods
を実行すると、次のようにSTATUSの項目がRunningになると思います。(NAMEの項目はこの通りである必要はありません)
NAME READY STATUS RESTARTS AGE
django-d6587fc44-4mmw2 1/1 Running 0 44m
3. Pod内部にDjangoプロジェクトを作成する
次のコマンドを実行してPodにアクセスします。django-d6587fc44-4mmw2の部分は、先ほどkubectl get pods
でpodsの内容を取得した際のNAMEの項目を適宜入力してください。
kubectl exec -ti django-d6587fc44-4mmw2 -- bash
すると、Pythonのイメージから作成されたPodの内部にアクセスできると思います。Writing your first Django app, part 1などを参考にしてDjangoプロジェクトを作成するところまでおこなってください。
4. サーバーを起動する
manage.pyファイルがあるディレクトリに移動し、次のコマンドを入力してください。0.0.0.0:8000のようにIPアドレス部を0.0.0.0と指定します。ポート番号は任意です。
python manage.py runserver 0.0.0.0:8000
5. Podを外部に公開する
別の端末を起動するなどして、ローカル環境で次のコマンドを実行します。 タイプはNodePortなどでも動きます。 (この記述によると、LoadBalancerは適切ではない可能性があります。)ポート番号は4.で指定した番号と同じものを指定してください。nameオプションは省略できます。
kubectl expose deployment django --name=django-service --type=LoadBalancer --port=8000
ここでkubectl get services
を実行すると、次のような結果が表示されます。新しいサービスが作成されているのが分かると思います。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-service LoadBalancer 10.108.118.243 <pending> 8000:31584/TCP 7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27m
さらに次のコマンドを実行すると、自動でブラウザが立ち上がりDjangoの"Congratulations!"ページが表示されます。django-serviceの部分は、kubectl get services
で取得したサービス名を入力してください。
minikube service django-service