1. 목표
Skaffold는 애플리케이션 빌드, 푸시, 배포를 위한 워크플로를 처리하는 도구입니다. Skaffold를 사용하면 로컬 개발 작업공간을 쉽게 구성하고, 내부 개발 루프를 간소화하고, Kustomize 및 Helm과 같은 다른 도구와 통합하여 Kubernetes 매니페스트를 관리할 수 있습니다.
이 튜토리얼에서는 Skaffold의 몇 가지 핵심 개념을 살펴보고, 이를 사용하여 내부 개발 루프를 자동화한 다음 애플리케이션을 배포합니다.
실습할 내용은 다음과 같습니다.
- 로컬 개발을 위해 Skaffold 구성 및 사용 설정
- 간단한 Go 애플리케이션 빌드 및 실행
- Skaffold로 로컬 애플리케이션 배포 관리
- 매니페스트를 렌더링하고 애플리케이션 배포
2. 시작하기 전에
작업공간 준비
- 다음 URL을 방문하여 Cloud Shell 편집기를 엽니다.
https://shell.cloud.google.com
서드 파티 쿠키를 허용합니다. '사이트가 작동하지 않음'을 클릭한 다음 '쿠키 허용'을 클릭합니다.


- 아직 하지 않았다면 터미널 창에서 다음 명령어를 사용하여 애플리케이션 소스를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- 클론된 저장소 디렉터리로 변경합니다.
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- 다음 명령어를 실행하여 Cloud Shell 작업공간을 현재 디렉터리로 설정합니다.
cloudshell workspace .
프로젝트 준비
- 다음 명령어를 실행하여 Google Cloud 프로젝트가 올바르게 설정되었는지 확인합니다.
gcloud config set project {{project-id}}
3. Skaffold 시작하기
- 다음 명령어를 실행하여 최상위 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
- IDE 창에서
skaffold.yaml파일을 엽니다. Skaffold 파이프라인을 정의하는 최상위 구성 파일입니다.
Kubernetes와 유사한 YAML 형식과 YAML의 다음 섹션을 확인합니다.
builddeployprofiles
이 섹션에서는 애플리케이션을 빌드하고 배포하는 방법과 각 배포 타겟의 프로필을 정의합니다.
Skaffold 단계의 전체 목록에 대한 자세한 내용은 Skaffold 파이프라인 단계 문서를 참고하세요.
4. 빌드
build 섹션에는 애플리케이션을 빌드하는 방법을 정의하는 구성이 포함되어 있습니다. 이 경우 git 태그를 처리하는 방법의 구성과 애플리케이션을 구성하는 컨테이너 이미지를 정의하는 artifacts 섹션을 확인할 수 있습니다.
이 섹션에서는 이미지를 빌드하는 데 사용되는 Dockerfile에 대한 참조도 확인할 수 있습니다. Skaffold는 Jib, Maven, Gradle, 클라우드 네이티브 Buildpacks, Bazel, 맞춤 스크립트와 같은 다른 빌드 도구도 지원합니다. 이 구성에 관한 자세한 내용은 Skaffold 빌드 문서를 참고하세요.
5. 배포
deploy 섹션에는 애플리케이션을 배포하는 방법을 정의하는 구성이 포함되어 있습니다. 이 경우 Skaffold가 Kustomize 도구를 사용하도록 구성하는 기본 배포의 예를 확인할 수 있습니다.
Kustomize 도구는 base 디렉터리 아래의 공통 구성요소 YAML 파일 집합을 하나 이상의 배포 타겟 (일반적으로 dev, test, staging, production 등)에 해당하는 하나 이상의 '오버레이'와 결합하여 Kubernetes 매니페스트를 생성하는 기능을 제공합니다.
이 예시에서는 dev, staging, prod의 세 가지 타겟에 대한 두 개의 오버레이를 확인할 수 있습니다. dev 오버레이는 로컬 개발 중에 사용되고 staging 및 prod 오버레이는 Skaffold를 사용하여 배포할 때 사용됩니다.
6. 프로필
profiles 섹션에는 다양한 컨텍스트의 빌드, 테스트, 배포 구성을 정의하는 구성이 포함되어 있습니다. 일반적으로 서로 다른 컨텍스트는 애플리케이션 배포 파이프라인의 서로 다른 환경입니다(예: 이 예의 staging 또는 prod). 즉, 상용구 구성을 반복하지 않고도 타겟 환경마다 내용이 달라야 하는 매니페스트를 쉽게 관리할 수 있습니다.
profiles 섹션의 구성은 기본 구성 (예: build, test 또는 deploy 섹션)의 항목을 대체하거나 패치할 수 있습니다.
이 예로 overlays > prod > deployment.yaml 파일을 엽니다. 여기에서 애플리케이션의 복제본 수가 3으로 구성되어 기본 구성을 재정의합니다.
애플리케이션 소스 코드를 탐색합니다.
- IDE 창에서
app > main.go파일을 엽니다.stdout에 매초 문자열을 쓰는 간단한 golang 애플리케이션입니다. - 애플리케이션이 실행 중인 Kubernetes 포드의 이름도 출력됩니다.
Dockerfile 보기
- IDE 창에서
app > Dockerfile파일을 엽니다. 이 파일에는main.go파일의 애플리케이션 컨테이너 이미지를 빌드하는 일련의 지시어가 포함되어 있으며 최상위skaffold.yaml파일에서 참조됩니다.
7. Skaffold로 개발
Kubernetes 환경 구성
- 다음 명령어를 실행하여 로컬 Kubernetes 클러스터가 실행되고 구성되었는지 확인합니다.
minikube start
몇 분 정도 걸릴 수 있습니다. 클러스터가 성공적으로 시작되면 다음과 같은 출력이 표시됩니다.
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- 다음 명령어를 실행하여
dev,staging,prod의 Kubernetes 네임스페이스를 만듭니다.
kubectl apply -f namespaces.yaml
다음과 같은 출력이 표시됩니다.
namespace/dev created namespace/staging created namespace/prod created
로컬 개발에 Skaffold 사용
- 다음 명령어를 실행하여 애플리케이션을 빌드하고 Cloud Shell에서 실행되는 로컬 Kubernetes 클러스터에 배포합니다.
skaffold dev
애플리케이션 컨테이너 빌드 프로세스가 실행됩니다. 이 프로세스는 1분 정도 걸릴 수 있으며 애플리케이션 출력이 매초 반복됩니다.
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
정확한 포드 이름은 위에 제공된 일반 출력과 다를 수 있습니다.
애플리케이션 변경
이제 애플리케이션이 로컬 Kubernetes 클러스터에서 실행되므로 코드를 변경하면 Skaffold가 애플리케이션을 자동으로 다시 빌드하고 클러스터에 재배포합니다.
- IDE 창에서
app > main.go파일을 열고 출력 문자열을 변경합니다.
"Hello world from pod %s!\n"
다음과 같이 변경합니다.
"Hello Skaffold world from pod %s!\n"
변경이 완료되면 Skaffold가 이미지를 다시 빌드하고 클러스터에 다시 배포하며 터미널 창에 변경된 출력이 표시됩니다.
- 이제 IDE 창의 'app > main.go' 파일에서도 다음 줄을 변경합니다.
time.Sleep(time.Second * 1)
->
time.Sleep(time.Second * 10)
애플리케이션이 다시 빌드되고 다시 배포되며 출력 줄이 10초마다 한 번씩 표시됩니다.
Kubernetes 구성 변경
다음으로 Kubernetes 구성을 변경하면 Skaffold가 자동으로 다시 배포합니다.
- IDE에서
base > deployment.yaml파일을 열고 다음 줄을 변경합니다.
replicas: 1
->
replicas: 2
애플리케이션이 다시 배포되면 두 개의 포드가 실행됩니다. 각 포드의 이름은 서로 다릅니다.
- 이제
base > deployment.yaml파일에서 동일한 줄을 다음과 같이 변경합니다.
replicas: 1
포드 중 하나가 서비스에서 삭제되어 포드가 하나만 남은 것을 확인할 수 있습니다.
- 마지막으로 터미널 창에서
Ctrl-C를 눌러 Skaffold 로컬 개발을 중지합니다.
버전 자르기
다음으로 출시 이미지를 빌드하고 클러스터에 배포하여 출시를 만듭니다.
- 다음 명령어를 실행하여 출시 버전을 빌드합니다.
skaffold build --file-output artifacts.json
이 명령어는 필요한 경우 최종 이미지를 빌드하고 출시 세부정보를 artifacts.json 파일에 출력합니다.
Cloud Deploy와 같은 도구를 사용하여 클러스터에 배포하려는 경우 이 파일에는 출시 정보가 포함됩니다. 즉, 라이브로 가는 경로에서 아티팩트가 변경되지 않습니다.
- 다음 명령어를 실행하여
artifacts.json파일의 콘텐츠를 확인합니다.
cat artifacts.json | jq
파일에는 최종 배포에 사용될 이미지에 대한 참조가 포함되어 있습니다.
스테이징에 배포
- 다음 명령어를 실행하여
staging프로필을 사용하여 출시 버전을 배포합니다.
skaffold deploy --profile staging --build-artifacts artifacts.json --tail
배포가 완료되면 다음과 비슷한 두 포드의 출력이 표시됩니다.
[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
- 터미널 창에서 Ctrl-C를 눌러 Skaffold 출력을 중지합니다.
- 다음 명령어를 실행하여 클러스터에서 애플리케이션이 실행되는지 확인합니다.
kubectl get all --namespace staging
애플리케이션의 staging 프로필은 배포에 복제본이 두 개 있어야 한다고 지정하므로 서로 다른 두 개의 포드 이름이 표시됩니다.
프로덕션에 배포하기
- 이제 다음 명령어를 실행하여
prod프로필을 사용하여 출시를 배포합니다.
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
배포가 완료되면 다음과 비슷한 세 개의 포드에서 출력이 표시됩니다.
[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
- 터미널 창에서 Ctrl-C를 눌러 Skaffold 출력을 중지합니다.
애플리케이션의 prod 프로필은 배포에 복제본이 3개 있어야 한다고 지정하므로 3개의 개별 포드 이름이 표시됩니다.
- 다음 명령어를 실행하여 클러스터에서 애플리케이션이 실행되는지 확인합니다.
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에 대해 자세히 알아보세요.
삭제
- 다음 명령어를 실행하여 로컬 클러스터를 종료합니다.
minikube delete