Load Balancing, Service Discovery
웹 서비스는 얼마만큼의 컴퓨터 자원이 필요한지 사전에 알기 어렵다
- Scale Up을 진행하기 어렵다
- Load Balancing과 Service Discovery가 중요한 이유
무중단 배포
웹 서비스는 사용자가 언제든지 접속하고 있을수 있다
- 접속 중에 업데이트를 진행하면 서비스가 중단될수도 있다.
- 어떻게 하면 사용자의 서비스 중단 없이 업데이트를 진행할 것인가?
쿠버네티스의 등장
Container Orchestration
도커의 컨테이너는 애플리케이션 배포에 인프라에 대한 고민을 많이 줄여주었다
- 다양한 서버에 배포하면서 환경을 일정하게 유지할수 있으며
- 상대적으로 가볍기 때문에 빠르게 전달하고 실행할수 있다
이 컨테이너의 배포, 확장, 관리를 자동화 하는 것을 Container Orchestration이라고 부른다
-> 쿠버네티스(Kubernetes)는 서버 자원을 묶어서 관리하고 컨테이너의 관리를 자동화하는 시스템이다
쿠버네티스(Kubernetes)
대표적인 Container Orchestration System (배포의 모든 어려움을 커버함)
- 컨테이너를 수평적으로 늘리며(Horizontal Pod Autoscaler), Load Balancing(부하를 나눠줌)를 관리
- 컨테이너 모음의 순차적 업데이트를 통한 무중단 배포 가능(Rolling update)
- 컨테이너 실행에 필요한 자원을 가진 컴퓨터를 자동 식별(Service Discovery)
Kubernetes Cluster
쿠버네티스가 컨테이너를 관리하기 위한 여러 머신(컴퓨터)의 묶음
- Node: 개별 컴퓨터 자원
- Pod: 각각 노드위에서 실행되는 컨테이너 또는 컨테이너 모음(여러 컨테이너가 한 애플리케이션일수 있음)
- Control Plane: Cluster 전체를 관리하고 API를 외부에 노출하여 통신(kubectl 이라는 명령어로 컨트롤 가능)

대표적인 kubectl 명령어
먼저 클러스트의 설정파일(kubeconfig.yaml)을 받아야한다 -> 어떤 클러스트인지 정보가 담겨있음
kubectl get nodes (현재 클러스터의 노드들 정보보기)
kubectl get svc
nslookup
kubectl set image deployment/[DEPLOYMENT_NAME] [CONTAINER_NAME]=[NEW_IMAGE]:[TAG]
(명령어 하나만으로 자동으로 롤링 업데이트가 됨)
kubectl create secret docker-registry regcred --docekr-server <yours> --docker-name <yours> --dcoker-password <yours> --docker-email <yours> (해당 도커 레지스트리에 접근하기 위한 시크릿키 생성)
kubectl logs -f <파드 이름> (해당 파드의 로그 실시간 출력)
kubectl apply -f my-hpa.yaml(오토스케일링을 위한 설정을 적용하라는 명령어)
kubectl apply -f deployment-file.yaml(배포 방법에 대한 설정을 적용하라는 명령어)
-> 이 두개의 yaml 파일을 적용해야 오토스케일링과 로드밸런싱 적용이 가능하다.
kubectl descibe hpa my-hpa -n default
(내 yaml 설정이 잘 적용이 되었는지 확인)
my-hpa.yaml 내용 (cpu 사용률이 50% 이상이면 AutoScaling을 진행하고 만약 10분이내에 cpu 사용률이 50% 이하라면
1분 간격으로 Scale down 하라)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 5
behavior:
scaleDown:
stabilizationWindowSeconds: 600 # 10분 동안 유지
policies:
- type: Pods
value: 1
periodSeconds: 60
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
deployment-file.yaml 내용(AutoScaling 할때 어떤 이미지를 사용할지와 cpu 사용량의 최소치와 최대치를 설정)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s-app: my-deployment
template:
metadata:
labels:
k8s-app: my-deployment
spec:
containers:
- name: my-deployment
image: myreg.kr.ncr.ntruss.com/alarm-server:calc
resources:
requests:
cpu: "250m" # CPU 요청을 250 millicores로 설정
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
롤링 업데이트시 설정 yaml 파일
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example-container
image: example/image:v2
maxUnavailable을 0으로 설정한것은 무중단 배포를 위함
'웹 프로그래밍 > 스프링' 카테고리의 다른 글
최종 프로젝트 회고 (스프링 @Asysc, 비동기 방식) (0) | 2024.05.08 |
---|---|
Techit Java Backend School 8기 수료(우수상) 후기 (2) | 2024.05.06 |
RabbitMQ (1) | 2024.04.26 |
Docker (0) | 2024.04.12 |
스프링 시큐리티에서 Redis로 jwt 액세스 토큰, 리프레쉬 토큰 구현 (2) | 2024.04.12 |