Kubernetes에서 개발 환경을 구축하는 것은 일반적인 상황과 많이 다릅니다.
기존에는 소스 코드 수정 -> 서버 재구축만으로 테스트를 진행할 수 있었지만,
Kubernetes 환경에서는 이 사이에 이미지 빌드 -> 레포지토리 푸쉬 및 풀 -> pod 재구성하는 과정 또한 필요합니다.
때문에 kubernetes 개발 환경에서 새 버전의 코드를 테스트하기가 매우 까다로웠습니다.
이 같은 문제를 해결하기 위해 등장한 툴이 바로 Skaffold입니다.
Skaffold는 자신을 구글의 오픈소스 프로젝트로 등장한 Build automation tool이라고 소개하고 있습니다.
이번 포스팅에서는 Skaffold와 더불어 Google의 builder를 이용한 buildpack 기술로 더욱 쉽게 Kubernetes 개발 환경을 구성해보겠습니다.
1. Installing Skaffold
우선 개발 환경을 구축할 머신에 Skaffold를 설치합니다.
다양한 환경을 지원하고 있지만 "Google Cloud Shell"과 "GCLOUD" 를 이용할 수 있다는 점이 눈에 띕니다.
Google Cloud Shell은 Skaffold와 더불어 Minikube 및 Docker가 설치된 환경을 무료로 제공하기 때문에 Skaffold를 처음 사용하는 분에게 권장드리는 선택지입니다.
gcloud는 만약 머신에 Cloud SDK가 설치되어 있다면 아래 gcloud 명령어를 이용해 쉽게 skaffold를 설치할 수 있습니다.
1
|
gcloud components install skaffold
|
cs |
그 외에 자세한 설치 방법은 이 페이지에서 볼 수 있습니다.
2. Trying Skaffold
설치 후 "Skaffold version" 명령어를 입력했을때 버전이 출력된다면 정상적으로 설치가 완료된 것입니다.
이제 간단한 예제 소스코드를 가지고 테스트 환경을 구성해보겠습니다.
환경을 구성하기 이전에 머신은 Kubernetes 클러스터에 접속할 수 있는 상태여야 합니다.
아래 명령어를 사용해 예제 코드를 로컬에 클론한 뒤 예제 소스가 있는 디렉토리로 이동합니다.
1
|
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold\examples\buildpacks |
cs |
디렉토리는 다음과 같은 구성요소들로 이루어져 있습니다. 하나씩 살펴보겠습니다.
- skaffold.yaml
- main.go
- go.mod
- k8s
ㄴweb.yaml
skaffold.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
apiVersion: skaffold/v2beta19
kind: Config
build:
artifacts:
- image: skaffold-buildpacks
buildpack:
builder: "gcr.io/buildpacks/builder:v1"
env:
- GOPROXY={{.GOPROXY}}
profiles:
- name: gcb
build:
googleCloudBuild: {}
|
cs |
skaffold.yaml은 Skaffold를 사용하기 위해서는 필수적으로 정의해야 하는 핵심 매니페스트입니다.
apiVersion : 사용할 Skaffold API 버전을 정의합니다.kind : "Config"
build : Skaffold가 아티팩트를 빌드할 방법을 정의합니다.
artifact : 빌드할 아티팩트를 정의합니다.
image : 아티팩트를 담을 레포지토리 경로를 정의합니다. 예제에 사용할 레포지토리로 변경해야 합니다.
bulidpack : 아티팩트를 빌드할때 buildpack를 사용할 것임을 명시합니다.
builder : buildpack에 사용할 builder를 정의합니다. 여기서는 Google의 builder를 사용합니다.
env : 전달할 변수를 지정합니다. go를 사용한 예제이므로 goproxy 변수를 전달합니다.
profiles : profiles를 정의합니다. profiles는 기존에 실행하던 구성과는 다른 context를 제공할 수 있습니다
name : profile 이름을 정의합니다. 사용할 profile을 지정할때 사용합니다.
build : 해당 profile은 기존의 "build" 과정을 대체합니다.
googleCloudBuild : 기존의 docker,gradle 등을 이용한 local build 대신 Cloud build에서 remote build를 진행합니다. Cloud build는 buildpack을 네이티브하게 지원합니다.
go.main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", hello)
log.Println("Listening on port 8080")
http.ListenAndServe(":8080", nil)
}
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!")
}
|
cs |
Kubernetes위에 돌아갈 소스 코드입니다. golang으로 짜여져 있으며 8080포트를 경로로 "Hello world!"를 반환하는 간단한 웹서버입니다.
web.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
apiVersion: v1
kind: Service
metadata:
name: web
spec:
ports:
- port: 8080
name: http
type: LoadBalancer
selector:
app: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: skaffold-buildpacks
ports:
- containerPort: 8080
|
cs |
kubernetes의 구성 요소를 정의한 매니페스트 파일입니다.
Hello world 웹 서버 컨테이너를 8080포트로 여는 Deployment와 이를 외부 IP로 노출하기 위한 Load balancer 를 정의하고 있습니다.
지금까지 소개한 Skaffold의 실행에 필요한 skaffold.yaml, 소스 코드인 main.go, Kubernetes 매니페스트인 web.yaml 3개의 파일만 있으면 Kubernetes 환경 구성에 필요한 모든 준비는 끝입니다.
3. Run Skaffold
이제 Skaffold로 위 요소들을 테스트하기 위한 개발 환경을 구성해보겠습니다.
정말 간단하게도 명령어 한번만으로 모든 구성이 완료됩니다.
개발 환경을 구성할 머신에서 "skaffold dev" 명령어를 입력합니다.
정상적으로 완료되었다면 kubernetes의 external ip:8080을 접속했을 때 "Hello world" 문자가 보일 것입니다.
이렇게 명령어 한번만으로 소스 코드 -> 이미지 빌드 -> 레포지토리 푸시 -> Kubernetes 구성 요소 생성에 이르는 모든 과정을 실행할 수 있습니다.
Dockerfile을 작성할 필요도, 복잡한 Task를 구성할 필요도 없이 기존에 사용하던 파일에 Skaffold.yaml만 추가함으로써 CI/CD 과정을 통합할 수 있는 것이 skaffold와 buildpack 구성의 장점입니다.
이제 skaffold의 기능을 하나씩 알아보겠습니다.
3-1. skaffold dev
"skaffold dev"는 skaffold로 개발 환경을 구성하기 위한 명령어입니다. 소스 코드 변경에 따른 결과를 테스트할때 용이합니다.
skaffold를 구동하고 있는 상황에서 아래와 같이 "Hello go!" 문자열을 반환하도록 기존의 소스 코드를 변경하고 저장하겠습니다.
소스 코드를 변경하는 순간 Skaffold가 이를 감지하고 새 이미지를 빌드 후 Kubernetes deployment에 반영합니다.
이렇게 코드의 변경에 따른 결과를 쉽고 빠르게 볼 수 있습니다.
3-2. Clean up
Skaffold는 "skaffold dev" 명령어를 이용해 구동했다면 Ctrl+C로 구동을 취소했을때 생성한 kubernetes 구성 요소들을 자동으로 삭제합니다.
이로써 테스트에 사용한 요소들을 일일이 삭제할 필요 없이 개발 환경을 쉽게 정리할 수 있습니다.
3-3. profiles
Skaffold는 profile을 사용해 다른 context에서 빌드를 수행할 수도 있습니다.
이미 skaffold.yaml에서 우리는 profile을 하나 명시했습니다.
profile을 사용해 skaffold를 실행하려면 "-p PROFILE_NAME" 플래그를 추가합니다.
기본값으로 skaffold에게 local build로 이미지를 빌드하라고 명시했지만 profile을 변경함으로써 Cloud build를 이용해서 remote build를 수행할 수 있습니다.
3. Conclusion
지금까지 Skaffold를 이용해서 buildpack과 함께 쉽고 빠른 Kubernetes CI/CD 개발 환경을 구성했습니다.
두 기술을 사용해서 우리는 2개의 매니페스트와 소스 코드만으로 Kubernetes 테스트 과정을 매우 빠르게 단축시킬 수 있었습니다.
Skaffold와 buildpack의 시너지로 Container packaging, Kubernetes resources, repository 등을 명시해야 하는 번거로운 기존의 빌드 타임을 획기적으로 단축할 수 있을 것입니다.
'Devops' 카테고리의 다른 글
Kubernetes에 존재하는 Metrics Server란 무엇일까? 그리고 어떻게 해야 잘 사용할 수 있을까? (1) | 2022.06.26 |
---|---|
Apache Kafka란? Apache Kafka를 Kubernetes에서 구성해보자 (1) | 2022.06.16 |
Mysql Operator로 Kubernetes 환경에서 Mysql DB 운영하기 (3) | 2022.05.31 |
오픈소스 컨테이너 레지스트리 Harbor로 컨테이너 레지스트리 간 복제 수행하기 (0) | 2022.05.15 |
Gitlab CI/CD + Terraform 연동으로 IaaC 자동화 파이프라인 구축하기 (3) | 2021.05.30 |