kubernetes

Kubernetes - Kustomize

mingming_96 2023. 12. 3. 20:58

Kustomize 

Kustomize kustomization 파일을 통해 쿠버네티스 오브젝트를 사용자가 원하는 대로 변경하는(customize) 독립형 도구입니다.

1.14 이후로, kubectl도 kustomization 파일을 사용한 쿠버네티스 오브젝트의 관리를 지원합니다. 이를 통해 복잡한 배포 작업을 간단하게 할 수 있으며, 기본 아이디어는 베이스 리소스를 정의 후 그 위에 오버레이를 적용하여 여러 환경 또는 설정에 맞게 배포를 구성할 수 있습니다. 

 

 

Kustomize 개념 

  1. 베이스 리소스: 배포하려는 Kubernetes 리소스의 기본 템플릿입니다. 이는 일반적으로 구성, 서비스, 볼륨, 설정맵 등을 포함합니다.
  2. 오버레이: 베이스 리소스에 적용되는 변경 사항을 정의합니다. 이를 통해 환경별 또는 특정 설정에 맞게 수정된 리소스를 생성할 수 있습니다.
  3. Kustomization 파일: kustomization.yaml 파일은 Kustomize 프로젝트의 루트에 위치하며, 배포 구성에 대한 지시를 제공합니다. 여기에는 베이스 리소스, 오버레이, 리소스 패치, 환경 변수 및 기타 Kustomize 설정이 정의됩니다.
  4. 변수화와 리소스 패치: Kustomize는 변수를 사용하여 리소스를 동적으로 변경할 수 있으며, patches 디렉토리를 통해 기존 리소스를 수정하거나 추가할 수 있습니다.

 

Kustomize 설치 

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