우리가 쿠버네티스 패턴을 알아야하는 이유는 무엇일까요?
쿠버네티스의 리소스들을 추상화 하고 이와 관련된 원칙과 패턴을 잘 이해한다면,
클라우드 네이티브 어플리케이션을 구축하는 데 좋은 지름길이 될 것이기 때문입니다.
이번 장에서는 클라우드 네이티브 어플리케이션이 무엇인지
쿠버네티스에서 사용하는 리소스들을 어떻게 추상화 할 것인지에 대해 살펴볼 것 입니다.
2015년 처음 클라우드 네이티브라는 용어를 사용한 리눅스는 CNCF(Cloud Native Computing Foundation)재단을 만들어 클라우드 네이티브로 전환할 수 있는 오픈소스 기술들을 추진하고 관리하였습니다.
그렇다면 클라우드 네이티브란 무엇일까요?
사실 클라우드 네이티브의 배경은 쿠버네티스 패턴 - 0장 쿠버네티스 패턴 에서 설명한 쿠버네티스의 배경에 대한 내용과 같습니다.
따라서 배경을 알아보는 것을 건너뛰도록 하고, 다양한 정의 중 CNCF에서 정의한 클라우드 네이티브에 대해서 알아보겠습니다.
CNCF에서는 클라우드 네이티브를 다음과 같이 얘기하고 있습니다.
👍 결과적으로 클라우드 네이티브란 클라우드의 이점(위의 내용)을 최대로 활용할 수 있도록 어플리케이션을 구축하고 실행하는 방식을 말합니다.
앞으로 우리는 디자인 패턴을 통해서 클라우드의 이점을 최대로 활용할 수 있도록 하는 것에 집중할 것이고,
이를 토대로 클라우드 네이티브 어플리케이션을 잘 만들 수 있도록 구체화 할 것입니다.
앞서 클라우드 네이티브 어플리케이션에 대해서 알아보았는데요.
쿠버네티스 디자인 패턴을 얘기하기 전에 기본적인 컨셉이 될 쿠버네티스의 분산 기본 요소 추상화해보려고 합니다.
이번 시리즈에서 쿠버네티스의 분산 기본 요소를 추상화 하기 위해서
가장 먼저 잘 알려진 객체 지향 프로그래밍 언어와의 비교가 필요합니다.
따라서 대표적 객체 지향 프로그래밍 언어인 자바와 비교를 통해서 쿠버네티스의 기본 요소들을 추상화 해볼 것입니다.
자바에는 클래스, 객체, 패키지, 상속, 캡슐화, 다형성 같은 여러 가지 개념이 있습니다.
그리고 자바 런타임은 수명주기 관리 방법에 대해 특정 기능을 제공하고 보장합니다.
또한 자바와 JVM은 어플리케이션을 생성하기 위해 로컬 인프로세스 빌딩 블록을 제공합니다.
우리는 이러한 개념들을 쿠버네티스의 분산 기본 요소와 대입해 추상화를 하고
이런 개념을 토대로 쿠버네티스 디자인 패턴을 완성해 나갈 것입니다.
따라서 로컬에서 필요한 기본 요소들과 분산 환경인 쿠버네티스에서 필요한 기본 요소들의 차이를
아래의 표를 통해서 추상화 하였습니다.
개념 | 로컬 기본 요소 | 분산 기본 요소 |
---|---|---|
캡슐화 동작 | 클래스 | 컨테이너 이미지 |
인스턴스화 동작 | 객체 | 컨테이너 |
재사용 단위 | .jar 파일 | 컨테이너 이미지 |
컴포지션(Composition) | 클래스 A가 클래스 B를 포함 | 사이드카 패턴 |
상속 | 클래스 A가 클래스 B를 확장 | 'FROM 부모 이미지' 로 만든 컨테이너 이미지 |
배포 단위 | .jar/.war/.ear | 파드 |
빌드 타임 / 런타임 격리 | 모듈, 패키지, 클래스 | 네임스페이스, 파드, 컨테이너 |
초기화 필요 조건 | 생성자 | 초기화 컨테이너 |
초기화 직후 트리고 | Init 메소드 | postStart |
삭제 직전 트리거 | Destroy 메소드 | preStop |
정리(Clenup) 절차 | finalize(), 셧다운 훅 | Defer 컨테이너 |
비동기 & 병렬 실행 | ThreadPoolExcutor, ForkJoinPool | 잡 |
주기적 작업 | Timer, ScheduledExecutorService | 크론잡 |
백그라운드 작업 | 데몬 스레드 | 데몬셋 |
설정 관리 | System.getenv(), Properties | 컨피그맵, 시크릿 |
이번 장을 통해서 우리는 쿠버네티스 패턴을 알아야하는 이유를 자세하게 알아보고,
쿠버네티스에서 사용하는 리소스들을 어떻게 추상화 할 것인지까지 살펴보았습니다.
다음 장부터는 실제 쿠버네티스 디자인 패턴에 대해서 알아볼 것이며,
이번 장에서 설명한 내용을 토대로 내용을 펼쳐나갈 것입니다.
이해가 안되거나 논의 해볼 수 있는 내용이 있다면
언제든지 댓글로 달아주시면 제가 답변할 수 있는 범위 내에서 답변 달아보도록 하겠습니다.