개발 이야기 94

쿠버네티스 - 레플리케이션컨트롤러 - 17

레플리케이션컨트롤러의 역할은 실행중인 파드의 수를 레이블 셀렉터와 일치시키는 것이다. 쿠버네티스는 애플리케이션의 실행을 보장한다. 이런 기능을 담당하는 리소스가 레플리케이션 컨트롤러다. 노드가 다운되는 등, 특정 이유로 인해 파드가 사라진 경우 파드를 재실행한다. 반대로 너무 많은 파드가 실행된 경우 제거한다. 말 그대로 복제본(레플리카)을 컨트롤 한다. 이러한 조정 절차는 다음과 같다. 레이블 셀렉터와 매칭되는 파드를 찾는다. 매칭 된 파드의 수와, 설정된 수를 비교한다. 많다면 파드를 삭제하고, 부족하다면 현재 템플릿에서 파드를 추가 생성한다. 레플리케이션 컨트롤러는 세 가지 중요 요소를 가지고 있다. 레이블 셀렉터(label selector)는 레플리케이션컨트롤러의 파드의 매칭 범위를 결정한다. 레..

쿠버네티스 - 프로브 - 16

이전에 우리는 레플리카(레플리케이션 컨트롤러) 설정을 통해 파드가 죽은 경우, 쿠버네티스가 이를 되살리고 그 숫자를 관리한다는 사실을 알게 되었다. 이에 대해서 좀 더 자세히 알아보자. 만약 파드 안에 있는 컨테이너 중 하나가 죽으면 어떻게 될까? 파드가 노드에 스케줄링되는 즉시, 해당 노드의 kubelet은 파드의 컨테이너를 실행하고 파드가 존재하는 한 계속 실행되도록 할 것이다. 애플리케이션 내부의 문제로 컨테이너가 죽더라도 쿠버네티스는 이를 자동으로 되살린다. 물론 애플리케이션에서 쿠버네티스에 재실행을 요청할 수도 있다. 그러나 대부분의 경우 애플리케이션의 외부에서 애플리케이션 컨테이너의 상태를 체크하는 것이 좋다. 흔히 서버를 설정하다보면, 상위 인프라에 헬스 체크를 제공하게 된다. 쿠버네티스도 ..

Next.js - 서버 분리 - 3

Next.js에는 서버가 포함되어 있지만, 원한다면 커스텀 서버를 작성하고 거기에 Next.js를 연결해 사용할 수 있다. 이렇게 하면 몇가지 장점이 생긴다. - Next.js의 최상단 진입점을 제어할 수 있다. - Node레벨의 라이브러리를 사용할 수 있게 된다. - Koa, Express와 같은 서버를 구성할 수 있고, 서드파티 모듈을 이용할 수 있게 된다. - Node레벨(최상단)의 에러처리를 할 수 있다.

쿠버네티스 - 파드 중지/삭제 - 15

kubectl get po kubectl delete po suk9 간단하게 파드를 삭제하려면, 파드 리스트를 확인 후, delete 명령어로 파드를 삭제할 수 있다. 물론 바로 삭제되지는 않고 특정 절차를 진행하게 된다. 1. 쿠버네티스가 프로세스에 SIGTERM 신호를 보낸다. 2. 30초 동안 기다린다. 3. 시간 동안 종료되지 않으면 SIGKILL 신호를 보내 종료한다. 따라서 그레이스풀하게 종료하려면 SIGTERM 신호를 바르게 처리해야 한다. kubectl delete po -l creation_method=manual 레이블 셀렉터를 통해 다수의 pod를 모두 삭제할 수도 있다. 위의 명령으로 셀렉터에 걸린 pod는 모두 삭제된다. 물론 namespace 안에서 유효하다. kubectl co..

쿠버네티스 - 네임스페이스 - 14

