Cloud Deploy에서 Skaffold 시작하기

이 문서에서는 다음을 포함하여 Cloud Deploy의 일부로 Skaffold를 사용하는 방법을 설명합니다.

  • Cloud Deploy 배송 파이프라인에서 사용할 Skaffold 구성
  • Helm 및 Kustomize와 같은 서드 파티 렌더링 도구로 Skaffold 및 Google Cloud Deploy 사용
  • 로컬 개발에 Skaffold 사용(선택사항)
  • (선택사항) 지속적 통합 및 지속적 배포(CI/CD)를 위해 Skaffold 사용

Skaffold를 사용해야 하는 이유

Cloud Deploy에서 Skaffold를 사용하는 이유와 Skaffold 구성을 관리해야 하는 이유를 알고 싶다면 읽어보세요.

CI/CD를 사용해 본 경험이 있지만 현재 Skaffold를 사용하지 않는 경우

Skaffold는 개발자 생산성을 개선하기 위한 오픈소스 명령줄 도구입니다. 지속적 개발, 지속적 통합(CI), 지속적 배포(CD)를 조정합니다.

Skaffold는 플러그인 가능한 아키텍처를 사용해 이식성이 뛰어난 선언적 구성을 제공하므로 렌더링 단계에 다양한 도구를 사용할 수 있습니다.

출시 버전이 생성되면 Cloud Deploy가 매니페스트를 렌더링하기 위해 Skaffold를 호출합니다. 배포 시 Cloud Deploy는 Skaffold를 다시 호출하여 애플리케이션을 배포할 매니페스트를 진행 중인 대상에 적용합니다. 배포 후 Skaffold는 상태 점검을 수행하여 대상 런타임에서 배포가 성공했는지 모니터링합니다.

지속적 개발을 위한 Skaffold

지속적 개발을 위한 Skaffold를 사용할 때는 코드를 변경할 때 이미지가 빌드 및 테스트되고 클러스터(또는 Minikube)에 배포됩니다. VS Code용 Cloud CodeIntelliJ용 Cloud Code IDE 확장 프로그램에서 Skaffold를 Visual Studio Code 및 JetBrains IDE에 통합하여 지속적 개발을 지원합니다.

지속적 배포를 위한 Skaffold

빌드, 배포, 렌더링, 적용 단계에서 지속적 배포에 Skaffold를 사용할 수도 있습니다. Cloud Deploy는 Skaffold의 렌더링 및 적용 기능을 사용합니다. Cloud Deploy를 사용하려면 적어도 유효한 skaffold.yaml 구성 파일이 있어야 합니다.

Skaffold를 통해 HelmKustomize와 같은 서드 파티 매니페스트 관리 도구와 통합할 수도 있습니다. 이 방식으로 Skaffold를 사용하면 이러한 도구 기능을 사용해서 매니페스트를 렌더링할 수 있습니다. kubectl이 이러한 매니페스트의 배포자로 유지됩니다.

Kubernetes 배포가 처음인 경우

Skaffold를 사용하면 모든 배포의 기본 매니페스트 집합을 구성한 다음 Cloud Deploy를 통해 Skaffold의 렌더링 엔진을 사용하여 기본 매니페스트 중 하나의 각 배포별 매니페스트를 렌더링한 후 배포할 수 있습니다.

Skaffold 및 Cloud Deploy를 Helm 및 Kustomize와 같은 일반적인 매니페스트 템플릿 도구와 함께 사용하는 예시가 포함된 매니페스트 관리에서 자세한 내용을 알아봅니다.

Cloud Deploy 작동에 필요한 사항

기본 Cloud Deploy 배포 파이프라인을 사용하려면 skaffold.yaml 구성 파일에 최소한 다음 구성이 필요합니다.

  • 모든 skaffold.yaml 구성에 필요한 헤더 정보는 다음과 같습니다.

    apiVersion: skaffold/v4beta7
    kind: Config
    
  • 모든 원시 Kubernetes 매니페스트를 나열하는 GKE, GKE Enterprise 또는 Cloud Run용 manifests 스탠자(Helm 또는 Kustomize와 같은 매니페스트 관리 도구를 사용하지 않는 경우)

    다음은 원시 Kubernetes 매니페스트를 사용하는 예시입니다.

    manifests:
      rawYaml:
      - deployment.yaml
    

    렌더기(Helm 또는 Kustomize)를 사용하여 매니페스트를 렌더링하려는 경우 이러한 도구를 사용하도록 Skaffold를 구성하는 방법에 대한 안내는 skaffold.yaml에 Helm 지원 추가skaffold.yaml에 Kustomize 지원 추가를 참조하세요.

    Helm 및 Kustomize 예시는 매니페스트 관리를 참조하세요.

  • GKE 또는 GKE Enterprise에 배포하기 위한 deploy.kubectl 또는 Cloud Run에 배포하기 위한 deploy.cloudrun을 사용하는 deploy 스탠자입니다.

    GKE 및 GKE Enterprise 대상:

    deploy:
      kubectl: {}
    

    배포 스탠자는 매니페스트 스탠자에 제공된 애플리케이션 매니페스트를 배포합니다.

    Cloud Run 대상:

    deploy:
      cloudrun: {}
    

    배포 스탠자는 매니페스트 스탠자에 제공된 애플리케이션 매니페스트를 배포합니다.

