쿠버네티스
(=k8s)
공식 문서
- 쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장, 운영을 자동화하는 오픈소스 플랫폼입니다.
- Google에서 개발하고 현재는 CNCF(Cloud Native Computing Foundation)에서 관리합니다.
- 컨테이너 오케스트레이션 도구로, 다수의 컨테이너를 효율적으로 관리할 수 있습니다.
- 컨테이너의 갯수를 요청량에 따라 유동적으로 관리한다.
- docker 환경에서 실행된다.
- 서비스가 달라도 한 컨테이너에서 실행할 수 있으므로 MSA와는 거리가 있다.
주요 개념
- 컨테이너: 애플리케이션과 그 종속성을 함께 패키징한 가상화된 환경입니다.
- Pod: 쿠버네티스에서 실행되는 최소 단위의 배포 객체로, 하나 이상의 컨테이너를 포함합니다.
- 노드(Node): 쿠버네티스 클러스터에서 Pod가 실행되는 물리적 또는 가상 머신입니다.
- 클러스터: 여러 노드로 구성된 쿠버네티스의 집합입니다.
- 네임스페이스(Namespace): 클러스터 내에서 리소스를 논리적으로 구분하는 단위입니다.
쿠버네티스와 Spring Cloud 비교
공통점
- 확장성: 둘 다 마이크로서비스 아키텍처의 확장성을 지원합니다.
- 관리성: 서비스의 배포, 관리, 확장 등을 쉽게 할 수 있도록 도와줍니다.
- 고가용성: 서비스의 가용성을 높이고, 장애 발생 시 자동 복구를 지원합니다.
차이점
- 초점:
- Spring Cloud: 마이크로서비스 간의 통신, 서비스 디스커버리, 구성 관리 등 애플리케이션 레벨의 문제 해결에 초점
- 쿠버네티스: 컨테이너 관리, 배포, 스케일링 등 인프라 레벨의 문제 해결에 초점
- 구성 요소:
- Spring Cloud: Eureka, Ribbon, Zuul, Config Server, Hystrix 등 다양한 마이크로서비스 패턴을 지원하는 구성 요소
- 쿠버네티스: Pod, Deployment, Service, Ingress, ConfigMap, Secret 등 컨테이너 오케스트레이션에 필요한 구성 요소
- 배포 방식:
- Spring Cloud: 애플리케이션 코드와 함께 다양한 클라우드 서비스에 직접 배포
- 쿠버네티스: 컨테이너 이미지를 기반으로 클러스터 내에서 배포 및 관리 (Docker 기반이고, Docker가 Image 기반이기 때문)
Spring Cloud와의 통합도 가능
Spring Cloud Kubernetes
- Spring Cloud Kubernetes는 Spring Cloud와 Kubernetes의 통합을 지원합니다.
- 서비스 디스커버리, ConfigMap, Secrets 등을 Spring Cloud 애플리케이션에서 사용할 수 있도록 지원합니다.
주요 기능
- 서비스 디스커버리: Kubernetes API를 통해 서비스 인스턴스를 동적으로 검색하고 로드 밸런싱을 수행합니다.
- 구성 관리: Kubernetes ConfigMap과 Secrets을 사용하여 애플리케이션 설정을 중앙에서 관리합니다.
- 자동화된 배포: CI/CD 파이프라인과 통합하여 애플리케이션의 자동 배포와 관리를 지원합니다.
쿠버네티스의 장점과 단점
장점
- 확장성: 수평 확장을 통해 대규모 트래픽을 처리할 수 있습니다.
- 자동화: 배포, 스케일링, 복구 등의 작업을 자동화하여 운영 부담을 줄입니다.
- 유연성: 다양한 인프라 환경에서 일관된 운영이 가능합니다.
단점
- 복잡성: 초기 설정과 운영에 대한 학습 곡선이 높습니다.
- 운영 비용: 클러스터 운영과 모니터링에 추가적인 리소스가 필요합니다.
- 디버깅 어려움: 분산 환경에서 문제를 추적하고 해결하는 것이 복잡할 수 있습니다.
사례
성공 사례
- Google: 내부적으로 Borg라는 시스템을 사용하다가 Kubernetes로 발전시켜 오픈소스화
- Netflix: 대규모 마이크로서비스 아키텍처를 지원하기 위해 Kubernetes를 활용
- Airbnb: 애플리케이션 배포와 관리를 자동화하여 운영 효율성 극대화
실패 사례와 교훈
- 초기 설정의 복잡성: 많은 기업들이 초기 설정의 복잡성으로 인해 도입에 어려움을 겪음
- 리소스 관리의 중요성: 적절한 리소스 할당과 관리가 이루어지지 않으면 비용이 급증할 수 있음
- 전문성 부족: 충분한 Kubernetes 전문성이 없는 팀에서는 운영상의 어려움을 겪을 수 있음
custom하여 cmd 직접 입력하는 경우를 피하고, 사용을 편리하게 하는 경우가 많다
티켓 예매 프로그램 예시

-
user.role
master 등의 특별한 권한을 체크해야 할 때에는 데이터의 변동이 있는지의 여부가 예민하므로 jwt 토큰의 role과 대조하는 게 아니라 db의 실제 데이터와 꼭 대조하여 확인해봐야 한다.
-
order
본인의 데이터만 조회할 수 있도록 유의해야 한다. user을 꼭 호출하지 않고 jwt 토큰의 user만 확인해도 괜찮다.
-
데이터 삭제
바로 데이터를 삭제하기 보단 deleted_at, deleted_by의 사용으로 조회 시 where절에서 거르는 방법이 좋다. 이후 by 시간 뒤에 삭제하자. db에서 삭제할 경우 복구가 어렵기 때문이다.
-
요청이 많을 것으로 예상되는 데이터
ribbon을 통해 app을 n개 띄워 로드밸런싱
-
누락을 방지하기
messageQueue에서 order이 순차적으로 분배를 받아 주문이 밀려도 처리가 잘 될 수 있도록 하기 만약 처리량이 많을 경우 사용자에게 시간이 걸림을 알려주고 처리 후 알려주기 (에러가 아니고 대기임을 알려주기)