배포 간편화
쿠버네티스를 사용하면 인프라환경 구축에 크게 시간을 쓰지 않고 애플리케이션 개발에만 집중할 수 있게된다. 모든 배포 환경을 컨테이너 인프라로 일원화하고, CI/CD 도구를 사용하면 애플리케이션에 맞는 환경을 적용해 자동으로 배포가 가능하기 때문이다.
이때 우리는 쿠버네티스 내부에 젠킨스(Jenkins)를 설치하여 애플리케이션 코드를 빌드하고 레지스트리에 푸시한 후에 쿠버네티스에서 사용 가능한 형태로 배포한다. 이런 작업은 자동으로 작업을 수행하도록하여 효율성을 높이고, 실수를 줄여주는 장점이 있다. 애플리케이션을 배포하기 위한 환경을 하나하나 구성하는 것은 매우 복잡한 일이고 또 고정된 값이 아니기 때문에 매니페스트로 작성해 그대로 사용할 수 없다.
매니페스트란?
매니페스트 파일(manifest file)은 컴퓨팅에서 집합의 일부 또는 논리정연한 단위인 파일들의 그룹을 위한 메타데이터를 포함하는 파일이다. 예를 들어, 컴퓨터 프로그램의 파일들은 이름, 버전 번호, 라이선스, 프로그램의 구성 파일들을 가질 수 있다.
이 용어는 화물 목록(ship manifest)이 선원 및 화물을 나열하는 화물 수송 절차로부터 가져온 것이다.
동적인 변경사항을 간편하고 빠르게 적용할 수 있도록 도와주는 도구들이 있다. 아래는 배포 간편화 도구를 비교하는 표이다.
구분 | 큐브시티엘(kubectl) | 커스터마이즈(kustomize) | 헬름(Helm) |
설치 방법 | 쿠버네티스에 기본 포함 | 별도 실행 파일 또는 쿠버네티스에 통합 | 별도 설치 |
배포 대상 | 정적인 야믈 파일 | 커스터마이즈 파일 | 패키지(차트) |
주 용도 | 오브젝트 관리 및 배포 | 오브젝트의 가변적 배포 | 패키지 단위 오브젝트 배포 및 관리 |
가변적 환경 | 대응이 힘들다(yaml 수정 필요) | 간단한 대응 가능 | 복잡한 대응 가능 |
기능 복잡도 | 단순함 | 보통 | 복잡함 |
설명 | - 고정적인 값으로 설정된 매니페스트를 그대로 사용하므로 개별적인 오브젝트를 관리하거나 배포할 때 사용 - 오브젝트 생성, 쿠버네티스 클러스터에 있는 오브젝트, 이벤트 등의 정보를 확인하는 용으로는 많이 쓰임 |
- 일부 내용을 가변적으로 변경해 사용가능 - 이미지 태그와 레이블 같은 명세를 변경 또는 일반 파일을 이용해 컨피그 맵과 시크릿을 생성하는 기능을 지원 |
- 모든 내용을 설정할 수 있는 값을 제공해 필요에 따라 사용자 환경에 맞는 설정값으로 변경 가능 - 온라인 저장소 지원. 패키지를 검색하고 내려받아 사용할 수 있다. - 헬름 차트는 자체적인 템플릿 문법을 사용하므로 가변적인 인자를 배포할 때 적용해 다양한 배포 환경에 맞추거나 원하는 조건 적용이 가능 - 오브젝트를 묶어 패키지 단위로 관리 - 1개의 명령어로 여러 오브젝트들을 구성할 수 있음 |
커스터마이즈(kustomize)로 배포 간편화
커스터마이즈로 MetalLB 만들어보기 예제 실습을 진행한다.
= kustomize-install.sh
#!/usr/bin/env bash
curl -L \
https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv3.6.1/kustomize_v3.6.1_linux_amd64.tar.gz -o /tmp/kustomize.tar.gz
tar -xzf /tmp/kustomize.tar.gz -C /usr/local/bin
echo "kustomize install successfully"
(!) kustomize는 /usr/local/bin 경로에 파일이 설치가 되는데, 혹시나 계정이(본인의 경우 root계정) $PATH에 /usr/local/bin가 없다면,
[bash: kustomize: command not found] 라는 오류가 나올것이므로, 이때
=> export PATH=$PATH:/usr/local/bin 명령어를 실행하여 추가해주자.
[root@m-k8s-ys vagrant]# ./kustomize-install.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 674 100 674 0 0 1359 0 --:--:-- --:--:-- --:--:-- 1361
100 12.4M 100 12.4M 0 0 5103k 0 0:00:02 0:00:02 --:--:-- 12.8M
kustomize install successfully
(!) bash를 실행해야하므로 rwx중 x(실행)권한이 필요할 것이다. 허가 거부가 나온다면, chmod 명령어로 바꿔서 실행시키자.
= metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: metallb-ip-range
protocol: layer2
addresses:
- 192.168.56.11-192.168.56.19
= namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: metallb-system
labels:
app: metallb
= metallb.yaml (너무 길어서.. 링크에 내용 확인)
=> https://github.com/sysnet4admin/_Book_k8sInfra/blob/main/ch5/5.2.2/metallb.yaml
# kustomize 설치
[root@m-k8s-ys vagrant]# ./kustomize-install.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 674 100 674 0 0 1433 0 --:--:-- --:--:-- --:--:-- 1437
100 12.4M 100 12.4M 0 0 2573k 0 0:00:04 0:00:04 --:--:-- 3692k
kustomize install successfully
# kustomization.yaml 파일 생성 (namespace 정의, --resources로 소스파일을 정의)
[root@m-k8s-ys vagrant]# kustomize create --namespace=metallb-system --resources namespace.yaml,metallb.yaml,metallb-l2config.yaml
# 만들어진 kustomization.yaml 파일 확인
[root@m-k8s-ys vagrant]# cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- metallb.yaml
- metallb-l2config.yaml
namespace: metallb-system
# 이미지 태그정보 변경설정
[root@m-k8s-ys vagrant]# kustomize edit set image metallb/controller:v0.8.2
[root@m-k8s-ys vagrant]# kustomize edit set image metallb/speaker:v0.8.2
# 변경 kustomization.yaml 파일 확인
[root@m-k8s-ys vagrant]# cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- metallb.yaml
- metallb-l2config.yaml
namespace: metallb-system
images:
- name: metallb/controller
newTag: v0.8.2
- name: metallb/speaker
newTag: v0.8.2
# kustomize 빌드 & 오브젝트 생성
[root@m-k8s-ys vagrant]# kustomize build | kubectl apply -f -
namespace/metallb-system created
serviceaccount/controller created
serviceaccount/speaker created
podsecuritypolicy.policy/speaker created
role.rbac.authorization.k8s.io/config-watcher created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/config created
deployment.apps/controller created
daemonset.apps/speaker created
# 파드 및 컨피그맵 확인
[root@m-k8s-ys vagrant]# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-5f98465b6b-2dhmv 1/1 Running 0 37s
speaker-499k9 1/1 Running 0 37s
speaker-4rqtq 1/1 Running 0 37s
speaker-5cfsl 1/1 Running 0 37s
speaker-697kg 1/1 Running 0 37s
speaker-d2b6q 1/1 Running 0 37s
[root@m-k8s-ys vagrant]# kubectl get configmap -n metallb-system
NAME DATA AGE
config 1 64s
# 위에서 커스터마이즈 (버전 추가)가 잘 반영되었는지 확인
[root@m-k8s-ys vagrant]# kubectl describe pods -n metallb-system | grep Image:
Image: metallb/controller:v0.8.2
Image: metallb/speaker:v0.8.2
Image: metallb/speaker:v0.8.2
Image: metallb/speaker:v0.8.2
Image: metallb/speaker:v0.8.2
Image: metallb/speaker:v0.8.2
# 디플로이먼트 및 LB 오브젝트 생성후 테스트
[root@m-k8s-ys vagrant]# kubectl create deployment echo-ip --image=sysnet4admin/echo-ip
deployment.apps/echo-ip created
[root@m-k8s-ys vagrant]# kubectl expose deployment echo-ip --type=LoadBalancer --port=80
service/echo-ip exposed
# 실습내용 삭제
[root@m-k8s-ys vagrant]# kustomize build | kubectl delete -f -
namespace "metallb-system" deleted
serviceaccount "controller" deleted
serviceaccount "speaker" deleted
podsecuritypolicy.policy "speaker" deleted
role.rbac.authorization.k8s.io "config-watcher" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrole.rbac.authorization.k8s.io "metallb-system:speaker" deleted
rolebinding.rbac.authorization.k8s.io "config-watcher" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:controller" deleted
clusterrolebinding.rbac.authorization.k8s.io "metallb-system:speaker" deleted
configmap "config" deleted
deployment.apps "controller" deleted
daemonset.apps "speaker" deleted
[root@m-k8s-ys vagrant]# kubectl delete service echo-ip
service "echo-ip" deleted
[root@m-k8s-ys vagrant]# kubectl delete deployment echo-ip
deployment.apps "echo-ip" deleted
헬름(helm)은 별도로 정리진행예정이다.
참고자료
= 서적 - 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커, 길벗 - 제 5장
'Docker & Kubernetes' 카테고리의 다른 글
쿠버네티스(Kubernetes) - 젠킨스(jenkins) 알아보기 (0) | 2022.07.16 |
---|---|
쿠버네티스(Kubernetes) - 헬름으로 배포 간편화와 젠킨스 설치까지 (0) | 2022.04.26 |
쿠버네티스(Kubernetes) - k8s에서 Docker 컨테이너 사용하기 (0) | 2022.04.05 |
Docker - DockerFile (0) | 2022.04.05 |
쿠버네티스(Kubernetes) - 오브젝트 (0) | 2022.03.27 |