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에 파일이 있는 위치와 재정의할 항목에 관한 안내가 포함된 기본 파일이 필요합니다. 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 클라이언트가 필요한 경우에 유용합니다.

또는 kustomize는 kubectl 자체에 통합된 도구를 사용하여 실행할 수 있습니다. 다음 예와 같이 말입니다.

(실행하지 마세요. 참조용으로만 포함됨)

kubectl apply -k chat-app/base

4. 일반 요소 재정의

이제 작업공간이 구성되고 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에 제공됩니다. 하지만 이러한 패치에는 개발 및 프로덕션의 고유한 환경 변수가 포함되어 있습니다.

  1. 기본 디렉터리의 kustomize YAML 파일을 구현합니다.

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

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

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. 개발 디렉터리의 kustomize YAML 파일을 구현합니다.

이제 터미널에서 다음 명령어를 실행하여 개발 및 프로덕션의 변형을 구현합니다.

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

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

파일에 patches: 섹션이 추가되었습니다. 이는 kustomize가 기본 리소스 위에 이러한 파일을 오버레이해야 함을 나타냅니다.

  1. 프로덕션 디렉터리의 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 프로세스를 실행하여 기본 파일을 패치할 수 있습니다.

개발의 경우 다음 명령어를 실행하여 병합된 결과를 확인합니다.

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를 실행하고 개발의 병합된 결과를 확인합니다.

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>