티쓴토리 99

쿠버네티스 - 잡과 스케줄러 - 19

작업을 완료한 후에는, 종료되는 서비스가 있을 수 있다. 쿠버네티스는 '잡' 이라는 리소스로 해당 기능을 지원한다. 잡을 통해, 파드 내부 프로세스가 완료되면 해당 파드를 완료 시킬 수 있다. 물론 완료에 실패하면 이후처리를 결정 할 수 있다. 때문에 잡은 제대로 완료되는 것이 중요한 작업에 매우 유용하다. 이러한 작업의 좋은 예는 배치 작업이 있다. apiVersion: batch/v1 kind: Job metadata: name: batch-example spec: template: metadata: labels: app: batch-example spec: restartPolicy: OnFailure containers: - name: main image: 배치를 실행할 이미지 kubectl get..

쿠버네티스 - 레플리카셋 - 18

레플리카셋은 우리가 배웠던 레플리케이션을 대체할 새로운 요소다. 레플리케이션컨트롤러와 레플리카셋의 차이점은 다음과 같다. 1. 레플리카셋은 특정 레이블이 없는 파드를 매칭시킬 수 있다. 2. 레플리카셋은 특정 레이블의 키를 갖는 파드를 매칭시킬 수 있다. (key=*) 3. 두개의 레이블의 조합으로 파드를 매칭시킬 수 있다. apiVersion: apps/v1 kind: ReplicaSet metadata: name: suk9-rc spec: replicas: 3 selector: matchLabels: app: suk9-rc template: metadata: labels: app: suk9-rc spec: containers: - name: suk9-rc image: seokkyulee/suk9 po..

쿠버네티스 - 레플리케이션컨트롤러 - 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) 화면으로 이동해보자. 반대로 프로필 화면에서..