1. 목표
Skaffold는 애플리케이션을 빌드, 푸시, 배포하는 워크플로를 처리하는 도구입니다. Skaffold를 사용하면 로컬 개발 작업공간을 손쉽게 구성하고 내부 개발 루프를 간소화하며 Kustomize 및 Helm과 같은 다른 도구와 통합하여 Kubernetes 매니페스트를 관리할 수 있습니다.
이 튜토리얼에서는 Skaffold의 핵심 개념을 살펴보고 이를 사용하여 내부 개발 루프를 자동화한 후 애플리케이션을 배포합니다.
실습할 내용은 다음과 같습니다.
- 로컬 개발을 위한 Skaffold 구성 및 사용 설정
- 간단한 golang 애플리케이션 빌드 및 실행
- Skaffold로 로컬 애플리케이션 배포 관리
- 매니페스트 렌더링 및 애플리케이션 배포
2. 시작하기 전에
작업공간 준비 중
- 다음 URL로 이동하여 Cloud Shell 편집기를 엽니다.
https://shell.cloud.google.com
서드 파티 쿠키를 허용합니다. '작동하지 않는 사이트'를 클릭합니다. ‘Allow Cookies(쿠키 허용)’를 클릭합니다.
- 아직 하지 않았다면 터미널 창에서 다음 명령어를 사용하여 애플리케이션 소스를 클론합니다.
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
도구는 일반적인 구성요소 YAML 파일 세트 (base
디렉터리 아래)를 하나 이상의 '오버레이'와 결합하여 Kubernetes 매니페스트를 생성하는 기능을 제공합니다. 일반적으로 dev, test, staging, production 등의 배포 대상에 해당합니다.
이 예에서는 dev, staging, prod라는 3개의 대상에 대한 2개의 오버레이를 볼 수 있습니다. 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분 정도 소요될 수 있습니다. 그런 다음 애플리케이션 출력이 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에서 이미지를 다시 빌드하고 클러스터에 재배포하며 출력의 변경사항은 터미널 창에 표시됩니다.
- 이제 'app > main.go" IDE 창에서 다음 줄을 변경합니다.
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
프로필이 배포에 두 개의 복제본이 있어야 한다고 지정하므로 서로 다른 두 개의 포드 이름이 표시됩니다.
프로덕션에 배포하기
- 이제 다음 명령어를 실행하여
prod
프로필을 사용하여 출시 버전을 배포합니다.
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
배포가 완료되면 다음과 비슷한 3개의 포드에서 출력이 표시됩니다.
[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