Skaffold 이해하기

1. 목표

Skaffold는 애플리케이션을 빌드, 푸시, 배포하는 워크플로를 처리하는 도구입니다. Skaffold를 사용하면 로컬 개발 작업공간을 손쉽게 구성하고 내부 개발 루프를 간소화하며 KustomizeHelm과 같은 다른 도구와 통합하여 Kubernetes 매니페스트를 관리할 수 있습니다.

이 튜토리얼에서는 Skaffold의 핵심 개념을 살펴보고 이를 사용하여 내부 개발 루프를 자동화한 후 애플리케이션을 배포합니다.

실습할 내용은 다음과 같습니다.

  • 로컬 개발을 위한 Skaffold 구성 및 사용 설정
  • 간단한 golang 애플리케이션 빌드 및 실행
  • Skaffold로 로컬 애플리케이션 배포 관리
  • 매니페스트 렌더링 및 애플리케이션 배포

2. 시작하기 전에

작업공간 준비 중

  1. 다음 URL로 이동하여 Cloud Shell 편집기를 엽니다.
https://shell.cloud.google.com

서드 파티 쿠키를 허용합니다. '작동하지 않는 사이트'를 클릭합니다. ‘Allow Cookies(쿠키 허용)’를 클릭합니다.

7b702066a2135a3d.png

3394f82132eb4fd4.png

  1. 아직 하지 않았다면 터미널 창에서 다음 명령어를 사용하여 애플리케이션 소스를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. 클론된 저장소 디렉터리로 변경합니다.
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. 다음 명령어를 실행하여 Cloud Shell 작업공간을 현재 디렉터리로 설정합니다.
cloudshell workspace .

프로젝트 준비

  1. 다음 명령어를 실행하여 Google Cloud 프로젝트가 올바르게 설정되었는지 확인합니다.
gcloud config set project {{project-id}}

3. Skaffold 시작하기

  1. 다음 명령어를 실행하여 최상위 Skaffold 구성 파일 skaffold.yaml를 만듭니다.
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. IDE 창에서 skaffold.yaml 파일을 엽니다. 이 파일은 Skaffold 파이프라인을 정의하는 최상위 구성 파일입니다.

Kubernetes와 유사한 YAML 형식과 YAML의 다음 섹션에 주목하세요.

  • build
  • deploy
  • profiles

이 섹션에서는 애플리케이션을 빌드하고 배포하는 방법과 각 배포 대상의 프로필을 정의합니다.

Skaffold 단계의 전체 목록은 Skaffold 파이프라인 단계 문서에서 확인할 수 있습니다.

4. 빌드

build 섹션에는 애플리케이션을 빌드하는 방법을 정의하는 구성이 포함되어 있습니다. 이 경우 git 태그를 처리하는 방법에 관한 구성과 애플리케이션을 구성하는 컨테이너 이미지를 정의하는 artifacts 섹션을 확인할 수 있습니다.

뿐만 아니라 이 섹션에서는 이미지를 빌드하는 데 사용되는 Dockerfile 참조를 확인할 수 있습니다. Skaffold는 Jib, Maven, Gradle, 클라우드 기반 Buildpacks, Bazel, 커스텀 스크립트와 같은 다른 빌드 도구를 추가로 지원합니다. 이 구성에 관한 자세한 내용은 Skaffold 빌드 문서를 참고하세요.

5. 배포

deploy 섹션에는 애플리케이션 배포 방법을 정의하는 구성이 포함되어 있습니다. 이 경우 Kustomize 도구를 사용하도록 Skaffold를 구성하는 기본 배포의 예를 확인할 수 있습니다.

Kustomize 도구는 일반적인 구성요소 YAML 파일 세트 (base 디렉터리 아래)를 하나 이상의 '오버레이'와 결합하여 Kubernetes 매니페스트를 생성하는 기능을 제공합니다. 일반적으로 dev, test, staging, production 등의 배포 대상에 해당합니다.

이 예에서는 dev, staging, prod라는 3개의 대상에 대한 2개의 오버레이를 볼 수 있습니다. dev 오버레이는 로컬 개발 도중에 사용되며, stagingprod 오버레이는 Skaffold를 사용하여 배포할 때 사용됩니다.

6. 프로필

profiles 섹션에는 다양한 컨텍스트의 빌드, 테스트, 배포 구성을 정의하는 구성이 포함되어 있습니다. 애플리케이션 배포 파이프라인에서 서로 다른 컨텍스트는 일반적으로 서로 다른 환경입니다(예: 이 예시의 staging 또는 prod). 즉, 상용구 구성을 반복하지 않고도 다양한 대상 환경마다 콘텐츠가 달라야 하는 매니페스트를 쉽게 관리할 수 있습니다.

profiles 섹션의 구성은 기본 구성의 항목 (예: build, test 또는 deploy 섹션)을 대체하거나 패치할 수 있습니다.

예를 들어 overlays > prod > deployment.yaml 파일을 엽니다. 여기에서 애플리케이션의 복제본 수가 3개로 구성되어 있으므로 기본 구성을 재정의합니다.

  1. IDE 창에서 app > main.go 파일을 엽니다. 이 파일은 매초 stdout에 문자열을 쓰는 간단한 golang 애플리케이션입니다.
  2. 애플리케이션은 실행 중인 Kubernetes 포드의 이름도 출력합니다.

Dockerfile 보기

  1. IDE 창에서 app > Dockerfile 파일을 엽니다. 이 파일에는 main.go 파일의 애플리케이션 컨테이너 이미지를 빌드하기 위한 일련의 지시어가 포함되어 있으며 최상위 skaffold.yaml 파일에서 참조됩니다.

7. Skaffold로 개발