레이블을 통해 쿠버네티스의 모든 오브젝트들을 셀렉트 할 수 있다는 것을 알게 되었다. 하지만 이로서는 충분치 않다. 여러 오브젝트가 같은 레이블을 가지고 있는 경우 결과가 겹칠 수 있기 때문이다. 이번에는 오브젝트를 그룹으로 묶을 수 있는 기능인 네임스페이스를 알아보자. 백문이 불여일행이다. 일단 쳐보자. kubectl get ns default, kube-public, kube-system 등의 네임 스페이스가 보일 것이다. 지금까지 우리는 default 네임스페이스에서만 작업을 했다. kubectl get po -n kube-system kube-system의 pods 리스트를 볼 수 있다. 이런 시스템 파드들이 우리가 실행하는 파드들과 섞여 있다면 혼란 정도가 아니라, 안정성에도 좋지 않은 영향을 ..

Next.js - 데이터 가져오기 - 2

Next.js를 사용하면 CSR과 SSR을 자유롭게 넘나들 수 있다. Next.js에서는 데이터를 취급하는 방법이 몇 가지 있고, 이로 인해 렌더링 방식이 달라진다. 초기에 이 기능들을 정확하게 익히지 않으면, 계속 헷갈리게 된다. 차이점과 사용법을 분명하게 하고 시작하자. 웹 페이지는 크게 2가지로 나눌 수 있는데, 데이터가 필요 없는 페이지와 데이터가 필요한 페이지다. 1. 데이터가 필요 없는 정적 페이지를 Next.js가 취급하는 방법 위와 같이 파일 2개를 간단하게 작성하고 npm run build -> npm run start 스크립트를 통해 빌드하고 로컬 서버를 열어 localhost:3000에 접속해보자. 홈(/) 화면에서 프로필(/profile) 화면으로 이동해보자. 반대로 프로필 화면에서..

Next.js - 시작 - 1

2년전 개인적인 프로젝트에 Next.js를 처음 써보고, 오랫동안 사용하지 않았었다. 근래 회사 프로젝트에 Next.js를 사용하게 되면서 그간 몰랐던 기능, 새로운 기능을 공부하기 위해 정리해보려 한다. Next.js는 공식문서가 잘 되어 있기 때문에, 공식문서를 통해 익혀보자! (Next.js의 장/단점에 대해서는 굳이 언급하지 않겠다.) 터미널을 열고, 아래의 명령어를 통해 아주 편리하게 설치가 가능하다. npx create-next-app --typescript npm run dev 순식간에 설치가 끝났다. 설치된 폴더에서 pages : 라우터와 맵핑된다. public : 정적 파일을 딜리버리 한다. 루트 경로에 맵핑되어 있다. localhost:3000/about 접속하면 해당 컴포넌트가 랜더링..

쿠버네티스 - 레이블 - 13

실제 쿠버네티스를 이용해 서비스를 배포할 경우, 파드를 분류할 필요가 있다. 제대로 분류가 되어 있지 않다면, 무수히 많은 파드들이 뒤죽박죽 될 것이 분명하기 때문이다. 레이블 레이블은 리소스에 첨부하는 키-값 쌍이다. 원하는 만큼 추가할 수 있고 이를 통해 리소스를 선택할 수 있다. 바로 실습으로 확인해보자. apiVersion: v1 kind: Pod metadata: name: suk9 labels: creation_method: manual env: prod spec: containers: - image: seokkyulee/suk9 name: suk9 ports: - containerPort: 8080 protocol: TCP kubectl create -f suk9-manual.yaml kub..

쿠버네티스 - YAML - 12

쿠버네티스 리소스(파드를 포함하는)는 쿠버네티스 Rest Api 엔드포인트에 JSON 혹은 YAML 파일을 전송해 생성한다. Dockerfile이 가져다주는 이점들과 비슷한 맥락에서 설정은 파일로 나와 있는게 여러면에서 유리하다. kubectl get pods kubectl get po suk9-gnrzs -o yaml 현재 파드 목록을 출력한 뒤, 한 녀석을 골라 yaml 정의를 구경해보자. 이렇게 긴걸 언제 작성하지? 보다보면 이런 생각이 들텐데 걱정하지 않아도 된다. 실제로 우리가 작성하는 영역은 간소하다. suk9.yaml apiVersion: v1 kind: Pod metadata: name: suk9 spec: containers: - image: seokkyulee/suk9 name: suk..