관리 메뉴

피터의 개발이야기

[kubernetes] cdk8s란 무엇인가요? 본문

Kubernetes/cdk8s

[kubernetes] cdk8s란 무엇인가요?

기록하는 백앤드개발자 2024. 2. 8. 19:33
반응형

 

ㅁ 관련글

[kubernetes] 쿠버네티스 목차

[kubernetes] 개발환경 목차, kubectl, Datree, eksctl, k9s, skaffold, LENS, OPENLENS

ㅁcdk8s란?

 cdk8s는 객체 지향 익숙한 프로그래밍 언어를 사용하여 Kubernetes 객체 yaml을 생성하기 위한 프레임워크입니다. cdk8s는 순수한 Kubernetes YAML을 생성합니다. cdk8s를 사용하여 어디에서나 실행되는 모든 Kubernetes 클러스터에 대한 애플리케이션을 정의할 수 있습니다. cdk8sCloud Development Kit for Kubernetes의 약자이다.

 

ㅁ CDK8S 특징

 

  • 친숙한 프로그래밍 언어로 쿠버네티스 애플리케이션을 정의할 수 있습니다 – JavaScript, TypeScript. Python, Java를 지원하면 Go, .NET과 같은 언어들을 지원할 예정입니다.
  • 쿠버네티스 애플리케이션을 코드로 정의하고 그것들을 npm, maven과 같은 코드 라이브러리로 공유하고 재사용이 가능합니다 – 라이브러리는 템플릿보다 업데이트하고 유지보수를 하기가 쉽습니다. 여러분은 이런 라이브러리를 통해서 사용자가 어떻게 쿠버네티스 애플리케이션들을 정의하는지 표준화할 수 있습니다.
  • 애플리케이션을 개발하는 언어와 같은 툴을 사용하여 CDK8s 코드를 정의하고 빌드할 수 있습니다 – CDK8s를 GitOps 같은 배포 방법론과 함께 사용하면 그것들을 코드로 관리하고 CI/CD 파이프라인을 통해서 여러분의 쿠버네티스 클러스터에 배포가 가능합니다.
  • CDK8s로 만들어진 쿠버네티스 매니페스트 파일들은 어디서든 실행 가능합니다. 클라우드 환경 혹은 온 프레미스 등 어디서나 실행되는 쿠버네티스 클러스터에 대한 애플리케이션 정의가 가능하기 때문에 표준화의 도구로도 사용이 가능합니다.

 

 

 

ㅁ 퀵가이드 동영상

 

 

ㅁCDK8s으로 쿠버네티스의 Pod 오브젝트 정의하기

import { Construct } from 'constructs';
import { App, Chart } from 'cdk8s';
import { KubePod } from './imports/k8s';

export class MyChart extends Chart {
  constructor(scope: Construct, name: string) {
    super(scope, name);
    new KubePod(this, 'podinfo', {
      spec: {
        containers: [
          {
            name: 'hello',
            image: 'stefanprodan/podinfo', 
            ports: [
              { containerPort: 9898 }
            ]
          }
        ]
      }
    }); 
  }
}
const app = new App();
new MyChart(app, 'cdk8s-demo');
app.synth();
TypeScript

 

 위는 CDK8s의 typescript-app 템플릿으로 작성한 쿠버네티스 Pod 오브젝트 정의 예제입니다. 예제 코드의 아랫부분에서 App 클래스를 인스턴스화하고 있는데 이 App 클래스가 이 애플리케이션의 Base 혹은 Root 라고 할 수 있습니다. App과 Chart는 모두 Construct라고 하는 클래스를 상속하여 추상화된 클래스입니다. MyChart가 상속하고 있는 ‘Chart’라는 클래스의 이름은  Helm Chart에서 따온 표현입니다. Chart는 단일 쿠버네티스 매니페스트를 합성하는 컨테이너이자 CDK8s에서의 하나의 최소 배포 단위입니다.

 

  예제에서는 이렇게 생성된 Construct 클래스 중 KubePod라고 하는 쿠버네티스의 Pod 오브젝트에 매핑이 되는 Construct를 인스턴스화 함으로써 Pod 오브젝트를 작성하는 스펙을 작성하고 있습니다. 위의 코드를 cdk8s synth 명령어로 쿠버네티스 오브젝트를 생성한 결과는 다음과 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: cdk8s-demo-podinfo-9a02d8a6
