참고: 해당 내용은 아래 내용을 따라하다가 안되는 부분이 있을 것 같아서 상세히 풀어서 설명합니다.

(제가 따라해보다가 생각보다 바로바로 안되서 쓰는거에요. 다만, 이글을 보기전에 아래 포스팅을 한번 보고 오셔도 좋을듯 합니다.)


https://towardsdatascience.com/kubernetes-local-development-the-correct-way-1bc4b11570d8

 

Kubernetes Local Development: The Correct Way

The infinite loop of pain and suffering when developing on Kubernetes is a thing of the past.

towardsdatascience.com

 

1. Skaffold 란?

Skaffold는 개발자가 손쉽게 어플리케이션을 배포할 수 있는 도구이다.

예를 들어 어플리케이션 수정으로 반영된 내용이 K8S에 올려서 바로 테스트하고 싶을때도 사용할 수 있고, Helm Chart와 비슷하게 실제 테스팅 또는 프로덕션 환경에 배포할 수 있게 CD툴로도 사용할 수 있을듯 하다.

단, CD만 있어서는 실제 현업에서는 의미가 없으므로 CICD Workflow를 구성할 수 있는 다른 툴을 도입하는게 현실적이긴 하다.
(Google Teckton, Jenkins X, Gitlab runner, Spinnaker등등)

하지만! 로컬 환경 개발에 있어서 Skaffold만큼 매력적인 툴은 없을 듯 하다. 

더욱이 이전에 포스팅한 Lens와 같이 사용한다면 금상첨화이지 않을까?

(쿠버네티스 IDE LENS 설치 및 Docker for Desktop K8S 클러스터 연동)

각설하고, Skaffold 설치부터 간단한 go app (처음 따라하는 포스팅에 있는 내용임, 다시강조)을 설치해 보도록 하자.

 

2. Skaffold 설치

[Mac OS 기준]

필자가 Mac을 사용하므로 Mac OS 기준으로 설명하겠다.

(homebrew 는 패키지 관리자이다.)

brew install skaffold
skaffold version

 

3. Skaffold 기본 사용법

skaffold 기본 사용법은 아래와 같다. 더 자세한 내용은 Skaffold 홈페이지에서 확인하자.

  • skaffold init : skaffold를 사용하기 위해서는 일단 2가지는 있어야 한다.
    위 명령어를 수행하면 환경에 맞게 skaffold가 skaffold.yaml 파일(이름은 다를 수 있음)을 생성한다. (이 상태가 배포할 준비가 된 상태다)
    • Docker Image: 4번 과정에서 생성할 것이다.
    • pod.yaml: k8s 문법으로 pod배포하는 yaml을 생성해야 한다. deployment로 변경해도 상관 없을듯 하다. 
  • skaffold dev : 개발용으로 사용가능, 어플리케이션 변경사항을 감시하고 자동으로 배포 해준다.

4. Sample App 테스트

준비사항

  • simple app: go hello world
  • Dockerfile: 한번은 빌드 해서 이미지를 만들어 놔야 함
  • DockerImage: Dockerfile로 빌드한 결과물, 일종의 머신이미지와 비슷함
  • pod.yaml: k8s 문법에 따른 pod 명세 파일
  • skaffold.yaml : skaffold init 명령어를 통해 자동생성 된다.

아래 내용의 go 어플리케이션 (단순히 Hello world 어플리케이션임)

main.go

package main

import (
	"fmt"
	"time"
)

func main() {
	for {
		fmt.Println("Hello world!")

		time.Sleep(time.Second * 1)
	}
}

 

Dockerfile

FROM golang:1.12.9-alpine3.10 as builder
COPY main.go .
RUN go build -o /app main.go

FROM alpine:3.10
ENV GOTRACEBACK=single
CMD ["./app"]
COPY --from=builder /app .
  • 이글의 참조된 메일 블로그에서 필자가 빌더 패턴이라고 소개한 방법이다.
  • 신기한건 FROM이 2개가 있는데 이렇게 하면 이미지의 용량을 줄일 수 있다.
  • 실제 이미지로 사용하는것은 아래 FROM절인데 Docker는 각 명령어별로 레이어가 분리되므로 레이어 수를 줄일 수 있다.
  • 해당 패턴은 실무에서 적용하면 괜찮을 듯 하다.

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: getting-started
spec:
  containers:
  - name: getting-started
    image: skaffold-example
  • 간단한 k8s pod를 구성하는 명세 파일이다.
  • apiVersion: v1                                     - 각 명세 문법도 버전이 있으므로 v1, v2, v3 명시하는 것이다. (나중에 문법이 바뀔때를 대비)
  • kind: Pod                                            - 해당 명세가 Pod를 구성하는 명세임을 나타낸다.
  • metadata                                            - metadata는 일종의 이름표라고 볼 수 있다. (물론 label 문법이 따로 있긴 하다)
  • spec                                                    - 실제 컨테이너가 어떤식으로 구성되는지 정의한다.
  • containers                                          - 컨테이너를 정의
  • name                                                  - Pod 이름이다. (getting-started라는 Pod 1개가 나중에 생길 것이다)
  • image: skaffold-example                  - 어떤 도커 이미지를 참조할지를 정의한다. 여기서는 skaffold-example이라는 이미지를 참조 

따라서 우리는 도커 이미지를 미리 생성해야 한다.

(참조 블로그에서는 이 내용 설명이 안된것 같다. 너무 당연하다고 생각하는듯 ㅠ.ㅜ)

  • 먼저 디렉토리에 어떤 파일들이 있는지 확인했다. Dockerfile, main.go, pod.yaml파일이 나란히 들어 있다.

아래 명령어로 빌드후 이미지를 확인한다.

docker build -t skaffold-example .
docker images | grep skaffold

  • 이미지가 조회된다. (필자는 미리 만들어놨음)

아래 명령어로 skaffold.yaml을 생성한다.

skaffold init

  • 위와 같은 설정 파일이 생성된다고 표시하고 생성할건지 다시 묻는다. y 를 입력하고 엔터를 입력해 파일을 생성한다.

자 이제 Deploy의 시간이다!

아래 명령어를 통해서 deploy하자.

skaffold dev

  • skaffold dev 명령어를 통해 배포 했다.
  • 무한 for문으로 "Hello world!"를 찍게 했으므로 계속 출력된다.

Pod가 배포 되었는지는 K8S IDE인 LENS로 확인할 수 있다. (쿠버네티스 IDE LENS 설치 및 Docker for Desktop K8S 클러스터 연동 )

  • LENS를 통해서 현재 getting-started Pod가 Running 상태임을 확인할 수 있다.

그럼 기존 main.go에서 Hello world! 문구를 Hello Skaffold로 바꿔보자.

저장하고 로그를 확인하자

자동으로!! 다시 Docker Image를 빌드하고 Pod를 재배포한다. 그리고 로그는 Hello world!에서 Hello Skaffold! 로 변경되었다.

 

5. 정리

기존 복잡하고 힘든 K8S 앱개발을 Skaffold를 통해서 효율적으로 일해보자!

+ Recent posts