1. 목표
Kustomize는 템플릿 없이 애플리케이션 구성을 맞춤설정할 수 있는 방법을 도입하여 기성 애플리케이션 사용을 간소화하는 도구입니다. 독립형 유틸리티로 사용할 수 있으며 kubectl apply -k
를 통해 kubectl에 빌드되어 독립형 CLI로 사용할 수 있습니다. 자세한 내용은 kustomize.io를 참고하세요.
이 튜토리얼에서는 Kustomize의 핵심 개념을 살펴보고 이를 사용하여 애플리케이션 및 환경의 변형을 관리합니다.
실습할 내용은 다음과 같습니다.
- kustomize 명령줄 클라이언트 활용
- 공통 요소 재정의
- 대규모 yaml 구조 패치
- 여러 레이어의 오버레이 활용
2. 작업공간 준비 중
- 다음 URL로 이동하여 Cloud Shell 편집기를 엽니다.
https://ide.cloud.google.com
- 터미널 창에서 이 튜토리얼을 위한 작업 디렉터리를 만듭니다.
mkdir kustomize-lab
- 디렉터리로 변경하고 IDE 작업공간 설정
cd kustomize-lab && cloudshell workspace .
3. kustomize 명령줄 클라이언트 활용
kustomize의 강점은 커스텀 값으로 기본 Kubernetes yaml을 오버레이하고 수정하는 기능입니다. 이 작업을 수행하려면 파일 위치와 재정의할 항목에 관한 안내가 포함된 기본 파일이 필요합니다. Kustomize는 Kubernetes 생태계에 포함되어 있으며 다양한 방법으로 실행할 수 있습니다.
이 섹션에서는 기본 kustomize 구성을 만들고 독립형 kustomize 명령줄 클라이언트로 파일을 처리합니다.
- 시작하려면 기본 구성 파일을 보관할 폴더를 만듭니다.
mkdir -p chat-app/base
- 기본 폴더에 간단한 Kubernetes
deployment.yaml
만들기
cat <<EOF > chat-app/base/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`metadata:`
`name: chat-app`
`spec:`
`containers:`
`- name: chat-app`
`image: chat-app-image`
EOF
- 기본
kustomization.yaml
만들기
Kustomize는 진입점으로 kustomization.yaml이라는 파일을 찾습니다. 이 파일에는 다양한 기본 및 재정의 파일에 대한 참조와 특정 재정의 값이 포함되어 있습니다.
deployment.yaml
를 기본 리소스로 참조하는 kustomization.yaml
파일을 만듭니다.
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
EOF
- 기본 폴더에서 kustomize 명령어를 실행합니다. 이렇게 하면 아직 변형이 포함되지 않았으므로 배포 YAML 파일이 변경사항 없이 출력됩니다.
kustomize build chat-app/base
이 독립형 클라이언트를 kubectl 클라이언트와 결합하여 다음 예와 같이 출력을 직접 적용할 수 있습니다. 이렇게 하면 빌드 명령어의 출력이 kubectl apply 명령어로 직접 스트리밍됩니다.
(실행하지 말 것 - 참조용으로만 포함됨)
kustomize build chat-app/base | kubectl apply -f -
이 기법은 특정 버전의 kustomize 클라이언트가 필요한 경우에 유용합니다.
또는 kubectl 내에 통합된 도구로 kustomize를 실행할 수 있습니다. 다음 예와 같습니다.
(실행하지 말 것 - 참조용으로만 포함됨)
kubectl apply -k chat-app/base
4. 공통 요소 재정의
작업공간이 구성되었고 kustomize가 작동하는지 확인했으므로 이제 일부 기본값을 재정의해야 합니다.
이미지, 네임스페이스, 라벨은 일반적으로 각 애플리케이션과 환경에 맞춤설정됩니다. Kustomize를 사용하면 일반적으로 변경되므로 Kustomize를 통해 kustomize.yaml
에서 직접 선언할 수 있으므로 이러한 일반적인 시나리오를 위한 많은 패치를 만들 필요가 없습니다.
이 기법은 템플릿의 특정 인스턴스를 만드는 데 자주 사용됩니다. 이제 이름과 네임스페이스만 변경하면 하나의 기본 리소스 집합을 여러 구현에 사용할 수 있습니다.
이 예시에서는 네임스페이스, 이름 프리픽스를 추가하고 kustomization.yaml
에 라벨을 추가합니다.
- 공통 라벨과 네임스페이스를 포함하도록
kustomization.yaml
파일을 업데이트합니다.
터미널에서 다음 명령어를 복사하고 실행합니다.
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
namespace: my-namespace
nameprefix: my-
commonLabels:
app: my-app
EOF
- 빌드 명령어 실행
이 시점에서 빌드를 실행하면 결과 YAML 파일에 서비스 정의와 배포 정의 모두에 네임스페이스, 라벨, 접두사가 있는 이름이 포함되어 있음을 알 수 있습니다.
kustomize build chat-app/base
출력에 배포 YAML 파일에 없는 라벨과 네임스페이스가 포함되는 방식에 유의하세요. 이름이 chat-app
에서 my-chat-app
(으)로 어떻게 변경되었는지도 확인합니다.
(출력이 복사되지 않음)
kind: Deployment
metadata:
labels:
`app: my-app`
name: my-chat-app
namespace: my-namespace
5. 더 큰 yaml 구조 패치
Kustomize는 기본 리소스를 오버레이하는 패치를 적용하는 기능도 제공합니다. 이 기법은 애플리케이션과 환경 간에 변동성을 제공하는 데 자주 사용됩니다.
이 단계에서는 동일한 기본 리소스를 사용하는 단일 애플리케이션에 대한 환경 변형을 만듭니다.
- 먼저 다양한 환경의 폴더를 만드세요.
mkdir -p chat-app/dev
mkdir -p chat-app/prod
- 다음 명령어를 사용하여 단계 패치를 작성합니다.
cat <<EOF > chat-app/dev/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: chat-app`
`env:`
`- name: ENVIRONMENT`
`value: dev`
EOF
- 이제 다음 명령어로 프로덕션 패치를 작성합니다.
cat <<EOF > chat-app/prod/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: chat-app`
`env:`
`- name: ENVIRONMENT`
`value: prod`
EOF
위의 패치에는 컨테이너 이미지 이름이 포함되어 있지 않습니다. 이 값은 이전 단계에서 만든 base/deployment.yaml에 제공됩니다. 하지만 이러한 패치에는 dev 및 prod에 대한 고유한 환경 변수가 포함되어 있습니다.
- 기본 디렉터리의 kustomize YAML 파일 구현
기본 kustomization.yaml을 다시 작성하고 네임스페이스와 이름 접두사를 삭제합니다. 변형이 없는 기본 구성일 뿐입니다. 이러한 필드는 곧 환경 파일로 이동됩니다.
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
commonLabels:
app: chat-app
EOF
- dev 디렉터리의 kustomize YAML 파일 구현
이제 터미널에서 다음 명령어를 실행하여 dev 및 prod의 변형을 구현합니다.
cat <<EOF > chat-app/dev/kustomization.yaml
bases:
- ../base
namespace: dev
nameprefix: dev-
commonLabels:
env: dev
patches:
- deployment.yaml
EOF
파일에 patches
: 섹션이 추가되었습니다. 이는 kustomize가 기본 리소스 위에 이러한 파일을 오버레이해야 함을 나타냅니다.
- prod 디렉터리의 kustomize YAML 파일 구현
cat <<EOF > chat-app/prod/kustomization.yaml
bases:
- ../base
namespace: prod
nameprefix: prod-
commonLabels:
env: prod
patches:
- deployment.yaml
EOF
- kustomize를 실행하여 파일을 병합하세요.
기본 파일 및 환경 파일이 생성되면 kustomize 프로세스를 실행하여 기본 파일을 패치할 수 있습니다.
dev에 대해 다음 명령어를 실행하여 병합된 결과를 확인합니다.
kustomize build chat-app/dev
출력에는 기본 및 개발 구성의 라벨, 기본의 컨테이너 이미지 이름, 개발 폴더의 환경 변수와 같이 병합된 결과가 포함됩니다.
6. 여러 레이어의 오버레이 활용
많은 조직에는 앱팀을 지원하고 플랫폼을 관리하는 데 도움이 되는 팀이 있습니다. 이러한 팀은 로깅 에이전트와 같이 모든 환경의 모든 앱에 포함되어야 하는 구체적인 세부 정보를 포함하려고 하는 경우가 많습니다.
이 예시에서는 배포된 환경에 관계없이 모든 애플리케이션에 포함될 shared-kustomize
폴더와 리소스를 만듭니다.
- shared-kustomize 폴더 만들기
mkdir shared-kustomize
- 공유 폴더에 간단한
deployment.yaml
을 만듭니다.
cat <<EOF > shared-kustomize/deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: app
spec:
template:
`spec:`
`containers:`
`- name: logging-agent`
`image: logging-agent-image`
EOF
- 공유 폴더에 kustomization.yaml 만들기
cat <<EOF > shared-kustomize/kustomization.yaml
bases:
- deployment.yaml
EOF
- 애플리케이션에서 shared-kustomize 폴더를 참조합니다.
shared-kustomize
폴더가 모든 애플리케이션의 기본이 되도록 하려면 shared-kustomize
를 기본으로 사용하도록 chat-app/base/kustomization.yaml
를 업데이트해야 합니다. 그런 다음 자체 deployment.yaml을 패치합니다. 그러면 그 위에 환경 폴더가 다시 패치됩니다.
터미널에서 다음 명령어를 복사하고 실행합니다.
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- ../../shared-kustomize
commonLabels:
app: chat-app
patches:
- deployment.yaml
EOF
- kustomize를 실행하고 dev의 병합된 결과 보기
kustomize build chat-app/dev
출력에는 앱 기반, 앱 환경, shared-kustomize
폴더의 병합된 결과가 포함됩니다. 특히 컨테이너 섹션에서 세 위치의 값을 모두 확인할 수 있습니다.
(출력이 복사되지 않음)
<pre>
`containers:`
`- env:`
`- name: ENVIRONMENT`
`value: dev`
`name: chat-app`
`- image: image`
`name: app`
`- image: logging-agent-image`
`name: logging-agent`
</pre>