Merge pull request #42291 from bugoverdose/announcing-kustomize

[ko] Translate blog/_posts/2018-05-29-announcing-kustomize.md into Korean
pull/42747/head
Kubernetes Prow Robot 2023-08-26 21:57:21 -07:00 committed by GitHub
commit 1175aa5c22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 242 additions and 0 deletions

View File

@ -0,0 +1,242 @@
---
layout: blog
title: 'kustomize: 템플릿에서 자유로운 쿠버네티스 구성 커스터마이제이션을 소개합니다.'
date: 2018-05-29
---
**Authors:** Jeff Regan (Google), Phil Wittrock (Google)
**번역**: 정진우 (Devsisters), 손석호 (ETRI)
[**kustomize**]: https://github.com/kubernetes-sigs/kustomize
[hello world]: https://github.com/kubernetes-sigs/kustomize/blob/master/examples/helloWorld
[메일 수신자 목록]: https://groups.google.com/forum/#!forum/kustomize
[이슈를 열어주세요]: https://github.com/kubernetes-sigs/kustomize/issues/new
[하위 프로젝트]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/2377-Kustomize/README.md
[SIG-CLI]: https://github.com/kubernetes/community/tree/master/sig-cli
[워크플로우]: https://github.com/kubernetes-sigs/kustomize/blob/1dd448e65c81aab9d09308b695691175ca6459cd/docs/workflows.md
쿠버네티스 환경을 운영해 보았다면, 아마도 쿠버네티스 구성을
자신이 원하는 대로 변경(customize) 해본 경험이 있을 것입니다.
API 오브젝트 YAML 파일을 복사하고 필요에 따라 일부분만 수정하는 작업이
그 예입니다.
그러나 언급한 방식에는 단점이 있습니다.
적용된 개선 사항을 원본 소스에
재반영하는 것이 까다롭다는 점입니다. 오늘 구글은
[SIG-CLI]의 [하위 프로젝트]로
기여된 커맨드라인 도구
[**kustomize**]를 발표합니다. 이 도구는
완전히 *선언적(declarative)* 인 새로운 구성 커스터마이제이션 방법을 제시하며,
친숙하면서도 신중하게 설계된 쿠버네티스 API를 준수 및
적극 활용합니다.
일반적으로 격을 수 있는 시나리오를 함께 살펴봅시다. 당신은 다른 사람이 작성한
콘텐츠 관리 시스템(content management system) 쿠버네티스 구성을 인터넷에서
찾았습니다. 그것은 쿠버네티스 API 오브젝트들에 대한 명세가 담긴
YAML 파일들일 것입니다. 그리고 회사 내부에서
해당 CMS를 보조하기 위한 데이터베이스
구성을 찾았습니다. 해당 데이터베이스는
당신이 잘 알아서 더 선호하는 데이터베이스입니다.
당신은 어떻게든 이 둘을 함께 사용하고 싶습니다. 나아가,
해당 구성을 커스터마이즈하여 당신의 리소스 인스턴스와
클러스터 내에서 동일한 작업을
수행하고 있는 동료의 리소스를
구분할 수 있도록 라벨을 추가하고 싶습니다.
또한 CPU, 메모리, 레플리카 수에 적절한 값을
지정하고 싶습니다.
추가적으로, 당신은 구성 전체를 *여러 변형(variants)* 으로 재구성하게 될 수 있습니다.
테스트와 실험을 위한 (사용되는 컴퓨팅 리소스의 차원에서) 작은 규모로 변형,
운영 환경에서 외부 사용자들에게 서비스하기 훨씬 큰 규모로 변형 등이
그 예입니다.
마찬가지로, 다른
팀들에서도 자신들만의 변형을 필요로 할 수 있습니다.
이러한 시나리오에는 다양한 질문이 뒤따릅니다. 하나의 구성을
여러 위치에 복사해두고 개별적으로 수정하고
있나요? 만일 수십 개의 개발 팀들이 모두
아주 미세하게 다른 변형이 필요하다면 어떻게 해야
할까요? 모든 구성들이 공통적으로 공유하는 요소들은
어떻게 업그레이드하고 관리하고 있나요? **kustomize**
사용하는 워크플로우는 이러한 질문에 답변할 수 있습니다.
## 커스터마이제이션은 재사용이다.
쿠버네티스의 구성(configuration)은 코드가 아닙니다. (API 오브젝트에 대한
YAML 명세라는 점에서 엄밀하게는
데이터로 간주됨) 그러나 구성과 코드의 라이프사이클은
서로 많은 유사점을 가지고 있습니다.
구성의 버전은 제어 및 관리되어야 합니다.
구성의 소유자와 구성의 사용자가
동일한 사람일 필요는
없습니다. 구성은 전체에서 일부분으로서 사용될 수도
있습니다. 사용자들은 각자의 목적에 따라 구성을 *재사용* 하고
싶을 것입니다.
코드 재사용과 마찬가지로 전체를 단순 복사하고 복사본을
적절히 수정하는 것도 구성 재사용 방식 중
하나입니다. 코드와 마찬가지로 원본 소스와의 연결을 끊어내면
원본이 개선되었을 때 그 수혜를 받기 어려워집니다.
다양한 팀 또는 환경이
각자 자신만의 변형된 구성을 지니는 상황에서
이러한 방식을 취하게 되면
간단한 업그레이드조차 다루기 힘들어집니다.
재사용을 위한 다른 방식은 원본 소스를
매개변수가 포함된 템플릿으로
표현하는 것입니다. 특정 도구를 활용하여 템플릿을 처리, 즉
내장된 스크립트를 실행하여 매개변수들을 특정 값들로 대체함으로써
구성을 생성합니다. 다양한 값들의 지정함으로써
하나의 템플릿을 재사용한다고 말할 수 있습니다. 문제는
템플릿과 값들이 명시된 파일이 쿠버네티스 API 리소스의 명세가
아니라는 점입니다. 그들은 필연적으로
쿠버네티스 API에 덧대는 또 다른 언어가
될 수 밖에 없습니다. 물론 이러한 도구는 강력할 수 있지만,
학습 및 활용 비용이 수반됩니다. 각
팀마다 다른 수정 사항을 원하기 때문에 결국 YAML 파일에 포함시킬 수 있는
거의 모든 명세는 특정 값을 필요로 하는 매개변수가 됩니다.
결과적으로, (디폴트 값이 없는) 모든 매개변수들은
대체할 값들이 명시되어야 하므로
값들의 조합은 커집니다.
이는 다른 변형들 간의 차이를
최대한 작게 유지하고,
전체 리소스 명세가 없을 때에도
이해하기 쉽도록 한다는 재사용의 목표 중 하나를 훼손합니다.
## 구성 커스터마이제이션의 새로운 옵션
`kustomization.yaml` 파일에
표현된 선언적 명세로 도구의 동작 방식이 결정되는 **kustomize**
위의 방식을 비교해봅시다.
**kustomize** 프로그램은 파일과 해당 파일이 참조하는
쿠버네티스 API 리소스 파일을 읽습니다. 그리고 표준 출력으로
완성된 리소스를 출력합니다. 이 텍스트 결과물은
다른 도구에 의해 추가적으로 처리되거나, 스트림 그대로
**kubectl**로 직접적으로 전달되어 클러스터에 적용될 수도 있습니다.
예를 들어, 아래와 같이 작성된 `kustomization.yaml`라는
파일이
```
commonLabels:
app: hello
resources:
- deployment.yaml
- configMap.yaml
- service.yaml
```
파일에 명시된 세 가지 리소스 파일과 함께
현재 디렉터리에 존재하는 경우, 아래와 같이 실행했을 때
```
kustomize build
```
세 가지 리소스가 포함된 YAML 스트림을 출력하고
`app: hello`라는 공통적인 라벨을 각 리소스에
추가해 줍니다.
유사하게, *commonAnnotations* 필드를 통해
모든 리소스에 어노테이션을 추가하고, *namePrefix* 필드로
모든 리소스명에 공통적인 접두사를 하나 추가할 수 있습니다.
이러한 진부하면서도 일반적인 커스터마이징은 그저
시작일 뿐입니다.
보다 일반적인 사용 사례는 공통적인 리소스들에 대해
다양한 변형(variants)이 필요한 경우입니다.
*개발* , *스테이지* , *운영* 환경에 따른 형태들이 그 예시입니다.
이러한 목적을 위해 **kustomize**
*오버레이(overlay)* 와 *베이스(base)* 라는 개념을 지원합니다. 둘 다
kustomization 파일로 표현됩니다. 베이스는
(리소스들과 해당 리소스들의 공통적 커스터마이제이션에 있어)
다양한 변형들 간의 공통점을 선언하고, 오버레이는
차이점을 선언합니다.
아래는 특정 클러스터 앱에 대한 *스테이징(staging)**프로덕션(production)* 환경용 변형
관리를 위한 파일 시스템 레이아웃 예시입니다.
```
someapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── configMap.yaml
│ └── service.yaml
└── overlays/
├── production/
│ └── kustomization.yaml
│ ├── replica_count.yaml
└── staging/
├── kustomization.yaml
└── cpu_count.yaml
```
`someapp/base/kustomization.yaml` 파일은 공통 리소스와
해당 리소스들에 공통적으로 적용할 수정 사항을 명시합니다.
(예를 들면, 모든 리소스에 특정 레이블을 붙이거나, 이름에 접두사를 붙이거나, 어노테이션을
추가하는 등)
`someapp/overlays/production/kustomization.yaml`
내용은
다음과 같을 수 있습니다.
```
commonLabels:
env: production
bases:
- ../../base
patches:
- replica_count.yaml
```
이 kustomization은 `replica_count.yaml`라는
*패치(patch)* 파일을 명시하며, 그 내용은 아래와 같을 수 있습니다.
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: the-deployment
spec:
replicas: 100
```
패치란 부분적인 리소스 선언입니다. 위의 경우
운영 환경이 트래픽을 감당할 수 있도록
`someapp/base/deployment.yaml`의 디플로이먼트에
*replicas* 값만 덮어쓰는 수정입니다.
해당 패치는 디플로이먼트 스펙의 일부분으로서
나머지 전체 구성과 독립적으로 보더라도 명확한
맥락과 의도를 가지고 있으며 별도로 검증도
가능합니다. 단순히 맥락과 무관한 *{매개변수 명칭, 값}*
튜플 이상의 의미를 지닙니다.
운영 환경의 리소스를 생성하기 위해서는 다음과 같이 실행하면 됩니다.
```
kustomize build someapp/overlays/production
```
표준출력으로 나오는 결과물은 그대로 클러스터에 적용될 수 있는
완전한 리소스들입니다.
유사한 명령어로 스테이징 환경도 정의할 수 있습니다.
## 요약
**kustomize**를 사용하면 쿠버네티스 API 리소스 파일만으로
독립적으로 커스터마이징된 쿠버네티스 구성을 임의의 숫자만큼
관리할 수 있습니다. **kustomize**
사용하는 모든 아티팩트(artifact)는 순수한 YAML이며
YAML 형식으로 검증 및 처리될 수 있습니다. kustomize는
fork/modify/rebase [워크플로우]를 권장합니다.
입문하려면 [hello world] 예시를 해보는 것을 추천합니다.
논의와 피드백을 위해 [메일 수신자 목록]에 참여하거나
[이슈를 열어주세요]. PR(Pull Request)도 환영합니다.