spec:
  containers:
    - image: stefanprodan/podinfo
      name: hello
      ports:
        - containerPort: 9898
YAML

 

ㅁ cdk8s-cli 설치

# cdk8s-cli 설치
$ npm i -g cdk8s-cli
added 308 packages in 8s

47 packages are looking for funding
  run `npm fund` for details

 

ㅁ Maven 설치

# maven 설치
$ brew install maven

# 버젼확인
$ mvn -v
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /usr/local/Cellar/maven/3.9.6/libexec
Java version: 21.0.2, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home
Default locale: ko_KR, platform encoding: UTF-8
OS name: "mac os x", version: "13.6.1", arch: "x86_64", family: "mac"

 ㅇ 시작하려면 Maven 3.6.3+이 설치되어 있어야 합니다. 

 Java용 cdk8s 시작하기

# 프로젝트 생성
$ cdk8s init java-app
Initializing a project from the java-app template
Importing k8s v1.25.0...
Importing resources, this may take a few moments...
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!                                                                                                                      !!
!!  This software has not been tested with node v21.6.0.                                                                !!
!!  Should you encounter odd runtime issues, please try using one of the supported release before filing a bug report.  !!
!!                                                                                                                      !!
!!  This software is currently running on node v21.6.0.                                                                 !!
!!  As of the current release of this software, supported node releases are:                                            !!
!!  - ^20.0.0 (Planned end-of-life: 2026-04-30)                                                                         !!
!!  - ^18.0.0 (Planned end-of-life: 2025-04-30)                                                                         !!
!!                                                                                                                      !!
!!  This warning can be silenced by setting the JSII_SILENCE_WARNING_UNTESTED_NODE_VERSION environment variable.        !!
!!                                                                                                                      !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

========================================================================================================

 Your cdk8s Java project is ready!
   cat help      Prints this message
   cdk8s synth   Synthesize k8s manifests to dist/
   cdk8s import  Imports k8s API objects to "src/main/java/imports/"
   mvn compile   Compiles your java packages
   
  Deploy:
   kubectl apply -f dist/

========================================================================================================

 

 

ㅁ Deployment 예제 수행

 

 

ㅇ 생성된 프로젝트를 Intellij로 열었다.

ㅇ Main.java에서 Deployment 예제를 수행하고 Main을 Run하였다.

ㅇ 빌드 과정에서 문법상 오류를 체크할 수 있다.

 

 Kubernetes 매니페스트를 생성할 준비

# 프로젝트 폴더에서 실행
$ cdk8s synth
Synthesizing application

  - dist/getting-started.k8s.yaml

 

 ㅇ 생성된 getting-started.k8s.yaml 파일을 확인하였다.

 

ㅁ 사용 후기

  cdk8s를 소개하고  Java 라이브러리를 이용하여 샘플 yaml를 만들어 보았습니다. IDE와 함께 Java의 객체지향적인 언어의 장점을 활용하여, 빠르게 코드를 작성할 수 있었다. 더욱이 빌드과정에서 사전에 오류사항을 발견하고 수정할 수도 있고, yaml의 문법오류에 대해서 신경쓰지 않고 코드에 집중할 수 있었다. 개발자의 입장에서 cdk8s는 코드를 통해 안정적인 kubernetes 메니피스트를 작성하게 도와주어, kubernetes 클러스터를 관리를 도와주는 좋은 도구라고 생각한다.

 

ㅁ 함께 보면 좋은 사이트

AWS: CDK8s를 이용하여 쿠버네티스 애플리케이션을 정의하고 관리하기

Youtube: Learning cdk8s - A quick intro (Kubernetes)

cdk8s란 무엇인가요?

cdk8s github

반응형
Comments