brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 17. 2023

EKS 8탄-9. Observability-9/17

EKS 8탄 - 4주차


본 내용은 CloudNet 주말 스터디 내용을 참고로 작성되었습니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  

계속 테스트하며  내용과 설명이 업데이트 됩니다.


목표

메트릭 수집과 알람 기능 구현

프로메테우스-스택 설치  (kube-prometheus-stack)

그라파나 사용



<0> 선수 조건

<1> 프로메테우스 및 프로메테우스 오퍼레이터를 이용하여 메트릭 수집과 알람  이론

<2> 프로메테우스-스택  실습  (kube-prometheus-stack)

<3> 프로메테우스 기본 사용

<4> 그라파나 - 시각화

<5> 대시보드

<6> nginx web server 에서 수집하고자 한다.

<7> 그라파나 얼럿 Alert  기능




<0> 선수 조건



1

EKS 설치

myeks



cloudformation에서 바로 cluster가 설치되는게 보여야함.






 k ns default




2

external dns , kubeops-view , load-balancer-controller  설치 필요.


https://brunch.co.kr/@topasvga/3239




3

수동설치는 ?

load-balancer-controller 수동설치

EFS csi driver 수동설치  = 사용 필요시 설치








<1> 프로메테우스 및 프로메테우스 오퍼레이터를 이용하여 메트릭 수집과 알람  이론


1

참고 블로그

https://malwareanalysis.tistory.com/566



2

오픈 소스

Pull 방식으로  데이터를 가져 온다.

Prometheus is an open-source systems monitoring and alerting toolkit originally

pull model over HTTP



3

구성도

수집 정보가 node에 저장되면, 가시화는 그라파나를 사용한다.


https://prometheus.io/docs/introduction/overview/







<2> 프로메테우스-스택  실습  (kube-prometheus-stack)


프로메테우스 스택으로 설치한다.

프로메테우스와 그라파나를 한번에 설치하자.

모니터링에 필요한 여러 요소를 단일 차트(스택)으로 제공.



1

# 모니터링 네임스페이스를 만든다.


kubectl create ns monitoring


k ns

default

kube-node-lease

kube-public

kube-system

monitoring



2

다른 터미널에서 모니터링~

watch kubectl get pod,pvc,svc,ingress -n monitoring




3

# 사용 리전의 인증서 ARN 확인

aws console 로그인


Cert manager에서  본인 도메인에 대해 인증함

*.masterseo1.link 설정함.  issued (확인 됨) 필요



CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`


echo $CERT_ARN

arn:aws:acm:ap-northeast-2:476286675138:certificate/b58f160e-7c6f-4ee8-850e-9bb274081129 




4

# repo 추가

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts



5

프로메테우스와 그라파나를 한번에 설치하자.

alertmanager:    // 얼럿 매니저는 사용 안함.



# 파라미터 파일 생성


cat <<EOT > monitor-values.yaml

prometheus:

  prometheusSpec:

    podMonitorSelectorNilUsesHelmValues: false

    serviceMonitorSelectorNilUsesHelmValues: false

    retention: 5d

    retentionSize: "10GiB"


  ingress:

    enabled: true

    ingressClassName: alb

    hosts:

      - prometheus.$MyDomain

    paths:

      - /*

    annotations:

      alb.ingress.kubernetes.io/scheme: internet-facing

      alb.ingress.kubernetes.io/target-type: ip

      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'

      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN

      alb.ingress.kubernetes.io/success-codes: 200-399

      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb

      alb.ingress.kubernetes.io/group.name: study

      alb.ingress.kubernetes.io/ssl-redirect: '443'


grafana:

  defaultDashboardsTimezone: Asia/Seoul

  adminPassword: prom-operator


  ingress:

    enabled: true

    ingressClassName: alb

    hosts:

      - grafana.$MyDomain

    paths:

      - /*

    annotations:

      alb.ingress.kubernetes.io/scheme: internet-facing

      alb.ingress.kubernetes.io/target-type: ip

      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'

      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN

      alb.ingress.kubernetes.io/success-codes: 200-399

      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb

      alb.ingress.kubernetes.io/group.name: study

      alb.ingress.kubernetes.io/ssl-redirect: '443'


defaultRules:

  create: false

kubeControllerManager:

  enabled: false

kubeEtcd:

  enabled: false

kubeScheduler:

  enabled: false

alertmanager:

  enabled: false

EOT



# alertmanager:    // 얼럿 매니저는 사용 안함.

#   ingress:

#     enabled: true

#     ingressClassName: alb

#     hosts:

#       - alertmanager.$MyDomain

#     paths:

#       - /*

#     annotations:

#       alb.ingress.kubernetes.io/scheme: internet-facing

#       alb.ingress.kubernetes.io/target-type: ip

#       alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'

#       alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN

#       alb.ingress.kubernetes.io/success-codes: 200-399

#       alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb

#       alb.ingress.kubernetes.io/group.name: study

#       alb.ingress.kubernetes.io/ssl-redirect: '443'




// 5일 , 10GiB 데이터까지 저장한다.

 retention: 5d

 retentionSize: "10GiB"



cat monitor-values.yaml | yh






6

# 배포



helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.0.0 -f monitor-values.yaml --namespace monitoring


(5분 걸림)


5분후 

그라파나 접속 요망~

https://grafana.taeho11.co.kr/



잘 안되면  삭제 후  다른 버전으로 재 실행


삭제

helm uninstall -n monitoring kube-prometheus-stack



or



// 인터벌을 15초로 줄이는 경우 


helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.27.2 --set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' -f monitor-values.yaml --namespace monitoring


(5분 걸림)




7

 k ns monitoring

watch -d kubectl get ingress,deploy,svc,pods





모니터링 확인!!!


kubectl get pod,svc,ingress -n monitoring


프로메테우스와 그라파나 도메인으로 인그레스가 나옴.

L7은 1개이다 =  인그레스 이름은 같다.





8

alb 확인

AWS 콘솔에서 alb 확인하자~


접속


https://prometheus.masterseo1.link/graph?g0.expr=&g0.tab=1&g0.stacked=0&g0.show_exemplars=0&g0.range_input=1h



https://grafana.masterseo1.link/login




9


# 확인

# alertmanager-0 : 사전에 정의한 정책 기반(예: 노드 다운, 파드 Pending 등)으로 시스템 경고 메시지를 생성 후 경보 채널(슬랙 등)로 전송


# grafana : 프로메테우스는 메트릭 정보를 저장하는 용도로 사용하며, 그라파나로 시각화 처리


# prometheus-0 : 모니터링 대상이 되는 파드는 ‘exporter’라는 별도의 사이드카 형식의 파드에서 모니터링 메트릭을 노출, pull 방식으로 가져와 내부의 시계열 데이터베이스에

저장


# node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출


# operator : 시스템 경고 메시지 정책(prometheus rule), 애플리케이션 모니터링 대상 추가 등의 작업을 편리하게 할수 있게 CRD 지원


# kube-state-metrics : 쿠버네티스의 클러스터의 상태(kube-state)를 메트릭으로 변환하는 파드




10

helm list -n monitoring

--------------------------------------------------------

NAME          NAMESPACE       REVISION        UPDATED       STATUS          CHART            APP VERSION

kube-prometheus-stack   monitoring      1    2023-05-18 16:06:34.696600102 +0900 KST deployed        kube-prometheus-stack-45.27.2   v0.65.1



kubectl get pod,svc,ingress -n monitoring


kubectl get-all -n monitoring


kubectl get prometheus,servicemonitors -n monitoring


kubectl get crd | grep monitoring






11

삭제 - 아래 그라파나등 모든 테스트 완료 후 삭제 요망


# helm 삭제

helm uninstall -n monitoring kube-prometheus-stack


# crd 삭제

kubectl delete crd alertmanagerconfigs.monitoring.coreos.com

kubectl delete crd alertmanagers.monitoring.coreos.com

kubectl delete crd podmonitors.monitoring.coreos.com

kubectl delete crd probes.monitoring.coreos.com

kubectl delete crd prometheuses.monitoring.coreos.com

kubectl delete crd prometheusrules.monitoring.coreos.com

kubectl delete crd servicemonitors.monitoring.coreos.com

kubectl delete crd thanosrulers.monitoring.coreos.com








<3> 프로메테우스 기본 사용



1

모니터링 대상이 되는 서비스는 일반적으로 자체 웹 서버의 /metrics 엔드포인트 경로에 다양한 메트릭 정보를 노출




2

# 아래 처럼 프로메테우스가 각 서비스의 9100 접속하여 메트릭 정보를 수집


kubectl get node -owide


kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter



3

# 노드의 9100번의 /metrics 접속 시 다양한 메트릭 정보를 확인할수 있음

: 마스터 이외에 워커노드도 확인 가능


수집하는 정보는 ?


ssh ec2-user@$N1 curl -s localhost:9100/metrics


------------

:

# TYPE promhttp_metric_handler_requests_in_flight gauge

promhttp_metric_handler_requests_in_flight 1

# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.

# TYPE promhttp_metric_handler_requests_total counter

promhttp_metric_handler_requests_total{code="200"} 20

promhttp_metric_handler_requests_total{code="500"} 0

promhttp_metric_handler_requests_total{code="503"} 0




4

프로메테우스 ingress 도메인으로 웹 접속


# ingress 확인

kubectl get ingress -n monitoring kube-prometheus-stack-prometheus


NAME                               CLASS   HOSTS                        ADDRESS   PORTS   AGE

kube-prometheus-stack-prometheus   alb     prometheus.masterseo0.link             80      35m



kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus



5

# 프로메테우스 ingress 도메인으로 웹 접속

echo -e "Prometheus Web URL = https://prometheus.$MyDomain"


:kube-system) [root@myeks-bastion-EC2 ~]# echo -e "Prometheus Web URL = https://prometheus.$MyDomain"

Prometheus Web URL = https://prometheus.masterseo1.link


https://prometheus.taeho11.co.kr/graph



# 웹 상단 주요 메뉴 설명

1. 경고(Alert) : 사전에 정의한 시스템 경고 정책(Prometheus Rules)에 대한 상황

2. 그래프(Graph) : 프로메테우스 자체 검색 언어 PromQL을 이용하여 메트릭 정보를 조회 -> 단순한 그래프 형태 조회

3. 상태(Status) : 경고 메시지 정책(Rules), 모니터링 대상(Targets) 등 다양한 프로메테우스 설정 내역을 확인 > 버전(2.42.0)

4. 도움말(Help)




6

현재 각 Target 클릭 시 메트릭 정보 확인 : 아래 예시  ?


kube-proxy 확인


k get nodes -w

NAME                                               STATUS   ROLES    AGE   VERSION

ip-192-168-1-150.ap-northeast-2.compute.internal   Ready    <none>   16h   v1.24.13-eks-0a21954

ip-192-168-2-82.ap-northeast-2.compute.internal    Ready    <none>   16h   v1.24.13-eks-0a21954

ip-192-168-3-229.ap-northeast-2.compute.internal   Ready    <none>   16h   v1.24.13-eks-0a21954



# serviceMonitor/monitoring/kube-prometheus-stack-kube-proxy/0 (3/3 up) 중

노드1에 Endpoint 접속 확인 (접속 주소는 실습 환경에 따라 다름)


curl -s http://192.168.1.150:10249/metrics | tail -n 5


rest_client_response_size_bytes_bucket{host="006fc3f3f0730a7fb3fdb3181f546281.gr7.ap-northeast-2.eks.amazonaws.com",verb="POST",le="4.194304e+06"} 1

rest_client_response_size_bytes_bucket{host="006fc3f3f0730a7fb3fdb3181f546281.gr7.ap-northeast-2.eks.amazonaws.com",verb="POST",le="1.6777216e+07"} 1

rest_client_response_size_bytes_bucket{host="006fc3f3f0730a7fb3fdb3181f546281.gr7.ap-northeast-2.eks.amazonaws.com",verb="POST",le="+Inf"} 1

rest_client_response_size_bytes_sum{host="006fc3f3f0730a7fb3fdb3181f546281.gr7.ap-northeast-2.eks.amazonaws.com",verb="POST"} 626

rest_client_response_size_bytes_count{host="006fc3f3f0730a7fb3fdb3181f546281.gr7.ap-northeast-2.eks.amazonaws.com",verb="POST"} 1



api-server 확인

# serviceMonitor/monitoring/kube-prometheus-stack-api-server/0 (2/2 up) 중 Endpoint 접속 확인 (접속 주소는 실습 환경에 따라 다름)

>> 해당 IP주소는 어디인가요?, 왜 apiserver endpoint는 2개뿐인가요? , 아래 메트릭 수집이 되게 하기 위해서는 어떻게 하면 될까요?


curl -s https://192.168.1.53/metrics | tail -n 5

...



code dns 확인

# 그외 다른 타켓의 Endpoint 로 접속 확인 가능 : 예시) 아래는 coredns 의 Endpoint 주소 (접속 주소는 실습 환경에 따라 다름)


curl -s http://192.168.1.75:9153/metrics | tail -n 5

# TYPE process_virtual_memory_bytes gauge

process_virtual_memory_bytes 7.79350016e+08

# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.

# TYPE process_virtual_memory_max_bytes gauge

process_virtual_memory_max_bytes 1.8446744073709552e+19



exporter가 준비해준다.

프로메테우스가 정보를 가져온다.






<4> 그라파나 - 시각화


1

소개

그라파나는 실제 데이터를 가지고 있지는 않다.

프로메테우스의 데이터를 가져와 시각화 하는 툴이다.

https://grafana.com/docs/grafana/latest/introduction/

https://grafana.com/blog/2023/04/26/grafana-9.5-release/



<필수1>


2

admin / prom-operator


# 그라파나 버전 확인

kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version

------------------------------------

grafana cli version 9.5.1

//  

파드내 명령을 실행함. exec -it 파드명.

모니터링 네임스페이스에 있는 , 프로메테우스-스텍-그라파나 파드에 , 그라파나-cli로 버전을 확인함.




# ingress 확인

kubectl get ingress -n monitoring kube-prometheus-stack-grafana

kube-prometheus-stack-grafana   alb     grafana.masterseo0.link             80      38m



3

kubectl describe ingress -n monitoring kube-prometheus-stack-grafana



4

# ingress 도메인으로 웹 접속 : 기본 계정 - admin / prom-operator


echo -e "Grafana Web URL = https://grafana.$MyDomain"

Grafana Web URL = https://grafana.masterseo1.link



https://grafana.masterseo1.link/login




3

기본 대시보드 제공한다.

프로메테우스를 소스로 선택할수 있도록 들어가 있다.



4

# 서비스 주소 확인

kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus


NAME                                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

service/kube-prometheus-stack-prometheus   ClusterIP   10.100.143.5   <none>        9090/TCP   21m


NAME                                         ENDPOINTS           AGE

endpoints/kube-prometheus-stack-prometheus   192.168.2.93:9090   21m



5

# 테스트용 파드 배포


cat <<EOF | kubectl create -f -

apiVersion: v1

kind: Pod

metadata:

  name: netshoot-pod

spec:

  containers:

  - name: netshoot-pod

    image: nicolaka/netshoot

    command: ["tail"]

    args: ["-f", "/dev/null"]

  terminationGracePeriodSeconds: 0

EOF



kubectl get pod netshoot-pod

NAME           READY   STATUS              RESTARTS   AGE

netshoot-pod   0/1     ContainerCreating   0          2s



(1분후)


# 접속 확인

kubectl exec -it netshoot-pod -- nslookup kube-prometheus-stack-prometheus.monitoring

Server:         10.100.0.10

Address:        10.100.0.10#53

Name:   kube-prometheus-stack-prometheus.monitoring.svc.cluster.local

Address: 10.100.136.167




kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ; echo

*   Trying 10.100.136.167:9090...

* Connected to kube-prometheus-stack-prometheus.monitoring (10.100.136.167) port 9090 (#0)

> GET /graph HTTP/1.1

> Host: kube-prometheus-stack-prometheus.monitoring:9090

> User-Agent: curl/8.0.1

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Thu, 18 May 2023 07:19:05 GMT

< Content-Length: 734

< Content-Type: text/html; charset=utf-8

<

* Connection #0 to host kube-prometheus-stack-prometheus.monitoring left intact

<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><meta name="theme-color" content="#000000"/><script>const GLOBAL_CONSOLES_LINK="",GLOBAL_AGENT_MODE="false",GLOBAL_READY="true"</script><link rel="manifest" href="./manifest.json" crossorigin="use-credentials"/><title>Prometheus Time Series Collection and Processing Server</title><script defer="defer" src="./static/js/main.c1286cb7.js"></script><link href="./static/css/main.cb2558a0.css" rel="stylesheet"></head><body class="bootstrap"><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>




6

# 삭제  

kubectl delete pod netshoot-pod






<5> 대시보드


https://grafana.com/grafana/dashboards/?pg=docs-grafana-latest-dashboards


https://grafana.com/orgs/imrtfm/dashboards



<필수1>


1

왼쪽위 - Dashboard → New → Import → 15757 입력 후 Load ⇒ 데이터소스(Prometheus 선택) 후 Import 클릭



KR] Dashboard → New → Import → 13770 or 17900 입력 후 Load ⇒ 데이터소스(Prometheus 선택) 후 Import 클릭



2

테스트


AWS CNI Metrics 16032

# PodMonitor 배포


cat <<EOF | kubectl create -f -

apiVersion: monitoring.coreos.com/v1

kind: PodMonitor

metadata:

  name: aws-cni-metrics

  namespace: kube-system

spec:

  jobLabel: k8s-app

  namespaceSelector:

    matchNames:

    - kube-system

  podMetricsEndpoints:

  - interval: 30s

    path: /metrics

    port: metrics

  selector:

    matchLabels:

      k8s-app: aws-node

EOF



# PodMonitor 확인

kubectl get podmonitor -n kube-system

NAME              AGE

aws-cni-metrics   25s






<6> nginx web server 에서 수집하고자 한다.


1

https://artifacthub.io/packages/helm/bitnami/nginx


2

# 모니터링

watch -d kubectl get pod


# 파라미터 파일 생성 : 서비스 모니터 방식으로 nginx 모니터링 대상을 등록하고, export 는 9113 포트 사용, nginx 웹서버 노출은 AWS CLB 기본 사용


cat <<EOT > ~/nginx_metric-values.yaml

metrics:

  enabled: true


  service:

    port: 9113


  serviceMonitor:

    enabled: true

    namespace: monitoring

    interval: 10s

EOT


# 배포

helm upgrade nginx bitnami/nginx --reuse-values -f nginx_metric-values.yaml


   echo "NGINX URL: http://nginx.masterseo1.link"



# 확인

kubectl get pod,svc,ep

kubectl get servicemonitor -n monitoring nginx

kubectl get servicemonitor -n monitoring nginx -o json | jq



3

# 메트릭 확인 >> 프로메테우스에서 Target 확인


NGINXIP=$(kubectl get pod -l app.kubernetes.io/instance=nginx -o jsonpath={.items[0].status.podIP})

curl -s http://$NGINXIP:9113/metrics # nginx_connections_active Y 값 확인해보기

curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active


(masterseo1:kube-system) [root@myeks-bastion-EC2 ~]# curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active

nginx_connections_active 1



# nginx 파드내에 컨테이너 갯수 확인

kubectl get pod -l app.kubernetes.io/instance=nginx

kubectl describe pod -l app.kubernetes.io/instance=nginx


(masterseo1:kube-system) [root@myeks-bastion-EC2 ~]# kubectl get pod -l app.kubernetes.io/instance=nginx

NAME                     READY   STATUS    RESTARTS   AGE

nginx-85fc957979-4zv5h   2/2     Running   0          53s



# 접속 주소 확인 및 접속

echo -e "Nginx WebServer URL = https://nginx.$MyDomain"

curl -s https://nginx.$MyDomainkubectl logs deploy/nginx -f


# 반복 접속

while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done




4

NGINX 애플리케이션 모니터링 대시보드 추가


그라파나에 12708 대시보드 추가







<7>  그라파나 얼럿 Alert  기능


1

9.4 릴리즈

https://grafana.com/blog/2023/02/28/grafana-9.4-release/



2

이미지 알림 기능

https://grafana.com/docs/grafana/latest/alerting/manage-notifications/images-in-notifications/



3

얼럿기능


구성도?

https://grafana.com/docs/grafana/latest/alerting/


https://velog.io/@yyw1128/4

https://blog.naver.com/sungwon_200ok/223061416989






<8> kubecost


1

목표

kubecost로 컨테이너 비용에 대해 알아보자.


2

kubecost  개요


https://www.opencost.io/


penCost 링크를 기반으로 구축

쿠버네티스 리소스별 비용 분류 가시화 제공


https://www.kubecost.com/pricing/


가격

Free(메트릭 15일 보존


아키텍처

https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring


수집

https://aws.amazon.com/ko/blogs/containers/aws-and-kubecost-collaborate-to-deliver-cost-monitoring-for-eks-customers/




3

설치와 접속


https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring

https://github.com/kubecost/cost-analyzer-helm-chart/blob/develop/cost-analyzer/values-eks-cost-monitoring.yaml

https://gallery.ecr.aws/kubecost/cost-analyzer


ngress, service(nlb) 통한 접속은 실패 - 테스트 해보세요

bastion ec2를 통한 ssh port forwarding 통한 접속 방식으로 우회


https://docs.kubecost.com/install-and-configure/install/ingress-examples

https://catalog.workshops.aws/eks-immersionday/en-US/kubecost/configure-ingress




4

인그레스를 통한 접속

#

cat <<EOT > cost-values.yaml

global:

  grafana:

    enabled: true

    proxy: false

priority:

  enabled: false

networkPolicy:

  enabled: false

podSecurityPolicy:

  enabled: false

persistentVolume:

    storageClass: "gp3"

prometheus:

  kube-state-metrics:

    disabled: false

  nodeExporter:

    enabled: true

reporting:

  productAnalytics: true

EOT



# kubecost chart 에 프로메테우스가 포함되어 있으니, 기존 프로메테우스-스택은 삭제하자 : node-export 포트 충돌 발생

helm uninstall -n monitoring kube-prometheus-stack



# 배포

kubectl create ns kubecost

helm install kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 1.103.2 --namespace kubecost -f cost-values.yaml



# Ingress 설정


cat <<EOT > kubecost-ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: kubecost-ingress

  annotations:

    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN

    alb.ingress.kubernetes.io/group.name: study

    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'

    alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb

    alb.ingress.kubernetes.io/scheme: internet-facing

    alb.ingress.kubernetes.io/ssl-redirect: "443"

    alb.ingress.kubernetes.io/success-codes: 200-399

    alb.ingress.kubernetes.io/target-type: ip

spec:

  ingressClassName: alb

  rules:

  - host: kubecost.$MyDomain

    http:

      paths:

      - backend:

          service:

            name: kubecost-cost-analyzer

            port:

              number: 9090

        path: /

        pathType: Prefix

EOT

kubectl apply -f kubecost-ingress.yaml -n kubecost




# 배포 확인

kubectl get-all -n kubecost

kubectl get all -n kubecost



# kubecost-cost-analyzer 접속 정보 확인

echo -e "Kubecost Web https://kubecost.$MyDomain"






(선택)


4

#

cat <<EOT > cost-values.yaml

global:

  grafana:

    enabled: true

    proxy: false


priority:

  enabled: false

networkPolicy:

  enabled: false

podSecurityPolicy:

  enabled: false


persistentVolume:

    storageClass: "gp3"


prometheus:

  kube-state-metrics:

    disabled: false

  nodeExporter:

    enabled: true


reporting:

  productAnalytics: true

EOT


# kubecost chart 에 프로메테우스가 포함되어 있으니, 기존 프로메테우스-스택은 삭제하자 : node-export 포트 충돌 발생

helm uninstall -n monitoring kube-prometheus-stack


# 배포

kubectl create ns kubecost

helm install kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 1.103.2 --namespace kubecost -f cost-values.yaml


# 배포 확인

kubectl get-all -n kubecost

kubectl get all -n kubecost



5

# kubecost-cost-analyzer 파드 IP변수 지정 및 접속 확인

CAIP=$(kubectl get pod -n kubecost -l app=cost-analyzer -o jsonpath={.items[0].status.podIP})

curl -s $CAIP:9090



6

# 외부에서 bastion EC2 접속하여 특정 파드 접속 방법 : socat(SOcket CAT) 활용 - 링크

yum -y install socat

socat TCP-LISTEN:80,fork TCP:$CAIP:9090


웹 브라우저에서 bastion EC2 IP로 접속







<9> 삭제


1

helm uninstall -n kube-system kube-ops-view

helm uninstall nginx

helm uninstall botkube --namespace botkube

helm uninstall -n monitoring kube-prometheus-stack



2

클러스터 삭제


eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME


(삭제 10분 걸린다. 시작 8분, 종료 18분 = 10분 걸림)




3

삭제

# EKS Control Plane 로깅(CloudWatch Logs) 비활성화

eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve




4

# 로그 그룹 삭제 : 컨트롤 플레인

aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster



5

# 로그 그룹 삭제 : 데이터 플레인


aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/application


aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/dataplane


aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/host


aws logs delete-log-group --log-group-name /aws/containerinsights/$CLUSTER_NAME/performance






다음

https://brunch.co.kr/@topasvga/3296



https://brunch.co.kr/@topasvga/3217

감사합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari