본문 바로가기

윈도우 개발환경

쿠버네티스로 MSA DevOps 환경 구축; 7. Helm | Chart - 패키지 만들기

쿠버네티스로 MSA DevOps 환경 구축

1. 로컬 쿠버네티스설치

2. 로컬 컨테이너 Registry

3. Pod, Service, Deployment

4. 포트포워딩 없는 Minikube

5. URL기반 Service - Ingress

6. Helm | Chart - 패키지 설치

7. Helm | Chart - 패키지 만들기

8. ArgoCD - GitOps

8. Chart 패키지 만들기

앞에서는 Helm을 사용해서 Artifactory Hub에 있는 소프트웨어 패키지(Chart)를 설치하는 방법에 대해 정리했었다.

 

이제 내가 개발한 서비스를 Chart 패키지로 만드는 방법에 대해 정리하려고 한다. Chart 패키지로 만드는 이유는, 앞에서 설명한 것처럼, 쿠버네티스에 개발한 소프트웨어를 배포하는 단계를 줄이고 자동화해서 복잡한 마이크로서비스 아키텍처를 쉽게 운영할 수 있도록 하는데 목적이 있다.

a. Helm create명령으로 Chart를 만든다.

helm create <만들 패키지 이름>
ex) helm create microservice-a

 

만들어진 폴더의 내용을 살펴보면, Chart.yaml, value.yaml, charts폴더, templates폴더로 구성된 것을 알 수 있다. charts폴더는 내 Chart가 다른 Chart패키지를 포함하면 들어가는 곳이고, templates는 쿠버네티의 Deployment, Service, Ingress 등에 대한 표준화된 YAML파일들이 있는 곳인데 수정하고 values.yaml을 고치는 것만으로도 원하는 패키지를 만들 수 있다.

 

b. (선택) helm이 만든 Chart를 시험 삼아 테스트해 보자.

helm이 만들어 준 values.yaml파일에는 1개 Pod로 구성된 nginx를 설치하는 정보를 담고 있다.

 

"msa-a"를 Chart 패키지 이름으로 하고 helm을 사용해서 만들어진 패키지를 수정 없이 설치해 보면

 

helm install msa-a ./ --values values.yaml

 

NOTES아래의 내용을 Git Bash에서 차례로 입력해서 실행해서 포트포워딩을 하거나,

 

(아니면, $(kubctl ...)만 빼서 하나씩 CMD에서 실행하고 값을 확인해 보고 포트포워딩 해도 된다.

 

kubectl get pods --namespace default -l "app.kubernetes.io/name=microservice-a,app.kubernetes.io/instance=msa-a" -o jsonpath="{.items[0].metadata.name}"
kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}"

 

브라우저를 열고 http://127.0.0.1:8080을 접속해 보면 ngingx화면이 보인다.

 

c. values.yaml을 내 프로젝트에 맞게 수정한다.

쿠버네티스에서 Ingress, Service, Deployment 등으로 따로 정의하고 생성하던 작업이, Helm Chart를 사용하면  values.yaml하나에 정의할 수 있어, values.yaml파일을 수정하고 install명령을 사용하면 한 번에 진행할 수 있다.

 

Helm create로 자동으로 생성된 values.yaml파일을 수정해서 사용했기 때문에 수정한 부분만 표시했다.

 

  • values.yaml의 deployment에 해당하는 부분을 앞에서 배포한 deployment와 동일하게 수정

 

... <생략>

replicaCount: 2

image:
  repository: "localhost:5000/microservice-a"
  pullPolicy: Always
  # Overrides the image tag whose default is the chart appVersion.
  tag: ""
  
... <생략>

 

tag: ""처럼 지정하지 않으면, Chart.yaml에 있는 appVersion을 사용하기 때문에, Chart.yaml을 수정해서 원하는 버전을 넣는다. 현재 image는 "latest"로 배포가 되어 있기 때문에 "latest"를 넣으면 되지만, Chart.yaml파일에 설명되어 있는 것처럼, 버전을 지정하고 CI/CD를 통해 자동으로 업데이트되도록 구성하는 것이 좋다.

 

  • values.yaml의 service와 ingress에 해당하는 부분을 앞에서 배포한 service, ingress와 동일하게 수정

 

... <생략>

service:
  type: ClusterIP
  port: 8000
  protocol: TCP
  name: http

ingress:
  enabled: true
  className: "nginx"
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  hosts:
    - host: fastapi.test
      paths:
        - path: /myapi(/|$)(.*)
          pathType: ImplementationSpecific
  
  ... <생략>

 

helm의 ingress에서 "/api"를 이미 사용하고 있다는 에러 메시지가 나와 "/myapi"로 수정했다.

추가로 readinessProbe를 따로 정의하거나, livenessProbe를 정의해서 문제가 생기면 다시 만드는 기능을 정의할 수 있다.

 

livenessProbe:
  httpGet:
    path: /
    port: 8000
readinessProbe:
  httpGet:
    path: /
    port: 8000

d. helm install명령으로 배포한다.

  • --dry-run과 --debug를 사용하면 실제 배포를 하지 않고 문제가 없는지만 확인할 수 있다.
helm install --dry-run --debug  msa-a ./ --values values.yaml

 

--debug로 표시된 내용을 보면, helm이 만들어내는 Service.yaml,

 

deployment.yaml,

 

을 포함해서 helm이 쿠버네티스에 사용하는 모든 YAML의 내용을 확인할 수 있다.

 

  • 문제가 없으면 helm install하고 kutctl로 상태를 확인하고, curl로 동작을 확인해 보다.