k8s 환경에 내 서비스 띄워보기
·
Ops
Introduce클라우드 웨이브 활동을 할 때는 eks 클러스터에 내 서비스를 띄워서 테스트 했지만 비용 이슈로 인해 kind 클러스터로 돌아와서 복습과 그 때는 해결하지 못했던 문제들을 해결해보고자 합니다. kind 클러스터는 예전에 구축했으니 클러스터에 바로 서비스를 띄워서 잘 작동하는지 확인해보겠습니다1. ConfigMap, Secret 띄우기쿠버네티스에서 사용하는 파라미터와 환경변수를 관리하기 위해 ConfigMap과 Secret을 사용했습니다.Secret은 패스워드 및 인증서 와 같은 중요정보 보관용으로 사용(BASE 64 인코딩)configMap에 immutable:true를 해주면 성능 향상(감시하지 않는다.)//data 부분에 configMap으로 관리할 변수 추가apiVersion: v1..
EKS 클러스터 구축
·
Infra
들어가며CJ 클라우드 웨이브에서 프로젝트 기간동안 AWS 비용을 지원을 받아서 AWS 서비스를 돈 걱정 없이 사용할 수 있는 좋은 기회를 얻게 되었습니다. 프로젝트에서 사용할 EKS 클러스터를 AWS 콘솔을 이용해서 구축해 보았습니다.VPC 생성1. VPC 생성private subnet과 public subnet을 가용성을 위해 2개씩 생성nat gateway와 ingress를 두기 위해 public subnet 생성한다.2. 서브넷 4개 생성후 2개는 자동할당 활성화 (public subnet으로 사용하기 위해서) 3. 2개의 public subnet에 nat-gateway를 둡니다  4. routing 테이블에서 라우팅 편집을 통해서 생성한 nat-gateway를 private 서브넷과 연결해줍니다...
일단 단위 테스트부터 테스트 코드 작성해보기
·
Dev
테스트 코드 작성하는 이유지금까지 테스트를 Swagger로 했는데 리팩토링 작업을 하면서 테스트 작업을 해야하는데 Swagger로 다시 테스트를 하기에는 너무 번거로운 작업이었고 테스트 코드를 작성하면서 기존에 발견하지 못했던 버그가 있으면 찾고자 작성하였습니다.단위테스트 vs 통합테스트단위 테스트는 개별 구성 요소의 기능을 개별적으로 확인하고 통합 테스트는 여러 구성 요소가 올바르게 함께 작동하는지 확인합니다.단위 테스트는 개발하면서 같이 작성해야 했는데 업보라고 생각하고 단위테스트부터 작성하였습니다.JUnit5와 MockitoJUnit 5와 Mockito는 Java 개발자가 단위 테스트를 작성하고 모의 객체(Mock Objects)를 사용하여 테스트하는 데에 널리 사용되는 라이브러리입니다.각각 JUn..
상품 주문하기 동시성 문제 해결하기
·
Dev
시나리오사용자 5명이 상품의 재고가 2개가 남았을 때 동시에 주문을 했을 때 정상적으로 동작하려면 3명의 사용자는 예외 처리(품절)가 되어야 합니다. 코드의 일부분을 보면 재고가 주문한 수량보다 많으면 예외 처리가 되어야 합니다. request.getOrderItemDTOList().forEach(orderItemDto -> { Item item = itemRepository.findById(orderItemDto.getItemId()).get(); orderItemDto.getOrderDetailDTOList().forEach(orderDetailDTO -> { if (orderDetailDTO.getItemOptionId() != null) { // 옵션이 있는 상품..
kind 이용해서 k8s 다뤄보기
·
Ops
Intro쿠버네티스 실습을 해보기 위해서 kind를 이용해서 간단하게 쿠버네티스 환경을 구축한 뒤 실습을 진행했습니다.kind 설치하기kind를 이용하면 간단하게 쿠버네티스 cluster를 설치할 수 있습니다.설치 가이드: https://kind.sigs.k8s.io/docs/user/quick-start/#installation  클러스터 yaml파일 작성kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4name: kind-clusternodes:- role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: ..
컨테이너 환경 로그 수집해보기
·
Ops
Introdocker compose에 대해서 배우면서 도커 볼륨을 이용해서 서버로 이용하는 컨테이너와 로그수집기, 메트릭 수집기간에 볼륨을 공유하여 볼륨 안에 데이터를 저장할 수 있다는 방법을 듣고 구현해보았습니다.docker compose를 사용한 이유여러 컨테이너를 한개의 yaml 파일로 관리할 수 있고 버전 관리가 용이합니다. 도커 네트워크와 볼륨을 관리하기 용이합니다.Tooldocker-composeELK stackdocker compose yaml 파일 작성해서 ELK 파이프라인 구축하기elasticsearch, logstash, kibana를 docker compose를 이용해서 구축했습니다. 로그를 표준출력으로 logstash로 내보내서 elasticsearch에 저장되도록 구현했습니다.EL..
UTM 이용해서 쿠버네티스 환경 구성하기
·
Infra
Intro인프라에 관련된 교육을 들으러 가는데 쿠버네티스에 대해서 좀 알고 가면 좋을 거 같아서 실습을 진행해 보았습니다. 환경은 맥북 m3에서 진행했습니다.🤔 쿠버네티스를 사용하는 이유컨테이너 환경에서 많은 컨테이너를 관리할 때 용이하게 사용이 가능하고 고가용성을 얻을 수 있습니다.쿠버네티스는 인프라를 추상화하여 쉽게 인프라를 관리할 수 있어서 마이크로 서비스 환경에 적합합니다.ubuntu image 설치 & UTM 설치UTM : https://mac.getutm.app/ubuntu 20.04: https://cdimage.ubuntu.com/releases/focal/release/?_ga=2.203389460.469206803.1703810811-155106652.1703810811! 새 가상머신..
과도한 트래픽에 대한 방어하기
·
Dev
고민한 부분서비스를 배포하게 되면 한 사용자가 악의적으로 트래픽을 많이 보내게 될 경우 서버가 다운될 수도 있고 특정 기능은 외부 api를 사용하는 기능도 있어서 금전적으로 손해를 볼 수도 있겠다고 생각했습니다.그래서 특정 위치에서 발생하는 과도한 트래픽을 제한해야겠다고 생각했습니다.구현 방법 Bucket4j토큰 버킷(Token Bucket) 알고리즘을 사용하여 API 요청률을 제한하는 데 사용됩니다. 동작원리각 사용자 또는 API 키에 대한 버킷을 생성한다. 버킷으로 토큰의 개수를 제한할 수 있습니다.일정한 속도로 버킷에 토큰이 추가됩니다.API가 호출이 될 때 마다 버킷에 있는 토큰을 사용하게 되고 토큰이 부족하면 요청을 거부하거나 지연시킵니다. 구현HTTP 요청에 대한 Rate Limiting을 구..
GCP에 ElasticSearch 띄워서 검색 기능 구현하기
·
Dev
intro앱 기능 중 음식명으로 레시피를 조회하는 기능이 있습니다. 이 검색 기능에는 ElasticSearch를 사용해서 구현했습니다. ElasticSearch를 사용하면 성능이 매우 좋다는 정보를 많이 접했기 때문에 이를 기반으로 구현해 보았습니다.elasticsearch를 사용한 이유엘라스틱서치를 검색 엔진으로 사용할 때 독보적인 성능을 가지고 있습니다. 그 이유는 데이터를 저장하는 방식이 rdb와는 다른 방식을 사용해서 저장을 하고 있습니다. 엘라스틱 서치에서는 색인이라고 표현하는데 rdb에서 인덱스라고 표현하는 것을 역인덱스 구조로 저장하는 방식입니다.키워드에 인덱스를 주어지게 되어서 검색할 때 키워드를 이용해서 찾기 때문에 빠른 검색을 할 수 있습니다.ToolSpring 2.7.7ElasticS..
위치 기반으로 글 조회 기능 구현
·
Dev
들어가며게시판 기능인데 근처에 거주하고 있는 사람의 글을 조회할 수 있는 기능이 필요해서 게시글을 저장할때와 조회할때 위치를 반영해서 조회와 저장하도록 구현했습니다.ToolSpring boot 버전 2.7.7Naver Cloud MapsNaver Cloud Platform에서 Service 이용신청하기저는 위도, 경도를 이용해서 위치를 찾아낼 수 있는 Reverse Geocoding API를 사용했습니다.API요청은 가이드대로 요청하였습니다.https://api.ncloud-docs.com/docs/ai-naver-mapsreversegeocoding 일단 사용자 위치를 저장하고 조회할 수 있는 기능을 먼저 구현했습니다. 위도와 경도는 클라이언트에서 받아온 뒤 위치를 저장하고 조회하는 기능을 구현했습니다..