Link
09-25 22:25
«   2020/09   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
Archives
Today
2,416
Total
1,025,162
관리 메뉴

꿈 많은 사람의 이야기

쿠버네티스(kubernetes) example - Python Django 웹 페이지 배포하기 본문

IT Infra(Engineer)

쿠버네티스(kubernetes) example - Python Django 웹 페이지 배포하기

이수진의 블로그 이수진의 블로그 2020. 3. 22. 19:53

포스팅 개요

이번 포스팅은 쿠버네티스(kubernetes)를 활용하는 방법인 예시(example)를 보여주는 글입니다.

특히, 쿠버네티스(kubernetes)를 활용하여 Python Django를 deploy(배포)하는 example입니다.

본 글은 아래와 같은 글들을 참고하여 작성하였습니다.

 

 

쿠버네티스 시작하기 - Kubernetes란 무엇인가?

쿠버네티스는 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼입니다. 1주일에 수십억 개의 컨테이너를 생성하는 구글이 내부 배포시스템으로 사용하던 borg를 기반으로 2014년 프로젝트를 시작했고 여러 커뮤니티의 아이디어와 좋은 사례를 모아 빠르게 발전하고 있습니다. 이 글은 쿠버네티스가 무엇인지 궁금한 엔지니어를 대상으로 쿠버...

subicura.com


포스팅 본문

쿠버네티스(kubernetes)에 대한 설명은 처음에 개요에서 소개한 맨 처음 블로그에서 굉장히 자세히 설명되어 있습니다. 쿠버네티스에 대해 자세히 궁금하시다면 해당 글을 꼭 참고하시길 바랍니다.

본 글에서는 기본적인 개념만 정리하고 넘어갈게요

쿠버네티스(kubernetes) 개요

  • 쿠버네티스는 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼이다
  • K8S로 줄여서 부르기도 한다
  • 컨테이너 오케스트레이션(Container Orchestration) 기능을 제공한다
    • 컨테이너들 사이의 배포, 접속 등을 관리
    • 서비스간 연결을 쉽게 제공(다수의 서버를 하나로 묶거 적당한 서버를 선택해 APP을 배포하거나 등)
  • 하나의 클러스터를 논리적으로 구분하여 사용 가능 (Namespace)
  • kubernets는 관리자가 지정한 상태를 유지하기 위해 동작
  • 관리하려는 대상을 오브젝트(object)로 관리하며 Pod 등이 대표적인 오브젝트임
  • Pod
    • 쿠버네티스에서 배포할 수 있는 가장 작은 단위
    • 한 개 이상의 컨테이너와 스토리지 등의 속성을 가짐
    • Pod에 속한 컨테이너는 스토리지와 네트워크를 공유 : 서로 localhost로 접근할 수 있음
  • ReplicaSet
    • Pod를 여러 개 복제하여 관리하는 오브젝트
  • master-node 구조
    • master
      • 전체 클러스터 관리
      • API Server, etcd 등을 가지고 있음
    • node
      • 컨테이너가 배포되는 곳
      • 마스터 서버와 통신하면서 필요한 Pod를 생성하고 네트워크, 볼륨을 생성
      • kubelet : 노드에 할당된 Pod의 생명주기 관리. Pod를 생성하고 Pod 안의 컨테이너에 이상이 없는지 확인
  • kubectl : 명령행 도구

 

즉, 이러한 쿠버네티스(kubernetes)를 활용하면 기존에 Docker 등을 활용해 만든 Container들을 쉽고 빠르게 관리할 수 있고 배포할 수 있다는 의미입니다.

 

kubernetes를 이용해서 Django 배포하기

그러면 이제 Kubernets를 이용해서 Python 웹 프레임워크인 Django 웹 서버를 배포해 보겠습니다.

 

먼저, 로컬에 django 프로젝트를 하나 테스트용으로 만들어보겠습니다.

django-admin startproject kubeDjango 명령어로 kubeDjango 프로젝트를 시작합니다.

 

이렇게 만들어진 Django를 python manage.py runserver 명령어를 활용해 실행시켜줍니다.

 

그러면 http://127.0.0.1:8000/ 이곳에 starting development server가 되었다고 나옵니다. 그럼 웹 브라우저를 열어서 해당 주소를 입력해서 들어가면 아래와 같은 화면이 나올 것입니다.

 

이렇게 나오는 Django 서버를 kubernetes를 활용해서 배포해보려고 합니다.

 

Dockerfile 만들기

 

먼저, kubernetes에서 활용될 Container를 만들어야 합니다. Container는 Docker를 활용해서 만들겠습니다.

아래와 같이 Dockerfile을 하나 만든 후 내용을 삽입합니다.

Python3을 활용하며 /code라는 디렉토리를 만들고 거기서 진행한다고 표시합니다. 이후 requirements.txt를 실행하고 python manage.py runserver를 실행하도록 합니다.

 

그러면 requirements.txt에는 어떤 내용이 들어가있을까요? 아래와 같이 되어있습니다.

 

우리는 Django를 띄어야 하니까, Django를 설치하도록 합니다.

 

