커스터마이즈의 작동 원리
커스터마이즈를 통한 배포는 kubectl에 구성돼 있는 매니페스트를 고정적으로 이용해야하는 기존 방식을 유연하게 만든다. 우선 커스터마이즈가 어떻게 작동하는지 간단하게 살펴보자.
커스터마이즈는 야믈파일에 정의된 값을 사용자가 원하는 값으로 변경할 수 있다. 쿠버네티스에서 오브젝트에 대한 수정사항을 반영하려면 사용자가 직접 야믈 파일을 편집기 프로그램으로 수정해야한다.
일반적으로 이런 방식으로 수정했을 때 큰 문제가 발생하지 않는다. 그런데 만약 수정해야하는 야믈파일이 매우 많거나 하나의 야믈파일로 환경이 다른 여러 개의 쿠버네티스 클러스터에 배포해야해서 LABEL이나 NAME 같은 일부 항목을 수정해야 한다면 매번 일일이 고치는 데 많은 노력이 든다. 커스터마이즈는 이를 위해 kustomize 명령을 제공한다. kustomize 명령과 create 옵션으로 kustomization.yaml이라는 기본 매니페스트를 만들고, 이 파일에 변경해야하는 값들을 적용한다. 그리고 build 옵션으로 변경할 내용이 적용된 최종 야믈 파일을 저장하거나 변경된 내용이 바로 실행되도록 지정한다.
예를들어 MetalLB 0.9 버전부터는 쿠버네티스에서 MetalLB를 구성할 때 컨트롤러와 에이전트인 스피커가 통신할 때 보안을 위해 쿠버네티스의 시크릿(Secret) 오브젝트를 사용한다. 이에 따라서 기존에는 매니페스트 방법만 안내됐지만, 0.9 버전부터는 복잡한 설치 과정을 간편화할 수 있도록 커스터마이즈 방법을 추가로 안내한다. 편의성을 위해 시크릿을 사용하지 않은 0.8버전을 사용한다.
# 커스터마이즈로 MetalLB 한 번에 만들기
1. kustomize-install.sh 실행
$ sudo ./kustomize-install.sh
커스터마이즈 명령을 사용하시 위해서 kustomize-install.sh를 실행해 커스터마이즈 압축파일을 내려받은 후에 이를 해제하고 /usr/local/bin 으로 옮긴다. 이후 헬름도 동일한 과정을 통해서 배시 셸에서 바로 실행할 수 있게 만들것이다.
2. 파일 확인
커스터마이즈에서 리소스 및 주소 할당 영역(Pool)을 구성할 때 사용할 파일들을 확인한다. 이전에는 네임스페이스 설정 부분이 metallb.yaml 배포에 포함됐으나, 리소스에 여러가지 항목이 포함될 수 있음을 표현하기 위해 네임스페이스를 분리했다.
3. kustomization.yaml 생성
$ sudo kustomize create --namespace=metallb-system --resources namespace.yaml,metallb.yaml,metallb-l2config.yaml
커스터마이즈로 변경될 작업을 정의하기 위해서 kustomization.yaml을 생성한다. 이때 --namespace는 작업의 네임스페이스를 설정하며, --resources 명령은 커스터마이즈 명령을 이용해서 kustomization.yaml을 만들기 위한 소스 파일을 정의한다.
4. kustomization.yaml 파일 확인
생성한 kustomization.yaml 파일을 확인해 보면, 리소스로 namespace.yaml, metallb.yaml, metallb-l2config.yaml이 설정됐고, 네임스페이스는 matallb-system으로 설정된 것을 확인할 수 있다.
5. 이미지 태그 지정
$ sudo kustomize edit set image metallb/controller:v0.8.2
$ sudo kustomize edit set image metallb/speaker:v0.8.2
설치된 이미지를 안정적인 버전으로 유지하기 위해서 kustomize edit set image 옵션을 이용해 MetalLB controller와 speaker의 이미지 태그를 v0.8.2 로 지정한다.
6. kustomization.yaml 파일 확인
이미지 태그 정보가 설정되었는지 확인
7. kustomize bulid 명령으로 MetalLB 설치를 위한 매니페스트 생성
$ kustomize build
8. 배포
$ sudo kustomize build | kubectl apply -f -
이를 파일로 저장해 MetalLB를 배포할 수도 있지만, 편의를 위해서 kubectl apply -f - 명령으로 빌드한 결과가바로 kubectl apply에 인자로 전달돼 배포되도록 한다.
9. MetalLB 정상 배포 확인
$ kubectl get pods -n metallb-system
$ kubectl get configmap -n metallb-system
10. MetalLB 태그 확인
$ kubectl describe pods -n metallb-system | grep Image:
11. IP가 정상적으로 할당됐는지 확인
# 디플로이먼트 생성
$ kubectl create deployment echo-ip --image=sysnet4admin/echo-ip
# LoadBalancer 타입으로 노출
$ kubectl expose deployment echo-ip --type=LoadBalancer --port=80
# IP 할당 확인
$ kubectl get service echo-ip
커스터마이즈를 통해서 MetalLB가 생성된 것을 확인했으니 간단하게 테스트 해보자. 디플로이먼트 1개를 배포한 다음 LoadBalancer 타입으로 노출하고 IP가 정상적으로 할당됐는지 확인한다.
12. echo-ip가 정상적으로 응답하는지 확인
# MetalLB 삭제
$ kustomize build | kubectl delete -f -
# echo-ip 서비스 삭제
$ kubectl delete service echo-ip
# echo-ip 디플로이먼트 삭제
$ kubectl delete deployment echo-ip
커스터마이즈를 이용하면 MetalLB의 다양한 설정을 사용자의 입맛에 맞게 변경하고 구현할 수 있다. 그러나 커스터마이즈는 여러 가지 변경할 부분을 사용자가 직접 kustomization.yaml 에 추가하고 최종적으로 필요한 매니페스트를 만들어 배포해야한다. 이러한 다소 수동적인 작성 방식이 아닌 선언적으로 필요한 내용을 제공하고 이에 맞게 배포하려면 어떻게 해야할까? 그리고 커스터마이즈를 통해서 변경할 수 없었던 주소 할당 영역과 같은 값도 배포시에 같이 변경하려면 어떻게 할까? 헬름은 이러한 제약 사항들을 없애고 편리성을 높일 수 있다.
출처:
"컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음/길벗출판사" 책을 기반으로 실습한 내용입니다.
'DevOps > CI|CD' 카테고리의 다른 글
젠킨스 컨트롤러 설정하기(환경설정) (0) | 2022.06.13 |
---|---|
젠킨스 살펴보기 (0) | 2022.06.13 |
젠킨스 설치를 위한 간편화 도구 (0) | 2022.06.13 |
컨테이너 인프라 환경에서 CI/CD (0) | 2022.06.13 |
통합 및 배포 자동화 (0) | 2022.06.13 |