Kubernetes 환경 구성

  1. 다음 명령어를 실행하여 로컬 Kubernetes 클러스터가 실행 및 구성되었는지 확인합니다.
minikube start

몇 분 정도 걸릴 수 있습니다. 클러스터가 성공적으로 시작되면 다음과 같은 출력이 표시됩니다.

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. 다음 명령어를 실행하여 dev, staging, prod의 Kubernetes 네임스페이스를 만듭니다.
kubectl apply -f namespaces.yaml

다음과 같은 출력이 표시됩니다.

namespace/dev created
namespace/staging created
namespace/prod created

로컬 개발에 Skaffold 사용

  1. 다음 명령어를 실행하여 애플리케이션을 빌드하고 Cloud Shell에서 실행되는 로컬 Kubernetes 클러스터에 배포합니다.
skaffold dev

애플리케이션 컨테이너 빌드 프로세스가 실행되는 것을 확인할 수 있으며 이 과정은 1분 정도 소요될 수 있습니다. 그런 다음 애플리케이션 출력이 1초마다 반복됩니다.

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

정확한 포드 이름은 위에 제공된 일반 출력과 다릅니다.

애플리케이션 변경

이제 애플리케이션이 로컬 Kubernetes 클러스터에서 실행되므로 코드를 변경할 수 있습니다. 그러면 Skaffold에서 자동으로 애플리케이션을 다시 빌드하고 클러스터에 재배포합니다.

  1. IDE 창에서 app > main.go 파일을 열고 출력 문자열을 변경합니다.
"Hello world from pod %s!\n"

다음과 같이 변경합니다.

"Hello Skaffold world from pod %s!\n"

변경하면 Skaffold에서 이미지를 다시 빌드하고 클러스터에 재배포하며 출력의 변경사항은 터미널 창에 표시됩니다.

  1. 이제 'app > main.go&quot; IDE 창에서 다음 줄을 변경합니다.
time.Sleep(time.Second * 1)

to

time.Sleep(time.Second * 10)

다시 애플리케이션이 다시 빌드되고 배포되어 출력 줄이 10초마다 한 번씩 표시됩니다.

Kubernetes 구성 변경

그런 다음 Kubernetes 구성을 변경합니다. 그러면 Skaffold가 자동으로 다시 배포됩니다.

  1. IDE에서 base > deployment.yaml 파일을 열고 줄을 변경합니다.
replicas: 1

to

replicas: 2

애플리케이션이 재배포되면 두 개의 포드가 실행되는 것을 볼 수 있습니다. 포드는 각각 이름이 다릅니다.

  1. 이제 base > deployment.yaml 파일의 동일한 줄을 다음으로 다시 변경합니다.
replicas: 1

서비스에서 포드 중 하나가 제거되어 1개만 남게 될 것입니다.

  1. 마지막으로 터미널 창에서 Ctrl-C를 눌러 Skaffold 로컬 개발을 중지합니다.

출시 버전 자르기

다음으로 출시 이미지를 빌드하고 클러스터에 배포하여 출시 버전을 만듭니다.

  1. 다음 명령어를 실행하여 출시 버전을 빌드합니다.
skaffold build --file-output artifacts.json

이 명령어는 최종 이미지를 빌드하고 (필요한 경우) 출시 세부정보를 artifacts.json 파일에 출력합니다.

Cloud Deploy와 같은 도구를 사용하여 클러스터에 배포하려면 이 파일에 출시 정보가 포함되어 있습니다. 즉, 활성 경로에서 아티팩트는 변경할 수 없습니다.

  1. 다음 명령어를 실행하여 artifacts.json 파일의 콘텐츠를 확인합니다.
cat artifacts.json | jq

파일에는 최종 배포에 사용할 이미지에 대한 참조가 포함되어 있습니다.

스테이징에 배포

  1. 다음 명령어를 실행하여 staging 프로필을 사용하여 출시 버전을 배포합니다.
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

배포가 완료되면 다음과 비슷한 두 포드의 출력이 표시됩니다.

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. 터미널 창에서 Ctrl-C를 눌러 Skaffold 출력을 중지합니다.
  2. 다음 명령어를 실행하여 애플리케이션이 클러스터에서 실행되는 것을 관찰합니다.
kubectl get all --namespace staging

애플리케이션의 staging 프로필이 배포에 두 개의 복제본이 있어야 한다고 지정하므로 서로 다른 두 개의 포드 이름이 표시됩니다.

프로덕션에 배포하기

  1. 이제 다음 명령어를 실행하여 prod 프로필을 사용하여 출시 버전을 배포합니다.
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

배포가 완료되면 다음과 비슷한 3개의 포드에서 출력이 표시됩니다.

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. 터미널 창에서 Ctrl-C를 눌러 Skaffold 출력을 중지합니다.

애플리케이션의 prod 프로필이 배포에 3개의 복제본이 있어야 한다고 지정하므로 3개의 고유한 포드 이름이 표시됩니다.

  1. 다음 명령어를 실행하여 애플리케이션이 클러스터에서 실행되는 것을 관찰합니다.
kubectl get all --namespace prod

프로덕션 배포를 보여주는 다음과 유사한 줄이 포함된 출력이 표시됩니다.

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

또한 3개의 애플리케이션 포드도 실행됩니다.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. 축하합니다.

축하합니다. Understanding Skaffold 실습을 완료하고 로컬 개발 및 애플리케이션 배포를 위해 Skaffold를 구성하고 사용하는 방법을 배웠습니다.

다음 단계:

계속해서 Skaffold에 관해 자세히 알아보세요.

삭제

  1. 다음 명령어를 실행하여 로컬 클러스터를 종료합니다.
minikube delete