Kubernetes - Kustomize
Kustomize
Kustomize는 kustomization 파일을 통해 쿠버네티스 오브젝트를 사용자가 원하는 대로 변경하는(customize) 독립형 도구입니다.
1.14 이후로, kubectl도 kustomization 파일을 사용한 쿠버네티스 오브젝트의 관리를 지원합니다. 이를 통해 복잡한 배포 작업을 간단하게 할 수 있으며, 기본 아이디어는 베이스 리소스를 정의 후 그 위에 오버레이를 적용하여 여러 환경 또는 설정에 맞게 배포를 구성할 수 있습니다.
Kustomize 개념
- 베이스 리소스: 배포하려는 Kubernetes 리소스의 기본 템플릿입니다. 이는 일반적으로 구성, 서비스, 볼륨, 설정맵 등을 포함합니다.
- 오버레이: 베이스 리소스에 적용되는 변경 사항을 정의합니다. 이를 통해 환경별 또는 특정 설정에 맞게 수정된 리소스를 생성할 수 있습니다.
- Kustomization 파일: kustomization.yaml 파일은 Kustomize 프로젝트의 루트에 위치하며, 배포 구성에 대한 지시를 제공합니다. 여기에는 베이스 리소스, 오버레이, 리소스 패치, 환경 변수 및 기타 Kustomize 설정이 정의됩니다.
- 변수화와 리소스 패치: Kustomize는 변수를 사용하여 리소스를 동적으로 변경할 수 있으며, patches 디렉토리를 통해 기존 리소스를 수정하거나 추가할 수 있습니다.
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
mv kustomize /usr/bin/kustomize
kustomize 명령어
Available Commands:
build Build a kustomization target from a directory or URL
cfg Commands for reading and writing configuration
completion Generate shell completion script
create Create a new kustomization in the current directory
edit Edits a kustomization file
fn Commands for running functions against configuration
help Help about any command
localize [Alpha] Creates localized copy of target kustomization root at destination
version Prints the kustomize version
build : kustomization.yaml 파일의 정의된 값으로 매니패스트 파일을 빌드합니다.
completion : shell 에서 자동완성을 설정하는데 사용됩니다. [ bash | zsh | fish | powershell ]
create : 현재 디렉터리에 새로운 kustomization.yaml 파일을 생성합니다.
edit : kustomization.yaml 파일을 편집하는데 사용됩니다.
kustomize
1. kustomize 디렉터리 생성
먼저 실습에 사용할 kustomize 디렉터리를 생성합니다.
mkdir kustomize
cd kustomize
2. base 디렉터리 생성
Base는 원본 리소스 정의를 담고 있는 디렉토리나 파일입니다. 기본적으로는 애플리케이션을 설명하는 Kubernetes 리소스 정의가 들어있는 곳입니다. 관리하고자 하는 쿠버네티스 매니페스트 파일이 위치합니다. 실습 편의상 nginx-deployment.yaml 과 nginx-service.yaml 두 개의 파일을 위치시켰습니다.
mkdir base
cd base
nginx-deployment.yaml
apiVersion:
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
3. kustomization.yaml
Kustomization 파일은 Kubernetes의 리소스를 구성하고 관리하기 위한 Kustomize 도구의 설정 파일입니다. 이 파일은 다양한 리소스를 관리하는 데 사용되며, 기본적으로 Kustomize가 어떤 리소스를 사용할지, 어떤 수정을 가할지, 어떤 리소스를 조합할지 등을 정의합니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
metadata:
name: nginx-kustomizations
resources:
- nginx-deployment.yaml
- nginx-service.yaml
kustomize를 이용한 이미지 태그 변경
1. overlays 작업공간 생성
앞서 설명한 것처럼 base 디렉터리는 관리할 원본 매니페스트 파일이 존재하는 공간입니다. 예를들어 stage , product 환경이 존재한다고 했을 때 각 환경에 맞게 kustomize를 통해 overlay 하여 배포할 수 있습니다.
mkdir overlays
cd overlays
mkdir stage
cd stage
kustomize init --resources ../../base
mkdir prod
cd prod
kustomize init --resources ../../base
현재 작업공간을 tree 명령어로 확인해보면 다음과 같이 구성되어 있습니다.
root@master:~/kustomize# tree
.
├── base
│ ├── kustomization.yaml
│ ├── nginx-deployment.yaml
│ └── nginx-service.yaml
└── overlay
├── prod
│ └── kustomization.yaml
└── stage
└── kustomization.yaml
kustomize 명령어를 통해 원하는 설정으로 원본 파일을 제어할 수 있습니다.
2. 이미지 태그 변경
kustomize edit set image <image_name>=<image_name>:<image_tag>
kustomize edit set image nginx=nginx:1.14
edit 명령어로 이미지태그를 변경후 kustomize 파일을 확인해보면 다음과 같이 명령으로 지정한 이미지 태그가 새롭게 부여되어 있음을 확인할 수 있습니다.
1 │ apiVersion: kustomize.config.k8s.io/v1beta1
2 │ kind: Kustomization
3 │ resources:
4 │ - ../../base
5 │ images:
6 │ - name: nginx
7 │ newName: nginx
8 │ newTag: "1.14"
3. kustomize build
kustomize build 명령어를 통해 kustomize 파일에 정의된 내용을 적용한 매니페스트 결과를 얻을 수 있습니다.
base의 service와 deployment가 kustomize 파일을 기반으로 새롭게 정의되어 출력됨을 확인할 수 있습니다.
root@master:~/kustomize/overlay/stage# kustomize build
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
---
apiVersion: null
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14
name: nginx
kustomize를 이용한 replicas 변경
1. replicas 개수 변경
edit 명령어로 replica 개수를 조정합니다. kustomization 파일을 확인하면 replicas 필드가 생성되어 있습니다.
kustomize edit set replicas <deployment_name>=5
root@master:~/kustomize/overlay/stage# kustomize edit set replicas nginx=5
1 │ apiVersion: kustomize.config.k8s.io/v1beta1
2 │ kind: Kustomization
3 │ resources:
4 │ - ../../base
5 │ images:
6 │ - name: nginx
7 │ newName: nginx
8 │ newTag: "1.14"
9 │ replicas:
10 │ - count: 5
11 │ name: nginx
2. kustomize build
빌드 결과물에 replicas의 개수가 변경된 것을 확인할 수 있습니다.
root@master:~/kustomize/overlay/stage# kustomize build
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
---
apiVersion: null
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14
name: nginx