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 |
으로 접속하면 위와 같이 비용 관련된 정보를 웹으로 확인할 수 있다.
나도 비용이 발생됐는데, 생각치 못했던 거라 실습하고 바로 삭제했다.......
다들 주의하자.
나도 내가 직접 설치하고 확인해보는건 처음이라 두서없이 작성했는데,
그래도 중요한 내용은 다 들어있으니 참고하자.