분류 전체보기 216

쿠버네티스 클러스터 모니터링

쿠버네티스의 경우 클러스터 안에 다수의 노드, 그리고 그 안에 파드를 비롯한 다양한 워크로드가 많게는 수백 개가 실행되는 형태로 구성되어 있습니다. 단일 노드의 경우 리눅스 명령어를 이용하여 하드웨어의 상황을 파악하고, 각 프로세스 모니터링을 했다면, 쿠버네티스의 경우 각 노드는 전적으로 컨트롤 플레인에 의해 관리되므로 우리는 모니터링에 대해 다른 접근 방법을 가져야 합니다 클러스터 환경에서의 문제 해결의 어려움 단일 노드와 비슷하게, 클러스터 모니터링에서도 노드가 사용하는 리소스를 확인할 수 있습니다. 대표적으로 kubectl top 명령어가 있습니다. 이 명령어는 노드와 파드가 각각 얼마만큼의 CPU/메모리 리소스를 사용하고 있는지 확인할 수 있습니다. 한편 쿠버네티스 환경에서는, 여러 개의 마이크로..

Auto Scaling + CloudWatch를 이용한 알림 with terraform

Getting Started 0. terraform 기본 정의문 작성 1. vpc autoscaling에 사용할 vpc 생성 2. subnet와 라우팅 테이블 생성 1. autoscaling에 사용할 public subnet 생성 2. 라우팅 테이블에 연결할 인터넷 게이트웨이 생성 3. 라우팅 테이블 생성 4. public subnet과 라우팅 테이블 연결 4. security-group 생성 3. Autoscaling 시작 템플릿 구성 ASG를 위한 시작 템플릿 구성은 다음을 따릅니다. 그룹 정보 원하는 용량: 1 최소 용량: 1 최대 용량: 3 시작 템플릿은 다음 구성을 따릅니다. Ubuntu Server (LTS) t2.nano 기존 혹은 신규 키 페어를 사용합니다 보안 그룹: 인바운드 HTTP 및..

모니터링의 목표와 측정 항목

CI/CD 파이프라인의 마지막 Stage는 운영입니다. 서비스에 생길 수 있는 현황을 파악하고 문제를 모니터링하는 과정으로 대표될 수 있습니다. 그렇다면 어떤 지표를 수집하고, 어떤 메트릭을 기준으로 삼아야 할까요? 메트릭이란? 메트릭은 시간에 따라 측정한 결괏값입니다. 보다 넓은 의미로는 비즈니스 개념을 나타내는 수치 측정을 의미하기도 합니다. 예를 들어, 시간당 CPU 사용률, 연간 순매출과 같이 시간이라는 차원이 함께 적용되어야 합니다. 시간이 아닌 다른 차원(예를 들어, 서비스 별 매출)을 기준으로 삼을 수도 있습니다. 모니터링의 목표 모니터링을 통해 얻고자 하는 것은 다음과 같습니다. -> 시간을 기준으로 측정되는 주요 메트릭을 최소화하여 고가용성을 달성 -> 사용량을 추적하여, 배포에 앞서 세..

쿠버네티스 모니터링

[C172] 쿠버네티스에 어떤 파드가 Pending 상태에 머물러있다면, 어떤 계층부터 살펴보아야 할까요? 이 경우는 파드가 Running 상태인데 잘 작동하지 않는 경우랑은 어떻게 다른가요? (서비스는 연결되어 있다고 가정합니다)(Pending 상태 - 해당 파드가 실행을 위해 필요한 모든 리소스(CPU 등)를 할당받지 못해 실행 대기 상태에 머물러 있다는 것) 어떤 파드가 Pending 상태에 머물러있는 경우 1. 노드확인 - 노드의 유무 및 노드에 할당된 자원이 충분한가 등 상태를 확인한다. 2. 노드 선택을 위한 스케줄러 동작 확인 3. 파드가 요구하는 리소스 양 확인 - 가용 자원이 보다 적으면 Pending 될 수 있음 4. 파드 실행을 위한 이미지 유무 확인 Running 상태인데 잘 작동하..

lambda 모니터링 주요 메트릭

람다를 모니터링하려는 경우, 메트릭을 활용해 어떤 질문이 나올 수 있을까요? 레퍼런스(Lambda 키 메트릭)를 읽고, 어떤 질문을 해결할 수 있는지 알아봅시다. (힌트: 레퍼런스 문서에서 how many, how much, how long으로 검색해 보세요.) lambda 개념 : AWS Lambda는 인프라 리소스(예: 서버 용량, 네트워크, 보안 패치)를 프로비저닝 하거나 유지 관리할 필요 없이 서버리스 애플리케이션을 구축할 수 있는 컴퓨팅 서비스입니다 Lambda 호출 방식 AWS Lambda는 event drivent architecture입니다. 즉, Amazon API Gateway의 API 호출 또는 DynamoDB 테이블 변경과 같은 다른 서비스의 이벤트에 대한 응답으로 트리거 됩니다. ..

