IT-HONGREAT / django_food_project

꾸준히 공부하며 진행하는 사이드 프로젝트입니다.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

explore_Docker, Kubernetes (M1 monterey)

IT-HONGREAT opened this issue · comments

What??

  • 현재 단계의 게시판 배포
  • m1에서 Docker, Kubernetes 세팅 및 탐구 🐳 🗺️

Why??

  • ML/DL 모델 업로드 과정이 더 어려울 것으로 예상되나, 도커 세팅 후 모델서빙을 하게 되면 error 경우의 수가 더 줄어들 것으로 예상.
  • m1에서 수행된 django, docker, kubernetes 개발환경에 대한 정보가 거의 없다.

To-do List

  • New branch
  • Kubernetes 탐구(지속)

Docker ↔ K8S

  • 도커에서 가장 작은 묶음 단위는 컨테이너이다.
  • 쿠버네티스에서 가장 작은 묶음 단위는 Pod이다. (팟,파드,포드)
    • pod하나에 다중 컨테이너가 사용되기도 한다.

기본 파드 실행

# echo 라는 단일 파드 생성; spec(컨테이너세부)등의 상세명세는 하지않은 기본파드를 run 한다.

kubectl run echo --image ghcr.io/subicura/echo:v1

# echo 라는 pod를 삭제
kubectl delete pod/echo

Pod Run

  • 세부적인 부분은 설정하지 못한다

  • 상세명세를 원하면 yml 파일로 Pod를 생성해야하는데, 이때 spec-container-name/image/env 등 세부설정이 가능하다.

  • 명령어

    # yml 파일 로 파드 만들기
    
    kubectl apply -f [파일이름].yml  
    
    # 삭제
    
    kubectl delete -f [파일이름].yml
    
    # 파드 확인(얻기)
    
    kubectl get pod

Pod생성과정

  • Scheduler

    • API서버를 감시, 할당되지 않은(unassigned)Pod이 있는지 확인한다
    • 할당되지 않은 Pod를 감지 → 적절한 노드에 할당
      • 현재 사용한 minikube는 단일 노드이다
  • Kubelet

    • 자신의 노드에 할당된 Pod이 있는지 확인한다
    • Scheduler에 의해 자신에게 할당된 Pod의 정보를 확인 → Container 생성
    • 자신에게 할당된 Pod 상태를 API서버에 전달한다

image

출처: subicura님

YAML파일로 Spec 지정

  • 필수요소
    • version : 오브젝트 버전
    • kind : 종류 (Pod, ReplicaSet, Service..)
    • metadata : name, label..
    • spec : 상세명세

단일 컨테이너 생성

  • Pod 이름 : mongodb
  • Pod Label : app:mongo
  • Container 이름 : mongodb
  • Container 이미지 : mongo:4

image

환경변수 지정

  • key-value로 되어있기 때문에 아래와 같이 value로 지정하면된다.

  • Pod 이름 : mysql

  • Pod Label : app:mysql

  • Container 이름 : mysql

  • Container 이미지 : mysql:5.7

  • Container 환경변수 : MYSQL_ROOT_PASSWORD: 123456

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
    - name: mysql
      image: mysql:5.7
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

다중컨테이너(Multi Container)

  • 도커와 가장 다른 부분으로 1개의 Pod에 여러 Container를 가질 수 있다.

  • 하나의 Pod에 다중 컨테이너로 되어있는 것을 Cluster 라고 한다.

  • Pod의 특정 컨테이너에 접속

    # 다중 컨테이너
    
    kubectl exec -it [Pod이름] -c [Container이름] --sh

ReplicaSet

  • Pod 만 있다면 : 서버가 죽거나 pod가 사라졌을 때 ⇒ 자동으로 복구되지 않음

  • Pod는 단독으로 사용하지 않음

    Pod를 정해진 수 만큼 복제, 관리 하는 것이 ReplicaSet 이다.

ReplicaSet Controller의 역할

image

출처:subicura

  • Controller
    • ReplicaSet 조건을 감시하면서 상태가 다른지 확인한다
    • 원하는 상태가 되도록 Pod를 생성하고 제거한다
  • Scheduler는 API서버를 감시, 할당되지 않은 Pod체크 → 적절한 노드에 Pod를 배치

관리를 위한 설정

  • label 을 체크해서 원하는 수의 Pod가 없으면 → 새로운 Pod 생성

    • spec.selector : label 체크조건
    • spec.replicas : 원하는 Pod의 개수
    • spec.template : 생성할 Pod의 명세
      • template은 Pod의 metadata와 spec과 완전히 동일하다 template이 Pod의 설정과 같다고 보면된다
  • 정리

    ReplicaSet 관리 ← ReplicaSet Controller

    Pod할당 관리 ← Scheduler

ReplicaSet 명세

ReplicaSet 이름 nginx
ReplicaSet selector app: nginx
ReplicaSet 복제수 3
Container 이름 nginx
Container 이미지 nginx:latest
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
  • replicas 로 Pod를 여러개 복제할 수 있다.

image

총 정리

  • ReplicaSet은 Label을 확인해서 관리한다. 원하는 수의 label(Pod)이 없으면 새로운 Pod을 생성한다.

# Pod의 Label 확인
kubectl get pod --show-labels

#label 제거
kubectl label pod/[pod이름] app-

#label 추가
kubectl label pod/[pod이름] app=[앱이름]

image

What??

  • django on k8s
  • 단일 노드로 충분히 가능하기 때문에, minikube로 진행

Why??

  • k8s 실제 적용 및 yml 적용

To-do List

  • 해당 이슈 브랜치 생성
  • Dockerfile 생성
  • image build
  • Service 단 까지의 매니패스트 생성 후 Pod확인 및 run test