Cloud Deploy에서 매니페스트 관리

이 페이지에서는 배포 파이프라인에서 각 대상에 대해 구성을 렌더링하도록 Google Cloud Deploy를 구성하는 방법을 설명합니다.

Cloud Deploy는 Skaffold를 사용해서 Kubernetes 매니페스트를 렌더링합니다. 이 서비스는 원시 매니페스트 렌더링 및 Helm, Kustomize, kpt와 같은 고급 매니페스트 관리 도구를 지원합니다.

렌더링 프로세스에는 두 가지 스테이지가 포함됩니다.

  1. 매니페스트 관리 도구는 매니페스트를 생성합니다.

  2. Skaffold는 매니페스트의 이미지 참조를 출시 버전에서 배포하려는 이미지로 바꿉니다.

이 페이지에는 Helm 및 Kustomize를 사용하는 구성 예시가 포함되어 있습니다.

Skaffold를 사용하여 구성 생성

Skaffold 구성 파일(skaffold.yaml)아직 없으면 Skaffold를 사용해서 저장소에 있는 항목에 따라 파일을 생성할 수 있습니다.

  1. Google Cloud CLI를 사용하여 Skaffold를 설치합니다.

    gcloud components install skaffold

  2. 매니페스트가 포함된 저장소에서 skaffold init를 실행합니다.

    skaffold init --skip-build

이 명령어는 저장소에서 skaffold.yaml 파일을 만듭니다. 이 파일은 해당 저장소에 있는 매니페스트를 참조합니다. 콘텐츠는 다음과 같습니다.

apiVersion: skaffold/v4beta7
kind: Config
metadata:
  name: sample-app
manifests:
  rawYaml:
    - k8s-manifests/deployment.yaml
    - k8s-manifests/rbac.yaml
    - k8s-manifests/redis.yaml
    - k8s-manifests/service.yaml

원시 매니페스트 렌더링

원시 매니페스트는 Helm 또는 Kustomize와 같은 도구에서 관리되지 않는 매니페스트입니다. 따라서 클러스터에 배포 및 하이드레이션되기 전 사전 처리가 필요하지 않습니다.

기본적으로 Cloud Deploy는 skaffold render를 사용해서 Kubernetes 매니페스트를 렌더링하고 태그 지정되지 않은 이미지 이름을 배포하려는 컨테이너 이미지의 태그 지정된 이미지 이름으로 바꿉니다. 그런 후 출시 버전을 승격할 때 Cloud Deploy는 skaffold apply를 사용해서 매니페스트를 적용하고 이미지를 Google Kubernetes Engine 클러스터에 배포합니다.

기본 구성에서 manifests 스탠자는 다음과 같습니다.

manifests:
  rawYaml:
    - PATH_TO_MANIFEST

여기에 전달할 수 있는 값에 대한 자세한 내용은 Skaffold 문서를 참조하세요.

Helm을 사용하여 렌더링

Cloud Deploy를 사용해서 Helm 차트를 렌더링할 수 있습니다. 이렇게 하려면 Skaffold 프로필의 deploy 스탠자에 Helm 차트 세부정보를 포함합니다.

이러한 각 정의는 다음과 같습니다.

apiVersion: skaffold/v4beta7
kind: Config
manifests:
  helm:
    releases:
      - name: RELEASE_NAME
        chartPath: PATH_TO_HELM_CHART

각 항목의 의미는 다음과 같습니다.

RELEASE_NAME은 이 출시 버전에 대한 Helm 차트 인스턴스의 이름입니다.

PATH_TO_HELM_CHART는 패키지된 Helm 차트 또는 압축해제된 Helm 차트 디렉터리에 대한 로컬 경로입니다.

Skaffold 문서에 설명된 대로 추가 Helm 구성 옵션을 사용할 수 있습니다.

Kustomize를 사용하여 렌더링

Cloud Deploy에 Kustomize를 사용할 수 있습니다. 이렇게 하려면 skaffold.yaml 프로필 구성의 deploy 스탠자 내에서 Kustomization 파일을 가리킵니다.

skaffold.yaml의 각 해당 profile 아래에서 Kustomize를 사용 중인 각 대상에 대해 개별 Kustomize 구성을 포함합니다.

이러한 각 정의는 다음과 같습니다.

apiVersion: skaffold/v4beta7
kind: Config
manifests:
  kustomize:
    paths:
      - PATH_TO_KUSTOMIZE

각 항목의 의미는 다음과 같습니다.

PATH_TO_KUSTOMIZE는 Kustomization 파일을 가리킵니다. 기본값은 ["."]입니다.

Skaffold 문서에 설명된 대로 추가 Kustomize 구성 옵션을 사용할 수 있습니다.

대상별로 다른 매니페스트 구성

각 대상에는 약간씩 다른 구성이 필요한 경우가 많습니다. 예를 들어 스테이징 배포에서보다 프로덕션 배포에 더 많은 복제본이 포함될 수 있습니다.

각 변형을 서로 다른 Skaffold 프로필로 제공하여 각 대상에 대해 서로 다른 매니페스트 집합을 렌더링할 수 있습니다.

원시 매니페스트를 사용하는 프로필

원시 매니페스트를 사용할 때는 대상에 따라 서로 다른 파일에서 Cloud Deploy를 연결할 수 있습니다. 다음과 같이 구성할 수 있습니다.

apiVersion: skaffold/v4beta7
kind: Config
profiles:
  - name: prod
    manifests:
      rawYaml:
        - prod.yaml
  - name: staging
    manifests:
      rawYaml:
        - staging.yaml

Kustomize를 사용하는 프로필

Kustomize를 사용하는 스테이징 및 프로덕션에 대해 서로 다른 프로필이 포함되어 각 프로필이 서로 다른 Kustomization에 연결되는 예시 skaffold.yaml은 다음과 같습니다.

apiVersion: skaffold/v4beta7
kind: Config
profiles:
  - name: prod
    manifests:
      kustomize:
        paths:
          - environments/prod
  - name: staging
    manifests:
      kustomize:
        paths:
          - environments/staging

전달 파이프라인에 참조되는 프로필

skaffold.yaml에 정의된 이러한 프로파일은 대상별로 전달 파이프라인 구성에서 참조됩니다.

serialPipeline:
  stages:
  - targetId: staging-target
    profiles:
    - staging
  - targetId: prod-target
    profiles:
    - prod

출시를 만들 때 특정 이미지 대체

매니페스트는 이미지 이름에 자리표시자를 사용할 수 있으며, 출시를 만들 때 이를 대체할 수 있습니다.

다음은 이미지 자리표시자가 있는 매니페스트의 예입니다.

apiVersion: v1
kind: Deployment
metadata:
  name: getting-started
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: my-app-image

출시를 만들 때 --images= 플래그를 사용하여 배포할 특정 이미지를 식별할 수 있습니다. 예를 들어 다음 명령어는 출시를 만들고 자리표시자 이름을 SHA 한정 이미지 이름으로 대체합니다.

gcloud deploy releases create test-release-001 \
  --project=test-gke-using-deployment \
  --region=us-central1 \
  --delivery-pipeline=my-gke-demo-app-1 \
  --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

이제 렌더링된 매니페스트에는 my-app-image 대신 지정된 이미지에 대한 참조가 있습니다.

다음 단계