Kustomize를 사용한 확장

1. 목표

Kustomize는 템플릿 없이 애플리케이션 구성을 맞춤설정할 수 있는 방법을 도입하여 기성 애플리케이션 사용을 간소화하는 도구입니다. 독립형 유틸리티로 사용할 수 있으며 kubectl apply -k를 통해 kubectl에 빌드되어 독립형 CLI로 사용할 수 있습니다. 자세한 내용은 kustomize.io를 참고하세요.

이 튜토리얼에서는 Kustomize의 핵심 개념을 살펴보고 이를 사용하여 애플리케이션 및 환경의 변형을 관리합니다.

실습할 내용은 다음과 같습니다.

  • kustomize 명령줄 클라이언트 활용
  • 공통 요소 재정의
  • 대규모 yaml 구조 패치
  • 여러 레이어의 오버레이 활용

2. 작업공간 준비 중

  1. 다음 URL로 이동하여 Cloud Shell 편집기를 엽니다.

https://ide.cloud.google.com

  1. 터미널 창에서 이 튜토리얼을 위한 작업 디렉터리를 만듭니다.

mkdir kustomize-lab

  1. 디렉터리로 변경하고 IDE 작업공간 설정

cd kustomize-lab && cloudshell workspace .

3. kustomize 명령줄 클라이언트 활용

kustomize의 강점은 커스텀 값으로 기본 Kubernetes yaml을 오버레이하고 수정하는 기능입니다. 이 작업을 수행하려면 파일 위치와 재정의할 항목에 관한 안내가 포함된 기본 파일이 필요합니다. Kustomize는 Kubernetes 생태계에 포함되어 있으며 다양한 방법으로 실행할 수 있습니다.

이 섹션에서는 기본 kustomize 구성을 만들고 독립형 kustomize 명령줄 클라이언트로 파일을 처리합니다.

  1. 시작하려면 기본 구성 파일을 보관할 폴더를 만듭니다.

mkdir -p chat-app/base

  1. 기본 폴더에 간단한 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

  1. 기본 kustomization.yaml 만들기

Kustomize는 진입점으로 kustomization.yaml이라는 파일을 찾습니다. 이 파일에는 다양한 기본 및 재정의 파일에 대한 참조와 특정 재정의 값이 포함되어 있습니다.

deployment.yaml를 기본 리소스로 참조하는 kustomization.yaml 파일을 만듭니다.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. 기본 폴더에서 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에 라벨을 추가합니다.

  1. 공통 라벨과 네임스페이스를 포함하도록 kustomization.yaml 파일을 업데이트합니다.

터미널에서 다음 명령어를 복사하고 실행합니다.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. 빌드 명령어 실행

이 시점에서 빌드를 실행하면 결과 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는 기본 리소스를 오버레이하는 패치를 적용하는 기능도 제공합니다. 이 기법은 애플리케이션과 환경 간에 변동성을 제공하는 데 자주 사용됩니다.

이 단계에서는 동일한 기본 리소스를 사용하는 단일 애플리케이션에 대한 환경 변형을 만듭니다.

  1. 먼저 다양한 환경의 폴더를 만드세요.

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. 다음 명령어를 사용하여 단계 패치를 작성합니다.

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

  1. 이제 다음 명령어로 프로덕션 패치를 작성합니다.

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에 대한 고유한 환경 변수가 포함되어 있습니다.

  1. 기본 디렉터리의 kustomize YAML 파일 구현

기본 kustomization.yaml을 다시 작성하고 네임스페이스와 이름 접두사를 삭제합니다. 변형이 없는 기본 구성일 뿐입니다. 이러한 필드는 곧 환경 파일로 이동됩니다.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. 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가 기본 리소스 위에 이러한 파일을 오버레이해야 함을 나타냅니다.

  1. prod 디렉터리의 kustomize YAML 파일 구현

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. kustomize를 실행하여 파일을 병합하세요.

기본 파일 및 환경 파일이 생성되면 kustomize 프로세스를 실행하여 기본 파일을 패치할 수 있습니다.

dev에 대해 다음 명령어를 실행하여 병합된 결과를 확인합니다.

kustomize build chat-app/dev

출력에는 기본 및 개발 구성의 라벨, 기본의 컨테이너 이미지 이름, 개발 폴더의 환경 변수와 같이 병합된 결과가 포함됩니다.

6. 여러 레이어의 오버레이 활용

많은 조직에는 앱팀을 지원하고 플랫폼을 관리하는 데 도움이 되는 팀이 있습니다. 이러한 팀은 로깅 에이전트와 같이 모든 환경의 모든 앱에 포함되어야 하는 구체적인 세부 정보를 포함하려고 하는 경우가 많습니다.

이 예시에서는 배포된 환경에 관계없이 모든 애플리케이션에 포함될 shared-kustomize 폴더와 리소스를 만듭니다.

  1. shared-kustomize 폴더 만들기

mkdir shared-kustomize

  1. 공유 폴더에 간단한 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

  1. 공유 폴더에 kustomization.yaml 만들기

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. 애플리케이션에서 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

  1. 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>