참고: 해당 내용은 아래 내용을 따라하다가 안되는 부분이 있을 것 같아서 상세히 풀어서 설명합니다.
(제가 따라해보다가 생각보다 바로바로 안되서 쓰는거에요. 다만, 이글을 보기전에 아래 포스팅을 한번 보고 오셔도 좋을듯 합니다.)
https://towardsdatascience.com/kubernetes-local-development-the-correct-way-1bc4b11570d8
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를 통해서 효율적으로 일해보자!