[Go] CDK8s (CDK for k8s)

2023. 2. 18. 18:06[ DevOps ]/[ Golang ]

기존 yaml 방식의 '선언적 프로그래밍' 장단점

- k8s manifest, Helm chart, kustomize 등

 

장점

- 사람이 읽기 쉬움

- 어디서든 사용가능

- 선언적 프로그래밍 형태

- 원하는 상태(Desired state)로 배포 가능

- static 한 파일 명세

 

단점

- 복잡성에 따라, 다수 환경일 경우 중복 부분 처리 필요(Helm chart, kustomize 등)

- 즉, 공통부분에 대한 관리의 어려움이 있으며 별도 툴에 대한 학습 필요

 

 


 

 

개발자의 요구사항

yaml 방식의 선언적 프로그래밍 방식을 통해 쿠버네티스에 자원을 할당하고 관리하는 방식은 개발자에게 익숙하지 않았다. 즉, 개발자 친화적인 프로그래밍 언어(Go, Java, Python 등), 프레임워크, CLI 등의 형태를 기반으로 하여 선언적 프로그래밍 형태가 아닌 직접 프로그래밍 적인 방식으로 쿠버네티스에 자원을 할당하고 관리하기 위한 요구사항이 생겨났다.

 

 

 

CDK8s [CDK(Cloud Development Kit) for K8s]

CDK8s는 개발자의 요구사항을 충족시키기 위해 등장한 프레임워크이다. CDK8s의 주요 사용 목적은 개발자에 친숙한 프로그래밍 언어를 기반으로 하여 굳이 yaml 형태의 문법이나 Helm의 문법, kustomize 문법 등을 알지 못해도 쿠버네티스에 리소스를 할당하고 관리할 수 있도록 하는 yaml형태의 manifest를 자동으로 생성하고자 함에 있다.

 

 

https://cdk8s.io/

 

 

- 개발자 친화적인 프로그래밍 언어와 객체지향 API를 이용하여 k8s API를 관리할 수 있는 일종의 개발 프레임워크이다.

- 2019년 AWS에서 개발되어 현재 오픈소스로 기부되었다.

- 각 언어를 통해 구성하고자 하는 k8s 리소스를 작성하고 배포할 수 있는 yaml을 자동으로 생성한다.

- k8s에 배포할 자원을 Go, Java, Python, TypeScript 등의 언어로 작성할 수 있다.

- 현재 CNCF의 Sandbox Project로 기부되었다.

- 현재 가장 최신 버전은 2.x 버전이다.

 

 

CDK8s 주요 특징

https://cdk8s.io/

 

1) k8s 오브젝트 정의 용이

- Go, Java, Python, Typescript 등의 개발자가 익숙한 프로그래밍 언어로 k8s 애플리케이션 정의 가능

 

2) 라이브러리화 및 공유 용이

- 공통로직을 라이브러리 형태로 작성하거나 공유 가능

- 각 언어의 특성에 맞게 k8s API 작성 가능

- k8s 애플리케이션 정의를 위한 라이브러리를 표준화하여 재사용 가능

 

3) 애플리케이션 워크플로우 단순화

- 애플리케이션을 개발하는 것과 동일한 툴을 사용해 워크플로우 정의

- 작성한 코드를 CI/CD 파이프라인을 통해 k8s에 자동화된 배포 가능

- 즉, CDk8s 코드 자체를 k8s에 배포하여 관리가 가능. 따라서 애플리케이션 관리와 통합된 툴로 개발 가능

 

 

 

CDK8s 워크플로우

https://aws.amazon.com/ko/blogs/korea/using-cdk8s-for-kubernetes-applications/

 

- 개발자가 소스코드를 작성하고 CDK8s CLI를 통해 k8s manifest로 생성하고 저장함

- 생성된 manifest는 kubectl CLI로 관리됨

- 위와 같은 일련의 과정에 역시 'GitOps' 적용 가능

 

 

 

 

 

Reference

- AWS CDK8s docs, https://aws.amazon.com/ko/blogs/korea/using-cdk8s-for-kubernetes-applications/

- CDK8s, https://cdk8s.io/

- CDK8s GitHub, https://github.com/cdk8s-team/cdk8s

- CDK8s docs, https://cdk8s.io/docs/latest/