커스텀 대상을 사용하는 경우 skaffold.yaml에 헤더(apiVersionkind:)와 커스텀 대상 유형에서 여전히 원격 Skaffold 구성을 참조하지 않는 경우에 커스텀 대상에서 사용할 커스텀 작업이 있어야 합니다.

skaffold.yaml 파일 만들기

Cloud Deploy는 Skaffold를 사용하여 애플리케이션을 렌더링하고 배포합니다.

출시 버전마다 최소한 사용할 매니페스트를 식별하는 skaffold.yaml 파일을 제공해야 합니다. 이 파일에 필요한 항목에 대한 안내는 이전 섹션을 참조하세요.

Cloud Deploy에서 skaffold.yaml을 생성하도록 합니다.

skaffold.yaml 파일이 없고 단일 Kubernetes 매니페스트 또는 Cloud Run 서비스 정의 파일이 있으면 Cloud Deploy가 skaffold.yaml 파일을 생성할 수 있습니다.

생성된 Skaffold 파일은 출시 버전이 완료된 후 Cloud Storage 소스 스테이징 디렉터리에서 사용할 수 있습니다.

다음 명령어는 Kubernetes 매니페스트를 전달하는 --from-k8s-manifest 플래그를 포함합니다. Cloud Deploy는 매니페스트의 정보를 사용하여 skaffold.yaml을 생성한 후 출시 버전에 사용합니다.

gcloud deploy releases create  RELEASE_NAME --delivery-pipeline=PIPELINE_NAME --from-k8s-manifest=MANIFEST --region=REGION

Cloud Run 서비스 YAML에서 skaffold.yaml을 생성하려면 동일한 명령어를 사용하되, --from-k8s-manifest 대신 --from-run-manifest를 사용합니다.

이러한 플래그 중 하나를 --skaffold-file 플래그 또는 --source 플래그와 함께 사용하면 오류가 발생합니다.

생성된 skaffold.yaml 파일 사용

생성된 skaffold.yaml은 Cloud Deploy의 온보딩, 학습, 데모에 적합합니다. Cloud Deploy와 프로덕션 워크로드에 익숙해진 다음에는 대상 간에 차별화된 Skaffold 구성을 원할 수 있습니다(Skaffold 프로필 사용).

생성된 skaffold.yaml 파일을 구분된 자체 Skaffold 구성을 만들기 위한 시작점으로 사용할 때는 렌더링된 파일이 아닌 렌더링 소스 보관 파일의 파일을 사용해야 합니다. 렌더링 소스는 **출시 버전 세부정보 ** 페이지의 아티팩트 탭에서 다운로드할 수 있습니다.

  • 생성된 skaffold.yaml은 Cloud Storage 버킷에 저장된 렌더링 소스에 포함됩니다.

    .tar.gz 파일을 다운로드하고 추출하면 이 파일을 볼 수 있습니다.

  • 렌더링된 skaffold.yaml대상 아티팩트에서 사용할 수 있습니다.

    대상 아티팩트 섹션에서 아티팩트 보기를 클릭합니다.

    렌더링 소스 및 대상 아티팩트를 보여주는 출시 버전 세부정보 페이지

로컬 개발에 Skaffold 사용

Skaffold의 장점 중 하나는 로컬 개발 및 CI/CD에 사용할 수 있다는 것입니다. dev 모드에서 Skaffold는 소스 파일을 감시하며 변경사항이 감지되면 Skaffold에서 이미지를 재빌드하고 다시 테스트하고 로컬 머신의 Minikube 클러스터(예: 컨테이너)에 다시 배포합니다.

이런 방식으로 Skaffold를 사용하는 경우 원격 배포와 동일한 명령어를 로컬에서 사용할 수 있습니다.

로컬 개발에 Skaffold를 사용하는 경우 대상에 별도의 Skaffold 프로필을 정의하고 로컬 개발을 위한 기본 배포 스탠자를 정의할 수 있습니다.

dev 모드를 중지하면 Skaffold가 클러스터에서 배포된 아티팩트를 삭제합니다.

CI/CD에 Skaffold 사용

지속적 로컬 빌드 및 배포에 Skaffold를 사용하는 것 외에도 CI/CD에 Skaffold를 사용할 수 있습니다. Cloud Deploy는 Cloud Build와 같은 CI 도구 및 Artifact Registry와 같은 이미지 레지스트리를 사용하여 빌드된 컨테이너 이미지를 고려해서 Skaffold에서 CI/CD 기능을 사용하여 매니페스트를 렌더링 및 적용하고 정의된 대상에 애플리케이션을 배포합니다.

렌더링, 배포, 적용

Skaffold는 매니페스트 렌더링 프로세스를 배포와 분리합니다. Cloud Deploy는 skaffold render를 호출하여 매니페스트를 렌더링하고 skaffold apply를 호출하여 대상에 적용합니다.