Array.isArray, filter, map, reduce 문법

Array.isArray(인자) -> 배열인지 아닌지 확인 객체 안에 데이터는 {객체.키}로 접근 가능 Object.keys() -> 객체를 배열로 변환 기술 부채: 기술적인 문제를 해결하지 않고 미루는 것 obj.hasOwnProperty -> 객체의 키를 찾는 함수 obj.filter((element) => 조건) -> 원하는 조건에 성분만 추출 map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환 ex) arr.map(function(element) { 적용할 내용 }); obj[property].map(element => square(element)); -> obj[property]가 배열일 경우 각 요소마다 square 함수 적용 const..

Section 3 프로젝트 회고 및 야크쉐이빙

프로젝트 3: 마이크로서비스 인프라 아키텍쳐 구성 요소 1. Sales API 2. Factory API 3. 프론트엔드(웹사이트) : cURL / postman / k6 등을 통한 API 호출로만 구현 4. 백엔드(서버) : 구매 시 창고에서 재고 확인 후 재고 감소 로직 구현 5. 데이터베이스(창고) : RDS에 mysql db 구성 상황 비효율적인 레거시 시스템 때문에 고객의 불만사항이 접수되고 있습니다. 제품별 재고부족 요청이 빈번하게 발생되고 있지만 전달 과정에서 지연과 누락 등 문제 상황이 발생하고 있습니다. 안정적으로 요청이 전달 될 수 있도록 시스템을 개선해야합니다. 비정상적으로 처리된 요청의 경우 운영팀에 상황을 알려야합니다. Day2 Step 1 : Lambda 서버(Sales API)..

helm으로 패키징하기

helm 쿠버네티스 패키지 매니저 : 쿠버네티스 워크로드를 하나로 묶어서 패키지 형태로 만들고, 배포하고, 설치할 수 있는 도구 -> 하나의 애플리케이션 구성이 최소 하나 이상의 파드와 서비스로 구성되어 있음을 생각해 봤을 때, 별개의 워크로드를 하나하나 적용하기보다는, 한 번에 여러 개의 워크로드가 즉시 배포된다면 간편할 것이다 차트, 저장소, 릴리스 helm에서는 패키지를 차트라고 부름 helm에서는 패키지가 저장되어 있는 공간을 저장소라고 부름 차트를 설치하여, 쿠버네티스 클러스터에 구동될 때, 차트의 인스턴스를 릴리스라고 부름 Hands-on: helm으로 Jenkins 설치하기 : Jenkins는 대표적인 설치형 CI 도구 : Jenkins 공식 홈페이지에서도 도커에 이어 두 번째로 쿠버네티스 ..

인그레스

인그레스 > 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 게이트웨이 > 일반적으로 HTTP를 관리하며 로드 밸런서, SSL Termination (클러스터 내에서는 HTTP로만 통신하게 하는 전환 과정), 가상 호스팅을 제공 실습으로 인그레스를 만들고, 적용해 봅시다. 먼저 기존 서비스 타입을 LoadBalancer로 ClusterIP로 바꾸고 적용합니다. ClusterIP는 클러스터 내에서만 접근 가능합니다. 더 이상 EXTERNAL-IP는 사용할 수 없음 인그레스 리소스를 다음과 같이 만들고 적용 kubectl get all,ingresses 3. 인그레스는 인그레스 리소스(정책 그 자체) 외에도 인그레스 컨트롤러(정책을 실행시키는 도구)가 반드시 필요. minikube를 사용하는 경우,..

HealthCheck

[C183] 애플리케이션에 HTTP 500과 같은 에러가 발생한 경우, 컨테이너를 다시 실행해야 할 것입니다. HTTP 에러가 발생했다는 것을 어떻게 알 수 있을까요? 어떻게 해야 쿠버네티스가 에러가 발생한 컨테이너를 자동으로 재시작하게 만들 수 있을까요? (힌트: liveness probe 키워드를 검색하세요) 프로브(Probe)는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)이다. 진단을 수행하기 위해서, kubelet은 컨테이너에 의해서 구현된 핸들러를 호출한다. 핸들러에는 다음과 같이 세 가지 타입이 있다. ExecAction : 컨테이너 내에서 지정된 명령어를 실행한다. 명령어 상태 코드 0으로 종료되면 진단이 성공한 것으로 간주한다. TCPSocketActio..