일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 글또
- 분산처리
- EKS
- 스레드풀
- gunicorn
- 메모리구조
- Django
- K8S
- 쿠베네티스
- Alembic
- 회고
- golang
- SQLAlchemy
- nodejs
- nestjs
- 쿠버네티스
- Python
- 가비지컬렉션
- 싱글톤 디자인 패턴
- AWS
- alb
- uvicorn
- 캐시서버
- FastAPI
- 백엔드 개발자
- 2022년
- CPU스케쥴링
- 스케줄링
- 로드밸런서
- 멀티스레드
- Today
- Total
서버에서 살아남기
쿠버네티스에 대한 이해 본문
01. 개념
오픈 소스 프로젝트이며, 컨테이너 배포관리 / 컨테이너 오케스트레이션 / 스케일링 / 모니터링 등 컨테이너 배포 관리를 도와주는 것입니다.
02. 구성
쿠버네티스는 아래 이미지와 같이 클러스터 안에 마스터 노드와 워커 노드로 구성되어 있습니다.
2-1. 워커노드
Worker Node 는 EC2 인스턴스와 같은 하나의 가상머신입니다.
Worker Node 는 Kublet, Docker, Kube-proxy, 그리고 pod 로 구성되어 있습니다.
01. Pod
- pod는 하나 이상의 어플리케이션을 가지고 있으며 가장 작은 단위입니다.
- pod는 마스터 노드에 의해 관리가 됩니다.
- pod 내부에는 하나 이상의 컨테이너를 가집니다.
- 워커 노드 안에는 동일한 pod가 여러개 있을 수도 있고(트래픽 분산), 별개의 pod가 존재하기도 합니다.
02. Kublet
- Worker Node와 Master Node 가 통신하기 위한 것입니다.
03. Proxy
- 트래픽을 처리하는 일을 합니다. (ex. 설정한 트래픽만큼만 worker node에 접근 가능)
2-2. 마스터 노드
모든 Worker Node를 관리하고 제어하며 Worker Node가 다운돼도 Master Node는 다운되지 않습니다.
또한 Cloud Service Provider(ex. aws) 에 명렁을 보내 특정 리소스 생성, 클러스터 구성 명령 등을 합니다.
01. API server
- Kublet 과 통신하기 위한 API 서버입니다.
02. Scheduler
- 새 Pod가 생성되어야 하는 Worker Node를 선택하는 역할을 합니다.
03. Kube controller manager
- Worker Node를 감시하고 제어합니다.
- Pod 의 갯수가 적당한지 확인합니다.
04. Cloud controller manager
- Cloud Service Provider(ex.aws) 에게 무엇을 해야하는지 알리는 역할을 합니다.
03. 쿠버네티스가 하는 일
클러스터와 노드를 생성하는 것은 쿠버네티스가 하는 것이 아닌 개발자 혹은 관리자가 직접 작업해야하는 일입니다.
쿠버네티스는 pod 모니터링 & 실패한 pod 교체, pod 스케일링, pod내부의 컨테이너를 오케스트레이션 등의 일을 합니다.
즉 컨테이너와 관련된 것을 실행하고 애플리케이션을 관리하는 역학을 합니다.
04. 클러스터
클러스터는 master node 또는 worker node 를 지닌 노드의 집합입니다.
Kubectl
kubcect은 클러스터에 명령을 보내는데 사용하는 도구입니다.
05. 쿠버네티스의 객체
쿠버네티스는 객체와 함께 작동하며 Pods, Deployments, Services, Volume 등이 있습니다.
또한 객체에 내린 명령을 기반으로 무언가를 수행하는데 객체가 생성되는 방식은 명령적방식(Imperatively) 과 선언적방식(Declaratively) 이 있습니다.
01. Pods
- pod 는 쿠버네티스가 상호작용하는 가장 작은 유닛이며 최소 한 개 이상의 컨테이너를 가집니다.
- 클러스터 내부 IP주소가 있어서 외부와 통신이 가능합니다.
- 생성, 삭제, 교체 등 pod를 관리하기 위해 쿠버네티스를 이용합니다.
02. Deployments
- 일반적으로 pod 를 직접 생성하지 않고 Deployment 객체를 생성하하여 pod의 갯수, 컨테이너의 갯수 등을 Deployment한테 전달합니다. 즉 Deloyments 객체를 통해서 deployement를 일시중지, 롤백, 삭제 등을 가능하게 합니다. (ex. 어플리케이션에 오류가 생기면 이전 버전으로 롤백)
- 또한 Auto Scaling 통해 필요한 만큼 pod를 생성 할 수도, 불필요한 pod를 제거하기도 합니다. (Pod 관리)
03. Service
- pod는 내부적으로 ip주소를 가지고 있는데 이 ip는 클러스터 외부에서 pod에 접근하는데 사용할 수 없으며 pod가 교체될 때마다 바뀌는 유동 ip입니다.
- service는 변경 되지 않는 ip를 제공하며 pod를 그룹화하며 외부에서 pod에 접근이 가능하게 해줍니다.
06. 명령적 방식 vs 선언적 방식
쿠버네티스 접근하는 두가지 방식이 있습니다.
명령적 방식은 CLI 에서 kubectl 명령어를 통해 작업을 수행하고 선언적 방식은 YAML 파일을 작성하여 해당 파일 기반으로 작업을 수행합니다.
6-1. 명령적 방식
kubectl 을 설치하여 간단한 명령적 방식을 수행하는 예제입니다.
1. kubectl 설치
brew install kubectl
2. 제대로 설치되었는지 버전 확인
kubectl version --client
3. 미니큐브 설치
미니큐브 :로컬에서 클러스터 환경을 구성 할 수 있게 해줍니다.
brew install minikube
4. 미니큐브 실행
minikube start --driver=docker
5. 제대로 설치되었는지 상태 확인
minikube status
6. 개인 프로젝트에서 Dockerfile 생성 후 이미지 빌드
docker build -t [이미지 이름] .
7. 생성된 이미지를 도커 허브에 push
docker push [도커 허브 레포 이름]
8.생성된 이미지를 클러스터로 보내서 클러스터한테 deployment 생성하라고 명령 보내기
- deployment 객체를 생성한 다음 마스터노드에게 전송하고 마스터노드는 워커노드에게 pod를 배포하는 일을 담당합니다.
- --image옵션은 deloyement에서 생성된 pod에서 사용할 이미지를 지정할때 사용하는 옵션입니다.
kubectl create deployment [이미지 이름] --image=[도커 허브 레포 이름]
ex. kubectl create deployment first-app --image=soohyun/first-app
9. deployments 확인하기
$ kubectl get deployments
10. service 생성하기
deployment에 의해 생성된 pod 노출할거라고 쿠버네티스한테 알리기
💡 옵션을 줘야함!
--port : 노출하려는 포트
--type : 타입
ClusterIP : 디폴트 값이며 pods 가 클러스터 내부 다른 리소스들과 통신할 수 있습니다. 즉 내부에서만 접근 가능하며 외부에서 접근 불가합니다.
Nodeport : 외부에서 접근 가능하지만, 노드 IP를 사용하는 거라서 여러 노드가 있는 경우 노드 간에 이동 시 좋지는 않습니다. (ClusterIP 자동 생성)
LoadBalancer : 외부에서 접근 가능하며, 들어오는 트래픽을 pods에 골고루 분산시켜줍니다. 외부에서 접근하기에 가장 좋은 유형입니다.(ClusterIP 자동 생성)
kubectl expose deployment deployment이름 --type=[타입] --port=[포트]
11. service 생성됐는지 확인해보기
--type=LoadBalancer 옵션을 주었는데 아래 이미지와 같이 ClusterIP 가 자동으로 생성된 걸 볼 수 있습니다.
kubectl get serivces
12. service 에 접근하기
minikube는 로컬 머신에서 접근할 수 있는 IP에 특정 포트를 매핑하여 serivce에 접근 할 수 있게 해줍니다.
minikube service [service이름]
13. deployment 업데이트 하기
새로운 이미지 도커 허브에 푸쉬하고
docker build -t [이미지이름]
docker push [도커 허브 레포 이름]
kubectl set image deployment/[deployment이름] [기존 이미지이름]=[새 이미지이름]
14. deployment 이전으로 롤백하기
이전으로 롤백
kubectl rollout undo deployment/[deployement 이름]
특정 deployment로 롤백
kubectl rollout undo deployment/[deployement 이름] --to-revision=[revision]
15. deployement의 히스토리를 보려면
kubcectl rollout history deployment/[deployement 이름]
16. 이 중 특정 deployment에 자세하게 보려면 revision 태그 붙이기
kubectl rollout history deployment/[deployement 이름] --revision=[revision]
이처럼 명령적 방식은 CLI에 입력하는 명렁어를 외워야하고 해당 작업이 일어날 때 마다 반복해줘야합니다.
6-2. 선언적 방식
선언적 방법은 CLI 에 입력하는 명령어들을 YAML 파일에 정리하고, YAML 파일을 실행합니다.
YAML 파일 구성은 쿠버네티스 공식 문서에서 확인 가능합니다.
1. deployment.yaml 구성하기
💡 공식 문서
1-1. yaml 파일 구성
예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deplpoyment
deployment 스펙에 대한 설정
spec:
replicas: 1 >> pod 갯수.
selector:
matchLabels: >> deployments에 의해 제어되어야하는 pod레이블의 키-값. 여기에 명시 안되어있는 pod 라벨은 제어 안됨.
app: test-app
생성되어야하는 pod정의
template:
metadata:
pod 이름 정하기
labels:
app: test-app >> 이 key:value 는 본인이 원하는 이름으로 입력 가능.
개별 pod에 대한 스펙
spec:
containers: >> 하나의 pod에 여러개의 컨테이너 설정이 가능하며 '-' 로 나열
- name: golang-test
image: 도커 허브 레포 이름
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deplpoyment
spec:
replicas: 1
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
spec:
containers:
- name: golang-test
image: 도커 허브 레포 이름
1-2. yaml 파일 실행하기
kubectl apply -f deployment.yaml
kubectl get deployments
> 실행되고 있는 deployement 확인 할 수 있습니다.
1-3. livenessProbe 옵션
deployment 구성파일에 livenessProbe 옵션을 추가하여 컨테이너가 정상인지 상태를 확인할 수 있습니다.
💡공식문서
Probe
컨테이너가 정상인지, 트래픽을 수신할 준비가 됐는지 등을 확인하기 위해 컨테이너 상태 검사 실행
ex) deployment.yaml 파일
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deplpoyment
spec:
replicas: 1
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
spec:
containers:
- name: golang-test
image: 도커 허브 레포 이름
livenessProbe:
httpGet:
path: /
port: [포트]
periodSeconds: 10 > 작업을 수행하는 빈도
initialDelaySeconds: 5 > 쿠버네티스가 상태확인까지 기다려야하는 시간
에러 발생 시키는 endpoint 로 호출한 뒤 kubectl get pods
실행해보면 restart 가 올라간 걸 확인할 수 있습니다.
2. service.yaml 구성하기
💡 공식 문서
2-1. yaml 파일 구성
apiVersion: v1
kind: Service
metadata:
name: 서비스 이름
spec:
selector: >> 노출할 pod의 키-벨류 (deployements.yaml 에서 정의한 template > metadata > labels 에 정의한 key-value)
app: test-app
하나 이상의 port 로 노출이 가능하며 '-' 로 나열
ports:
- protocal: 'TCP' >> TCP 가 default
port: 80 >> 외부 포트
targetPort: 8080 >> 컨테이너 포트
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: test-app
ports:
- protocol: 'TCP'
port: 80
targetPort: 8080
type: LoadBalancer
2-2. yaml 파일 실행하기
kubectl apply -f service.yaml
kubectl get services
'쿠버네티스' 카테고리의 다른 글
쿠버네티스 Pod (0) | 2023.09.15 |
---|---|
EKS로 클러스터 구성하기 (1) (0) | 2022.12.08 |