brunch

EKS 8탄-9. Observability-9/17

EKS 8탄 - 4주차

by Master Seo


본 내용은 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분 걸림)

1100 10.png




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

감사합니다.

1100 cf.png


매거진의 이전글EKS8탄-8.EKS Observability-8/17