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 히스토리
파이프라인, 타겟 구성하기
- 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:
- 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 예제
- skaffold을 통해 kustomize를 사용해 렌더링 예제 (https://skaffold.dev/docs/renderers/kustomize/)
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
- skkafold 를 통해 helm을 사용해서 렌더링 예제(https://skaffold.dev/docs/renderers/helm/)
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를 호출해서 해당 렌더링 소스 및 이미지를 사용하여 매니페스트를 렌더링합니다.