렌더링과 적용 사이의 이러한 구분을 통해 구성에서 애플리케이션의 전체 선언 상태를 캡처할 수 있으므로, 롤백 등을 위해 안전하고 반복 가능한 방식으로 적용할 수 있습니다. 이 기술을 사용하면 승인도 쉬워집니다. 첫 번째 롤아웃 전에 모든 대상에 대해 매니페스트가 렌더링되기 때문에 각 대상에 적용되는 렌더링된 YAML을 볼 수 있습니다.

Cloud Deploy는 다른 배포자를 사용한 애플리케이션 배포를 지원하지 않습니다. 하지만 렌더링에 Helm 또는 Kustomize와 같은 도구를 사용할 수 있습니다.

kubectl을 배포자로 사용하여 Cloud Deploy가 배포하는 방법에 대한 자세한 내용은 Cloud Deploy 서비스 아키텍처를 참조하세요.

Skaffold 프로필 정보

profiles: 스탠자에 skaffold.yaml로 식별되는 별도의 Skaffold 프로필을 만들 수 있습니다.

Cloud Deploy에서 Skaffold 프로필을 사용할 때는 대상 전체 또는 일부에 대해 별도의 프로필을 만들 수 있습니다. 예를 들어 dev, staging, prod의 프로필을 각기 다르게 만들 수 있습니다.

Cloud Deploy에서 Skaffold를 사용하는 데 프로필이 필요하지는 않지만 여러 대상의 매니페스트 맞춤설정을 정의하는 데 유용합니다(예: 대상별로 서로 다른 Kustomize kustomization.yaml 파일 사용).

skaffold.yaml에 Kustomize 지원 추가

Kustomize 구성을 Cloud Deploy/Skaffold 구성과 통합하는 과정은 다음과 같이 이루어집니다.

  1. 구성 파일 중에 kustomization.yaml 파일을 포함합니다.

    구성 파일을 로컬 디렉터리 또는 Cloud Storage 버킷에 저장할 수 있습니다.

  2. skaffold.yaml 파일에서 각 프로필에 대한 deploy 스탠자를 만듭니다.

    프로필을 사용하지 않거나 프로필에 연결되지 않은 기본 배포 구성을 사용하는 경우 정의된 프로필 외에 deploy 스탠자를 포함할 수도 있습니다.

    다음은 프로필당 deploy 스탠자를 표시하고 my-app이라는 가상 샘플 앱을 사용하는 Skaffold 구성 예시입니다.

    apiVersion: skaffold/v4beta7
    kind: Config
    build:
      artifacts:
        - image: my-app-web-profiles
          context: my-app-web-profiles
        - image: my-app-application-profiles
          context: my-app-application-profiles
      googleCloudBuild:
        projectId: ${PROJECT_ID}
    profiles:
    - name: local
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/local
    - name: test
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/test
    - name: staging
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/staging
    - name: prod
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/prod
    deploy:
      kubectl: {}
    

    여기에 표시된 Skaffold 구성에는 test, staging, prod 대상에 대해 별도의 프로필이 있습니다. 또한 로컬 개발에 대한 프로필을 보여줍니다. 각 프로필에는 해당 대상에 사용할 kustomization의 위치를 가리키는 경로가 있는 deploy.kustomize 스탠자가 있습니다.

skaffold.yaml에 Helm 지원 추가

Helm을 사용하여 매니페스트를 렌더링할 수 있습니다. Cloud Deploy는 Helm을 사용하여 애플리케이션을 배포하지 않으며 배포자로 kubectl만 지원합니다.

Helm을 사용하려면 skaffold.yaml 내에서 참조할 수 있는 어느 위치에든 저장된 하나 이상의 Helm 차트가 필요합니다. 이 위치는 파일 시스템, 저장소(skaffold.yaml과 함께 있을 수 있음) 또는 Open Container Initiative(OCI) 저장소에 있을 수 있습니다.

Helm 차트를 사용하려면 helm 스탠자를 skaffold.yaml 파일에 추가합니다.

apiVersion: skaffold/v4beta7
kind: Config
build:
  artifacts:
  - image: skaffold-helm-image
manifests:
  helm:
    releases:
    - name: skaffold-helm-image
      chartPath: charts
deploy:
  kubectl: {}

skaffold.yaml 참조에서 이 helm 스탠자에 필요한 사항을 보여줍니다.

지원되지 않는 Skaffold 기능

다음 Skaffold 기능은 Cloud Deploy에서 사용할 수 없습니다.

다음 단계

  • Skaffold 사이트를 방문해서 Skaffold의 작동 방식과 기능을 확인합니다.

  • Kustomize 및 Skaffold 프로필로 Cloud Deploy를 사용하는 것을 실습합니다.

  • Cloud Deploy에서 사용할 Skaffold 버전을 선택하는 방법, Skaffold 버전이 변경되는 경우, 사용 중인 버전을 확인하는 방법을 자세히 알아봅니다.

  • Helm, Kustomize, kpt와 같은 고급 매니페스트 관리 도구로 Skaffold 프로필을 사용하는 방법을 알아봅니다.