favicon Jay Lee DevLog

728x90
300x250

FinOps는 클러스터에서 발생하는 비용을 모니터링하고

비효율적인 부분을 GUI를 통해 확인하여 수정할 수 있도록 해주는 일이라고 보면 된다.

이를 한번 간단하게 테스트용으로 구현해보자.

 


1. Kubecost와 Prometheus 설치

이 분야는 나도 잘 알지는 못하는 분야라 처음 설치해보고 따라해보고 있다.

Kubecost와 Prometheus에 대한 설명은 인터넷을 찾아보면 되고, 

나는 설치과정과 설치과정에서의 오류를 해결하는 과정에 대해 설명해보려 한다.

 

* 전제 조건

  • k8s 클러스터가 생성되어 있어야 함. kubectl 명령 실행 가능한 상태.

 

먼저 Helm을 설치해야 한다.

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version

 

이후 heml repository 추가

helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update

 

마지막으로 Kubecost + Prometheus 설치

helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost --create-namespace \
  --set kubecostToken="demo" \
  --set prometheus.kubeStateMetrics.enabled=true \
  --set prometheus.nodeExporter.enabled=true \
  --set global.prometheus.enabled=true

 

여기까지 하고 pod 상태를 확인해봤더니,

 

kubecost-cost-analyzer와 kubecost-prometheus-server 가 pending에서 넘어가질 않고 있었다.

pending 내용을 확인해보니,

kubectl describe pod -n kubecost kubecost-prometheus-server-bd4596df8-tg6lt

unbound immediate PersistentVolumeClaims

이런 에러가 발생하고 있었다.

에러의 원인은 PersistentVolumeClaim(PVC)이 아직 바인딩되지 않아서 생긴 문제였다.

 

아래는 해당 문제를 해결해 나가는 과정이다.

- default StorageClass 확인하기

kubectl get storageclass

StorageClass가 존재해야 PVC가 바인딩을 한다고 한다.

나는 없는 상태였다.

 

- StorageClass 만들어주기

yaml 파일을 통해 만들어주면 된다.

아무 경로에나 아래 파일을 추가하자.

vim local-path-storageclass.yaml
# local-path-storageclass.yaml 
apiVersion: storage.k8s.io/v1 
kind: StorageClass 
metadata: 
  name: local-path 
  annotations: 
    storageclass.kubernetes.io/is-default-class: "true" 
provisioner: kubernetes.io/no-provisioner 
volumeBindingMode: WaitForFirstConsumer

 

만들었으면, 실행해주자.

kubectl apply -f local-path-storageclass.yaml

위처럼 추가된 모습을 볼 수 있다.

 

- pv 만들어 주기

kubectl get pvc -n kubecost -o yaml

해당 명령을 실행하면,

이렇게 storage의 사이즈를 알아올 수 있는데

이 사이즈와 같은 사이즈, 혹은 더 큰 사이즈로 pv를 만들어줘야 한다.

이거 몰라서 개고생했다.

 

pv도 yaml 파일 만들어서 실행해 줄거다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-kubecost-analyzer
spec:
  capacity:
    storage: 32Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  hostPath:
    path: "/mnt/data1" # 해당 경로의 권한이 777로 되어 있어야 한다. 소유권은 nobody로 되어 있어야 한다. 경로 없으면 만들자.

같은 내용으로 이름하고 경로만 바꿔서 1개 더 만들어 줘야한다.

문제가되는 pod는 2개기 때문이다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kubecost-prometheus-server
spec:
  capacity:
    storage: 32Gi # 32gi 이상으로 해야한다.
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  hostPath:
    path: "/mnt/data2" # 해당 경로의 권한이 777로 되어 있어야 한다. 소유권은 nobody로 되어 있어야 한다. 경로 없으면 만들자.

 

이렇게 만들고 나면 아래 명령으로 생성.

kubectl apply -f pv-kubecost-analyzer.yaml
kubectl apply -f kubecost-prometheus-server.yaml

 

위에서 권한은 777로 주지 않으면 아래와 같은 에러가 발생한다.

다른 해결방법도 있을 것 같은데, 나는 아직 잘모르겠다.

이후 정상적으로 생성됐다면,

kubectl get pvc -n kubecost

STATUS가 Bound면 잘 된거다.

 

kubectl get pv

 

이제 다시 pod 확인해보면,

 

잘 실행되고 있는 모습이다.

 

2. Prometheus 실행해보기

9090 포트를 사용하기 때문에 포트포워딩 해주고,

kubectl port-forward -n kubecost deployment/kubecost-cost-analyzer 9090

http://localhost:9090

으로 접속하면 위와 같이 비용 관련된 정보를 웹으로 확인할 수 있다.

 

나도 비용이 발생됐는데, 생각치 못했던 거라 실습하고 바로 삭제했다.......

다들 주의하자.

 

나도 내가 직접 설치하고 확인해보는건 처음이라 두서없이 작성했는데,

그래도 중요한 내용은 다 들어있으니 참고하자.

728x90
반응형

+ Recent posts

/ /

Contact

📧 dlwjdwls60@naver.com


블로그에 내용이 있으면 해당 글을 보여주며, 없으면 내용이 복사된 채로 ChatGPT로 연결됩니다.