이렇게 만들어진 환경을 docker build 명령어로 build 해주고 image를 생성합니다.

 

위와 같은 명령어를 입력하고 조금 시간이 지나면

아래와 같은 사진처럼 결과가 나오게 될 것입니다.

 

이제 Docker image가 만들어졌는지 확인해봅니다.

제대로 잘 되었다면 docker image라는 명령어를 입력했을 때 build 당시 지정했던 이름의 image가 있을겁니다.

 

kubernetes yml 파일 생성

이제 Docker image를 하나 생성했습니다. 다음으로는 kubernetes에서 사용할 yml 파일을 명시해주면 됩니다.

저는 쿠버네티스(kubernetes) 환경에 Django를 배포할 예정입니다. 그래서 아래 사진과 같은 내용을 작성했습니다.

kubernetes 이름과 image에 대한 정보를 아래 형식에 맞추어서 넣어주면 됩니다.

 

kubernetes에 yml 파일 적용

위와 같이 yml 파일을 만들었으면 이제 kubernetes에 적용하면 됩니다.

쿠버네티스(kubernetes)에 적용하는 방법은 kubectl을 활용하면 됩니다. kubectl은 kubernetes와 통신할 수 있도록 지원해주는 명령행 도구입니다.

kubectl apply -f deployment.yml 을 통해 kubernetes에 해당 yml 파일을 적용한다고 명령어를 입력해줍니다.

이상이 없으면 created 되었다고 나옵니다.

이 상태에서 kubectl get pods를 입력하게 되면 아래 사진과 같이 pods 정보가 나오게 됩니다.

 

이 상태로 진행하게 되면, 해당 kubernetes에 적용된 Django 페이지를 확인할 수 없습니다. 왜냐하면, 외부 서비스와 연동이 되어 있지 않기 때문입니다.

따라서 kubectl expose 명령어로 deploy 해주면서 동시에 type을 설정해줘야합니다.

저는 deploy로 expose해주고 NodePort로 노출하려고 합니다. (로컬에서만 되도록)

 

위 명령어를 실행하고 나서 kubectl get service 명령어를 입력하면 아래와 같이 나오는 것을 확인할 수 있을겁니다.

 

kubernetes 연동 확인

자! 이제 웹 페이지를 열어보면

위와 같은 화면을 볼 수 있을겁니다.

 

 

번외. 만약, docker hub 이미지를 쿠버네티스(kubernetes)에서 활용하고 싶다면?

Docker image는 항상 local에 있는 것이 아닙니다. AWS를 사용한 Container Registry(컨테이너 레지스트리) 공간이나, Docker hub, GCP에서 제공해주는 공간 등에 Docker image가 있을 수도 있습니다. 그러면 이런 것은 kubernetes에서 어떻게 활용할 수 있을까요?

아래와 같이 docker image를 하나 생성하고 docker hub에 push 했다고 가정해봅니다.

 

그럼 이제 Docker hub에 lsjsj92/kubernetes-django-soojin:latest 라는 이름으로 올라가져 있는 상태입니다.

이 Docker image를 쿠버네티스(kubernetes)에서 사용하고 싶으면 아래와 같이 yml 파일에서 image 부분에

올라간 주소를 넣어주면 됩니다. 간단하죠?

4 Comments
  • 프로필사진 seho 2020.09.01 17:43 안녕하세요! 글 보고 진행중에 막히는 부분이 있어서 댓글 드립니다!!

    Dockerfile 작성 후

    docker build 로 이미지 생성 시 오류가 발생하는데요

    오류는 python manage.py 를 실행할때

    python 내에서 manage.py 를 찾을 수 없기 때문에 발생한다고 합니다

    혹시 해결 방법좀 여쭐 수 있을까요...?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.02 21:27 신고 안녕하세요~
    혹시 Django 로 Project 만드시고 해당 경로에서 Dockerfile 만드셨을까요?
    경로만 맞는다면 문제가 안될 것 같습니다~
  • 프로필사진 seho 2020.09.07 15:04 답변 감사합니다! 위 문제는 해결 되었습니다..

    한가지 더 질문 드릴 수 있을까요??

    도커 이미지는 잘 생성 되었구요

    쿠버네티스에서 deployment.yaml 을 apply 하는 과정에서
    image Pull 할때 에러 뜹니다

    pod describe 에서 확인한 에러메시지는
    pull access denied for [image], repository does not exist or may require 'docker login': denied: requested access to the resource is denied
    과 같습니다

    pull 을 할 수 없다는것 같은데 docker hub 에서 가져오는 것이 아닌 로컬에서 가져오는데 왜 가져올수 없을까요..

    혹시나 아는 부분이 있으시면 답변 부탁드려봅니다..!! 감사합니다 :)
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.08 22:00 신고 안녕하세요 ~
    image pull은 hub와 같은 공간에서 가져오는 것입니다. 근데 hub에 image가 없으니 pull이 안되는 것이죠

    따라서 pull이 아닌 run을 해주시면 될 것 같스빈다 ~
댓글쓰기 폼