준비물:
1. 쿠버네티스
2. 도커와 쿠버네티스에 대한 기본적인 개념 및 이해
나의 테스트 환경
Host OS: Windows
Docker: Docker Desktop for Windows
기본 개념을 모른다면 이전 포스팅 참고
도커 & 쿠버네티스 이해하기
도커(Docker)란? 도커를 한 문장으로 요약하면 개발자가 만든 코드가 어느 환경에서도 작동할 수 있게 도와주는 오픈소스이다. 그런데 왜 굳이 Docker일까? 영어로 된 대부분의 기술 용어들은 이름
samori.tistory.com
쿠버네티스 설치
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-windows/
윈도우에 kubectl 설치 및 설정
시작하기 전에 클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 한다. 예를 들어, v1.30 클라이언트는 v1.29, v1.30, v1.31의 컨트롤 플레인과 연동될 수 있다. 호환되는 최신 버전
kubernetes.io
본인이 host에 직접 cli로 설치하고 싶다면 위 링크를 참고하면 된다.
OR
도커 데스크탑 내장 쿠버네티스
장점: GUI로 되어있어서 쉬움
단점: 컨테이너로 올리는 것이기에 조금은 더 무거움
아니라면 아래 링크를 통해 도커 데스크탑을 받아 설치
https://www.docker.com/products/docker-desktop/
Docker Desktop: The #1 Containerization Tool for Developers | Docker
Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.
www.docker.com
설치 후 실행하고 우측상단 설정 > Kubernetes > Enable Kubernetes 체크 > Reset Kubernetes Cluster
잘 설치된지 확인하기
kubectl version --client
클러스터에 접근할 수 있는지 확인하기
*클러스터란 쿠버네티스의 일꾼(Node)의 집합체로 컨테이너를 관리하는 역할을 한다.
종류로는 Master 와 Worker Node가 존재한다.
kubectl cluster-info
무중단 배포와 자동 스케일링에 앞서
쿠버네티스를 사용하기 위해 나오는 개념 중 대표적인 것들이 바로
Pods, Deployment, 그리고 Service 이다.
아주 쉽게 설명을 하면
Pod는 하나의 실행 단위로
컨테이너에 올라간 애플리케이션을 실행한다.
Deployment는 이 Pod를 관리하는 매니저로 사실상 쿠버의 핵심이다.
이 매니저는 사용자가 Yaml 파일에 설정한대로 Pod 들이 실행되는지 모니터링하고 컨트롤한다.
*이 Deployment 덕분에 무중단 배포와 자가복구가 가능하다.
Service는 사용자와 Pod를 이어주는 다리(Bridge)로
사용자가 Pod를 접근하기 위한 안정적인 연결을 제공한다.
*이 Service 없이도 무중단 배포와 오토 스케일링은 가능하다.
하지만 Pod의 IP는 수시로 바뀐다. 다른말로 영구적이지 않다는 것인데
그래서 직접 접근하는 것이 매우 번거러운 작업이다.
이때 Service는 이 번거로움을 Stable DNS로 해결해주며 내장된 로드밸런싱 기능으로 자동으로 로드밸런싱을 해준다.
무중단 배포: Rolling Update 해보기 + 롤백까지
두가지 방법:
1. Deployment 관련 yaml 파일을 직접 열어서 이미지 버전 수정해주기
Sample
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-app:v2
spec > spec > containers > image 를 수정해주면 되는데
이중에서도 버전만 바꾸면 된다. 예를 들어 my-app:v2 에서 my-app:v3
그러고 나서 위 yaml 파일을 적용해주면 된다.
kubectl apply -f <파일명>
무중단 배포가 잘 되고있는지 확인하기
kubectl rollout status deployment/<Deployment 이름>
2. Set 명령어로 yaml파일을 수정해주기
만약 yaml 열어서 바꾸기 귀찮다 혹은 에디터가 없다 하면 cli로도 가능하다.
1. deployment 이름 확인
kubectl get deployments
2. set image 명령어로 이미지 바꾸기
kubectl set image deployment/<Deployment 이름> <컨테이너 이름>=<이미지>
*예를 들어 kubectl set image deployment/my-app my-container=my-app:v3
set 명령어로 했기 때문에 apply를 다시 할 필요가 없고 무중단 배포가 잘 되고있는지 확인하면 된다.
kubectl rollout status deployment/<Deployment 이름>
예컨데 아래 명령어를 통해 이미지를 변경했다고 하고
kubectl set image deployment/httpbin-deployment httpbin=kennethreitz/httpbin
아래 명령어로 상태를 보면
kubectl rollout status deployment/httpbin-deployment
아래와 같이 결과가 나온다.
만약 실수로 이미지를 잘못 바꿔버려서 롤백을 해보고 싶을 수 있다.
이럴 땐 어떻게 할까? 바로 이전버전, 즉, undo를 하고 싶을 땐 아래와 같이 하면 된다.
kubectl rollout undo deployment/<deployment-name>
나의 경우 아래 명령어가 되겠고
kubectl rollout undo deployment/httpbin-deployment
특정 revision으로 돌아가고 싶다면 일단 history를 봐야하는데
kubectl rollout history deployment/<deployment-name>
revision 확인하고 아래에 revision 적어서 롤백이 가능하다.
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number>
오토 스케일링 해보기 + 수동 스케일링
먼저 스케일링이란 치과에서 받는 그런게 아니라
CPU 점유율/사용률과 같이 서버 PC의 부하를 확인할 수 있는 것을 기준으로 잡고
적정선에서 임계치를 설정해둔뒤 이 임계치를 넘어갈 때 Pod의 수를 늘리거나 줄이거나 해서
변동성이 큰 트래픽을 유동적으로 대처한다.
이 스케일링에 대표적인 방법이 수평 스케일링, 즉, Horizontal Scaling 이다.
그럼 왜 수평일까?
Pod = 인스턴스를 하나의 박스라고 가정했을 때
수평으로,일렬로 줄을 딱 세워놓고
유동적으로 늘렸다가 줄였다가 하는 식의 스케일링이라고 이해하면 이해가 쉬울 것이다.
반대되는 개념으로는 Vertical Scaling인데
이는 인스턴스의 개수를 늘렸다 줄이는 것이 아니라
인스턴스의 성능과 관련된 스케일링이다. 마치 박스의 높이를 높였다 줄였다 하는 것과 비슷하다.
허나 하나의 인스턴스가 낼 수 있는 성능이 제한적이기 때문에
Horizontal Scaling 처럼 인스턴스의 개수를 늘리는 것 만큼 드라마틱한 효과가 있지 않다.
아무튼,
그래서 그 수평 스케일링: Horizontal Scaling을 하려면
Horizontal Pod Autoscaler (HPA) 를 도입해야한다.
그렇다면 어떻게 해야할까?
기존 쿠버네티스 Pod를 돌리기 위한 Deployment와 Service에 추가로
HPA 관련 yaml 파일을 작성하고 적용하면 된다.
아래는 sample hpa.yaml이다.
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-httpbin-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: httpbin
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 40
spec > scaleTargetRef 에
deployment 를 설정 해두고
기존 deployment 이름을 적으면 해당 deployment를 모니터링 할 것이다.
아래는 말 그대로 최소, 최대 replicas 의 수이며
minReplicas: 1
maxReplicas: 10
아래는 CPU 점유율/사용률 을 임계치로 둬서 40퍼센트가 넘었을 때 maxReplicas에 도달할 때 까지
replicas 혹은 Pod의 복제품/인스턴스를 하나씩 늘리는 것이다.
targetCPUUtilizationPercentage: 40
이러고 적용만 하면 된다.
kubectl apply -f <파일명>
그렇다면 수동 스케일링은 어떻게 할까?
명령어로 가능하다.
1. deployment 이름 확인
kubectl get deployments
2. 지정한 replicas 개수대로 scaling 하기
kubectl scale deployment <이름> --replicas=<개수>
* 예를 들어
kubectl scale deployment httpbin-deployment --replicas=10 으로 하면
임계치 떠나서 10개가 생긴다.
이렇게 생긴 10개의 pod들은 deployment가 10개로 지정했기 때문에
어떠한 이유로 죽었거나/다운되었다고 해도 자가복구를 통해 다시 10개를 유지한다.
모니터링 하는법
오토 스케일링이든 수동 스케일링이든 Pod의 개수를 조절할 수 있는 것은 맞다.
하지만 현재 설정된 targetCPUUtilizationPercentage이 40퍼센트라고 가정했을 때
현재 cpu 점유율/사용률은 어떻게 되고 현재 replicas의 개수가 몇개이며 전반적으로
hpa가 어떻게 작동하고 있는지 확인 및 모니터링 하는 것은
따로 METRICS 라는 것이 필요하다.
이 Metrics는 모니터링을 위해 따로 설치를 해줘야 하는 것으로 아래 명령어를 통해 설치할 수 있다.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
확인하기
kubectl get pods -n kube-system | Select-String -Pattern "metrics-server"
헌데 로컬에서 테스트를 할 때는 공식 인증서도 없는데
굳이 https 인증 때문에 골머리 앓을 필요가 없기 때문에 해당 설정을 조작해줘야 한다.
방법은 아래 yaml파일을 터미널을 연 경로에 따로 받아서
kubectl get deployment metrics-server -n kube-system -o yaml > metrics-server.yaml
args에 아래 설정을 추가해줌으로써 tls 인증을 해제 하는 것이다.
- --kubelet-insecure-tls
이후 마찬가지로 적용을 해주고
kubectl apply -f metrics-server.yaml
재시작을 위해 해당 pod를 지워주면 자가복구 기능을 통해 다시 살아난다.
kubectl delete pod -n kube-system -l k8s-app=metrics-server
이후 아래 명령어를 통해 명령어를 입력한 시점에 CPU 점유율/사용률을 알 수 있다.
kubectl get hpa
아래 그림 처럼 아무래도 아무런 부하가 없기 때문에 현재 CPU 점유율/사용률은 0일 것이다.
TARGETS 참조
로컬에서 테스트 용으로 해보는 것이라면 부하테스트 툴을 통해 부하를 늘려서
Replicas가 잘 늘어나는지 줄어드는지 확인할 수 있다.
가장 유명한(?) Jmeter를 사용해서
부하테스트를 하면서 HPA를 모니터링 하는 방법을 중점적으로 다음 포스팅에서 소개하려고 한다.
그리고 부하테스트를 통해서 바뀌는 이 모든 것들을
쿠버네티스 전용 대시보드를 통해 시각적으로 확인해보는 것을 다룰 것이다.
다음 포스팅
Apache Jmeter로 k8s HPA 하기 + 전용 시각화 툴로 모니터링 하기
'개발자 전향 프로젝트' 카테고리의 다른 글
무한 스크롤 이해하기 (0) | 2024.08.22 |
---|---|
Apache Jmeter로 k8s HPA 하기 + 전용 시각화 툴로 모니터링 하기 (2) | 2024.07.26 |
Gitlab 과 Jenkins 연동하기 (0) | 2024.07.18 |
로컬에 띄운 내 웹페이지를 외부에서도 접속 가능하게 하는법 (Ngrok) (0) | 2024.07.18 |
Docker GitLab 버전 업그레이드 + 프로젝트 백업과 복구 (0) | 2024.07.12 |