1. 목표
Skaffold는 애플리케이션 빌드, 푸시, 배포를 위한 워크플로를 처리하는 도구입니다. Skaffold를 사용하면 로컬 개발 워크스페이스를 쉽게 구성하고, 내부 개발 루프를 간소화하며, Kustomize 및 Helm과 같은 다른 도구와 통합하여 Kubernetes 매니페스트를 관리할 수 있습니다.
이 튜토리얼에서는 Skaffold의 핵심 개념을 살펴보고 이를 사용하여 내부 개발 루프를 자동화한 후 애플리케이션을 배포합니다.
실습할 내용은 다음과 같습니다.
- 로컬 개발을 위해 Skaffold 구성 및 사용 설정
- 간단한 Golang 애플리케이션 빌드 및 실행
- 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의 다음 섹션에 주목하세요.
build
deploy
profiles
이 섹션에서는 애플리케이션을 빌드하고 배포하는 방법과 각 배포 대상의 프로필을 정의합니다.
Skaffold 파이프라인 단계 문서에서 Skaffold 단계의 전체 목록에 관해 자세히 알아보세요.
4. 빌드
build
섹션에는 애플리케이션을 빌드하는 방법을 정의하는 구성이 포함되어 있습니다. 이 경우 git
태그를 처리하는 방식에 관한 구성과 애플리케이션을 구성하는 컨테이너 이미지를 정의하는 artifacts
섹션을 확인할 수 있습니다.
뿐만 아니라 이 섹션에서는 이미지를 빌드하는 데 사용되는 Dockerfile
참조를 확인할 수 있습니다. Skaffold는 Jib
, Maven
, Gradle
, 클라우드 네이티브 Buildpacks
, Bazel
, 맞춤 스크립트와 같은 다른 빌드 도구도 지원합니다. 이 구성에 관한 자세한 내용은 Skaffold 빌드 문서를 참고하세요.
5. 배포
deploy
섹션에는 애플리케이션을 배포하는 방법을 정의하는 구성이 포함됩니다. 이 경우 Kustomize
도구를 사용하도록 Skaffold를 구성하는 기본 배포의 예를 확인할 수 있습니다.
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
를 엽니다. 1초마다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분 정도 소요될 수 있음). 그런 다음 애플리케이션 출력이 1초마다 반복됩니다.
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
정확한 pod 이름은 위에 표시된 일반 출력과 다를 수 있습니다.
애플리케이션 변경
이제 애플리케이션이 로컬 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)
to
time.Sleep(time.Second * 10)
다시 애플리케이션이 다시 빌드되고 배포되어 출력 줄이 10초마다 한 번씩 표시됩니다.
Kubernetes 구성 변경
그런 다음 Kubernetes 구성을 변경합니다. 그러면 Skaffold가 자동으로 다시 배포됩니다.
- IDE에서
base > deployment.yaml
파일을 열고 다음 줄을 변경합니다.
replicas: 1
to
replicas: 2
애플리케이션이 다시 배포되면 실행 중인 포드가 두 개 표시되며 각각의 이름이 다릅니다.
- 이제
base > deployment.yaml
파일에서 동일한 줄을 다시 다음과 같이 변경합니다.
replicas: 1
서비스에서 포드 중 하나가 제거되어 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
프로필이 배포에 2개의 복제본이 있어야 한다고 지정하므로 서로 다른 두 개의 포드 이름이 표시됩니다.
프로덕션에 배포하기
- 이제 다음 명령어를 실행하여
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