Cloud deploy

skaffold의 렌더링을통해 쿠베네티스 환경 배포 관리

skaffold 란?

skkafold 는 BUILD,DEPLOY,RENDERING 하여 배포를 관리

skaffold rendering이란?

  • manifest를 rendering하여 Kubernetes deployment 환경에게 전달
  • rendring의 역할은 yaml파일의 value 값을 치환해 전달

예시

deployment.yaml 의 컨테이너 이미지 app-image라는 값을 쿠베네티스 배포 환경에서 실제 도커 허브의 저장소 위치로 변환시켜준다.
따라서 rendering시 우리는 이미지 경로를 skaffold에게 이미지 경로를 parameter값으로 넘겨준다.


apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-app
spec:
  template:
    spec:
      containers:
        - name: hello-world-apps
          image: app-image # <---- replace

rendering시 helm, kustomize 관리도구를 사용할 수 있다.
https://skaffold.dev/docs/renderers/

Cloud deploy 란?

Cloud deploy는 파이프라인, 타겟으로 구성이 되어있어 skaffold를 이용하여 쿠베네티스 환경에 배포한다.

  • 타겟은 배포되야할 워커 노드풀을 정한다
  • 파이프라인은 배포 대상,배포 전략을 정한다
  • 파이프라인,타겟(cloud-deploy)를 구성 하면 1 : N의 관계로 릴리즈라는것을 생성할수 있다.
  • 릴리즈를 통해 롤백 및 배포 관리를 한다.
  • 파이프라인에 profiles(skaffold.yaml에 설정)을 구분하여 target에 배포한다.

젠킨스 비유

  • GCP cloud deploy 파이프라인 - 젠킨스 job launcher
  • GCP Cloud deploy 릴리즈 - 젠킨스 job 히스토리

파이프라인, 타겟 구성하기

  1. clouddeploy.yaml 정의
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name:
 annotations:
 labels:
description: # 설명
suspended: #true: 릴리즈 재사용 금지 default: false
serialPipeline: # pipeline 정의 시작
 stages:
 - targetId: #아래 kind Target의 metadata.name 이 들어감
   profiles: [] # manifest profile 환경 skaffold -profile sandbox
# Deployment strategies
# One of:
#   standard:
#   canary:
# See the strategy section in this document for details.
   strategy:
     standard:
       verify: #배포 확인 skaffold.yaml verfiy스탠자 필요
       predeploy:
         actions: []
       postdeploy:
         actions: []
   deployParameters:
   - values:
     matchTargetLabels:
 - targetId:
   profiles: []
   strategy:
   deployParameters:
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name:
 annotations:
 labels:
description:
multiTarget:
 targetIds: []
deployParameters:
requireApproval:
#
# Runtimes
# one of the following runtimes:
gke:
 cluster:
 internalIp:
#
# or:
anthosCluster:
 membership:
#
# or:
run:
 location:
# (End runtimes. See documentation in this article for more details.)
#
executionConfigs:
- usages:
  - [RENDER | PREDEPLOY | DEPLOY | VERIFY | POSTDEPLOY]
  workerPool:
  serviceAccount:
  artifactStorage:
  executionTimeout:
  1. cloud deploy.yaml(pipeline, target) 배포 명령어 (https://cloud.google.com/sdk/gcloud/reference/deploy/apply)
    gcloud deploy apply --file=clouddeploy.yaml \ --region=asia-northeast3 \ --project={PROJECT_ID}

skaffold RENDERING 예제

  apiVersion: skaffold/v4beta7
  kind: Config
  metadata:
    name: helloworld-app
  profiles:
    - name: sandbox # cloud deploy stages profile과 동일시하기
      manifests:
        kustomize:
          paths:
            - overlays/sandbox
    - name: dev # cloud deploy stages profile과 동일시하기
      manifests:
        kustomize:
          paths:
            - overlays/dev
  manifests:
    kustomize:
      paths:
        - overlays/dev

  apiVersion: skaffold/v4beta6
  kind: Config
  manifests:
    helm:
      releases:
        - name: RELEASE_NAME
          chartPath: PATH_TO_HELM_CHART
          artifactOverrides:
            image: IMAGE_NAME

github action을 통한 Cloud deploy release 생성 명령어

cloud deploy create release-> cloud build -> skaffold를 통해 렌더링된 manifset -> 쿠베네티스 배포

      - name: Create release in Google Cloud Deploy
        run: |
          gcloud deploy releases create r-${{ inputs.service-name }}-api-${{ env.IMAGE_TAG }} \
                --skaffold-file ${{ inputs.skaffold-file-path }} \
                --delivery-pipeline ${{ inputs.delivery-pipeline }} \
                --to-target ${{ inputs.env }} \
                --region ${{ inputs.location }} \
                --annotations commitId=${{ github.sha }} \
                --images app-image=${{ inputs.base-app-image }}/${{ inputs.service-name }}/api:${{ env.IMAGE_TAG }}

참고자료

https://cloud.google.com/deploy/docs/using-skaffold?hl=ko#how_does_use_skaffold

Cloud Deploy에서 Skaffold는 어떻게 사용되나요?

  • 출시 버전을 만들 때 컨테이너 이미지에 대한 렌더링 소스 및 참조가 Cloud Deploy로 전달됩니다.
  • 출시 버전을 만들 때 Cloud Deploy는 Cloud Build를 호출하고, Cloud Build는 다시 skaffold diagnose 및 skaffold render를 호출해서 해당 렌더링 소스 및 이미지를 사용하여 매니페스트를 렌더링합니다.

+ Recent posts