tools

kubernetes로 django 웹서버 띄우기 - minikube, kubectl / django with kubernetes

seul chan 2020. 3. 29. 10:00

django with kubernetes ctl

https://medium.com/@markgituma/kubernetes-local-to-production-with-django-2-docker-and-minikube-ba843d858817 참고

  • The foundational concept of Kubernetes is in the management of pods.
  • A pod is one or more containers deployed together as a group within the same physical or virtual host machine colloquially known as a node.

Requirements

Install minikube

  • minikube는 로컬에서 쉽게 싱글 노드 클러스터를 띄울 수 있게 도와주는 툴이다.
$ brew install minikube

Install virtualbox, docker

  • virtualbox, docker는 미리 깔려 있다고 전제하고 포스트를 적는다.
  • docker는 여기, virtualbox는 여기를 참고하여 설치

Install kubectl

  • kubectl은 쿠버네티스로 어플리케이션을 배포/관리할 때 사용.

Minikube

$ minikube start
😄  minikube v1.8.2 on Darwin 10.15.3
    ▪ MINIKUBE_ACTIVE_DOCKERD=minikube
✨  Using the hyperkit driver based on existing profile
⌛  Reconfiguring existing host ...
🔄  Starting existing hyperkit VM for "minikube" ...
🐳  Preparing Kubernetes v1.17.3 on Docker 19.03.6 ...
🚀  Launching Kubernetes ...
🌟  Enabling addons: dashboard, default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"


$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured


$ kubectl config current-context
minikube

$ minikube ip
192.168.64.2

$ minikube ssh

            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$
  • docker daemon을 minikube에서 돌리기: running local docker in kubernetes
  • 이 명령어를 실행하지 않으면 local docker 이미지를 인식하지 못하여 에러가 난다.
$ eval $(minikube docker-env)

혹시 minikube start에서 에러가 나면 brew install hyperkit로 hyperkit을 다시 설치해주자 (이미 설치되어 있다면 brew upgrade hyperkit

현재 hyperkit 과 관련된 버그가 있다. https://github.com/kubernetes/minikube/issues/5594 잘 안 되면 hyperkit을 지우고 재설치.

이제 minikube dashborad를 사용할 수 있다.

$ minikube dashboard

Docker

사용할 도커파일을 준비하자. 에시에서는 간단한 dockerfile을 사용

FROM python:3-slim
WORKDIR $PROJECT_ROOTCOPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD python manage.py runserver 0.0.0.0:8000

도커파일이 준비 되었으면 해당 파일을 빌드해준다.

위에서도 언급했지만 local docker env가 아닌 쿠버네티스 pod 내의 환경에 빌드해주어야 한다. docker images로 pod 내의 환경이 맞는지 확인한 후 아니라면 eval $(minikube docker-env)로 변경한 후 빌드해주자.

$ docker build -t <IMAGE_NAME>:<TAG> .

Deployment

$ kubectl run <deployment-name> --image=<IMAGE-NAME> --port=8000
$ kubectl get deployments

NAME   READY   UP-TO-DATE   AVAILABLE   AGE
name    1/1     1            1           6s


# deployments 제거는 다음 명령어로 가능
$ kubectl delete deployments/<deployment-name>

이제 minikube의 ip (192.xxx.xxx.x:8000)로 접속해서 해당 서버가 작동하는 것을 볼 수 있따.

$ minikube ip
192.xxx.xxx.x

Troubleshooting

# pod name을 구한 다음에
$ kubectl get pods

# 로그를 확인
$ kubectl logs -p <pod name>`

이제 서비스를 띄워보자!

$ kubectl expose deployment <deployment-name> --type=NodePort


$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cms          NodePort    10.100.87.135   <none>        8000:30233/TCP   14s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          3d7h

$ minikube service cms
|-----------|------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT |            URL            |
|-----------|------|-------------|---------------------------|
| default   | cms  |             | http://192.168.64.2:30233 |
|-----------|------|-------------|---------------------------|
🎉  Opening service default/cms in default browser...

반환된 url (<minikube_ip>:<nodePort>)에 접속하면 장고 웹이 나오는 것을 볼 수 있다.

https://medium.com/@markgituma/kubernetes-local-to-production-with-django-2-docker-and-minikube-ba843d858817 참고