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서버에 전달한다
출처: subicura님
YAML파일로 Spec 지정
- 필수요소
- version : 오브젝트 버전
- kind : 종류 (Pod, ReplicaSet, Service..)
- metadata : name, label..
- spec : 상세명세
단일 컨테이너 생성
- Pod 이름 : mongodb
- Pod Label : app:mongo
- Container 이름 : mongodb
- Container 이미지 : mongo:4
환경변수 지정
-
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의 역할
출처: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를 여러개 복제할 수 있다.
총 정리
- ReplicaSet은 Label을 확인해서 관리한다. 원하는 수의 label(Pod)이 없으면 새로운 Pod을 생성한다.
# Pod의 Label 확인 kubectl get pod --show-labels
#label 제거
kubectl label pod/[pod이름] app-
#label 추가
kubectl label pod/[pod이름] app=[앱이름]
What??
- django on k8s
- 단일 노드로 충분히 가능하기 때문에, minikube로 진행
Why??
- k8s 실제 적용 및 yml 적용
To-do List
- 해당 이슈 브랜치 생성
- Dockerfile 생성
- image build
- Service 단 까지의 매니패스트 생성 후 Pod확인 및 run test