Namespace별, Pod Name별로 검색이 가능,전체 Pod 수도 표시
특정 Pod를 Click하면 해당 Pod의 기본적인 정보를 표시
대표적으로 Image, Container, Node IP, Pod IP
원시보기를 선택하면 JSON Format으로 구성 정보를 표시
Cluster 주요 구성 요소를 Node별, Namespace별, API Service별로 분류하여 표시
Namespace를 표시
외부와의 접점인 요소들을 표시
서비스와 엔트 포인트의 같이 동일, 연결 지점이라는 의미에서 동일한 것일까?
스토리지 관련 주요 서비스인 StorageClass, CSIDriver, CSINodes, PVC, PV 정보를 표시
EKS의 Service Account List를 표시
service Account와 연동하는 IAM ARN 정보를 포함
권한 관련 Role과 RoleBindings를 표시
RoleBindings에서는 Binded User 정보를 표시
CRD 정보를 표시
기본 설정으로 Control Plane Log는 Off이며, 활성화 하고자 할 경우 AWS WEB Console의 EKS Dashboard에서 Logging Tab의 Manage logging을 통해서 5개 항목 별로 on/off가 가능하다.
$> aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME \
--logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'
$> aws logs describe-log-groups | jq
참고 : aws logs tail은 지난 10분동안 관련된 Cloudwatch streams의 log들을 보여준다.
보다 자세한 사항은 URL 참조 : https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/tail.html
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster | more
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster --follow
# 로그 Stream은 아마도 AWS WEB Console을 참조 해야 할듯
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix <로그 스트림 prefix> --follow
kube로 시작하는 log stream만 표시
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster --log-stream-name-prefix kube-apiserver-audit --follow
kube-apiserver-audit log stream 만 표시
#아래 두 명령어는 여기에서 무슨 의미가 뭐지?
$> kubectl scale deployment -n kube-system coredns --replicas=1
$> kubectl scale deployment -n kube-system coredns --replicas=2
1시간 30분 이전 부터 로그 표시
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m
default는 detailed type
$> aws logs tail /aws/eks/$CLUSTER_NAME/cluster --since 1h30m --format short
단순 로그 나열이 아닌 원하는 데이타를 찾기 위한 검색 명령어를 CloudWatch Insights에서 실행하여 원하는 결과를 확인
보다 자세한 내용은 URL 참조 : https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
fields @timestamp, @message
| filter @message like /NodeNotReady/
| sort @timestamp desc
fields userAgent, requestURI, @timestamp, @message
| filter @logStream ~= "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc
log stream이 "kube-scheduler" 인 경우
fields @timestamp, @message
| filter @logStream ~= "kube-scheduler"
| sort @timestamp desc
log stream이 "authenticator" 인 경우
fields @timestamp, @message
| filter @logStream ~= "authenticator"
| sort @timestamp desc
log stream이 "kube-controller-manager" 인 경우
fields @timestamp, @message
| filter @logStream ~= "kube-controller-manager"
| sort @timestamp desc
$> eksctl utils update-cluster-logging --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --disable-types all --approve
$> aws logs delete-log-group --log-group-name /aws/eks/$CLUSTER_NAME/cluster
The Kubernetes API server exposes a number of metrics that are useful for monitoring and analysis. These metrics are exposed internally through a metrics endpoint that refers to the /metrics HTTP API
$> kubectl get --raw /metrics
example output
...
# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code="200",host="127.0.0.1:21362",method="POST"} 4994
rest_client_requests_total{code="200",host="127.0.0.1:443",method="DELETE"} 1
rest_client_requests_total{code="200",host="127.0.0.1:443",method="GET"} 1.326086e+06
rest_client_requests_total{code="200",host="127.0.0.1:443",method="PUT"} 862173
rest_client_requests_total{code="404",host="127.0.0.1:443",method="GET"} 2
rest_client_requests_total{code="409",host="127.0.0.1:443",method="POST"} 3
rest_client_requests_total{code="409",host="127.0.0.1:443",method="PUT"} 8
# HELP ssh_tunnel_open_count Counter of ssh tunnel total open attempts
# TYPE ssh_tunnel_open_count counter
ssh_tunnel_open_count 0
# HELP ssh_tunnel_open_fail_count Counter of ssh tunnel failed open attempts
# TYPE ssh_tunnel_open_fail_count counter
ssh_tunnel_open_fail_count 0
$> kubectl get --raw /metrics | grep "etcd_db_total_size_in_bytes"
$> kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>100' |sort -g -k 2
$> kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>100' |sort -g -k 2
$> kubectl get --raw=/metrics | grep apiserver_storage_objects |awk '$2>50' |sort -g -k 2
fields userAgent, requestURI, @timestamp, @message
| filter @logStream like /kube-apiserver-audit/
| stats count(*) as count by userAgent
| sort count desc
filter @logStream like /kube-apiserver-audit/
| stats count(*) as count by requestURI, verb, user.username
| sort count desc
fields requestURI
| filter @logStream like /kube-apiserver-audit/
| filter requestURI like /pods/
| filter verb like /patch/
| filter count > 8
| stats count(*) as count by requestURI, responseStatus.code
| filter responseStatus.code not like /500/
| sort count desc
fields @timestamp, userAgent, responseStatus.code, requestURI
| filter @logStream like /kube-apiserver-audit/
| filter requestURI like /pods/
| filter verb like /patch/
| filter requestURI like /name_of_the_pod_that_is_updating_fast/
| sort @timestamp
위 CW Log Insights 명령어가 Control plane Logging off 이후에도 가능한지 확인 필요
-> 확인해 보니 실행 불가,
POD Type으로 배포된 WEB Server에서 생성되는 Log를 확인
$> helm repo add bitnami https://charts.bitnami.com/bitnami
$> CERT_ARN=$(aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text)
$> echo $CERT_ARN
$> echo $MyDomain
$> cat <<EOT > nginx-values.yaml
service:
type: NodePort
ingress:
enabled: true
ingressClassName: alb
hostname: nginx.$MyDomain
path: /*
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: $CLUSTER_NAME-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
EOT
$> cat nginx-values.yaml | yh
$> helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml
$> kubectl get ingress,deploy,svc,ep nginx
$> kubectl get targetgroupbindings # ALB TG 확인
$> echo -e "Nginx WebServer URL = https://nginx.$MyDomain"
$> curl -s https://nginx.$MyDomain
$> kubectl logs deploy/nginx -f
$> while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
컨테이너 환경의 로그 특성 상 지속적이지 않고, 여러 Node에 흩어져 있어 조회가 용이하지 않아, 일반적으로 로그들을 표준 출력/에러로 link로 해서 kubectl log 명령어로 통합 조회가 가능하게 한다.
access.log는 표준 출력으로, error.log는 표준 에러로 출력
$> kubectl exec -it deploy/nginx -- ls -l /opt/bitnami/nginx/logs/
$> cat /etc/kubernetes/kubelet-config.yaml
왜 파일이 없다고 하지?
$> ssh ec2-user@$N1 sudo tree /var/log/containers
$> ssh ec2-user@$N1 sudo ls -al /var/log/containers
$> ssh ec2-user@$N3 sudo tail -f /var/log/pods/[pod]/nginx/0.log
$> ssh ec2-user@$N1 sudo tree /var/log/ -L 1
N1 sudo tail /var/log/dmesg
N1 sudo tail /var/log/secure
N1 sudo tail /var/log/messages

### 3.1.2.3 dataplane log source 확인(/var/log/journal for kubelet.service, kubeproxy.service, and docker.service), 쿠버네티스 데이터플레인 로그
$> ssh ec2-user@$N1 sudo tree /var/log/journal -L 1
$> ssh ec2-user@$N1 sudo ls -la /var/log/journal
$> ssh ec2-user@$N1 sudo journalctl -x -n 200
$> ssh ec2-user@$N1 sudo journalctl -f
$> FluentBitHttpServer='On'
$> FluentBitHttpPort='2020'
$> FluentBitReadFromHead='Off'
$> FluentBitReadFromTail='On'
$> curl -s https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/quickstart/cwagent-fluent-bit-quickstart.yaml | sed 's/{{cluster_name}}/'${CLUSTER_NAME}'/;s/{{region_name}}/'${AWS_DEFAULT_REGION}'/;s/{{http_server_toggle}}/"'${FluentBitHttpServer}'"/;s/{{http_server_port}}/"'${FluentBitHttpPort}'"/;s/{{read_from_head}}/"'${FluentBitReadFromHead}'"/;s/{{read_from_tail}}/"'${FluentBitReadFromTail}'"/' | kubectl apply -f -
$> kubectl get-all -n amazon-cloudwatch
$> kubectl get ds,pod,cm,sa -n amazon-cloudwatch
$> kubectl describe clusterrole cloudwatch-agent-role fluent-bit-role
$> kubectl describe clusterrolebindings cloudwatch-agent-role-binding fluent-bit-role-binding
$> kubectl -n amazon-cloudwatch logs -l name=cloudwatch-agent -f
$> kubectl -n amazon-cloudwatch logs -l k8s-app=fluent-bit -f # 파드 로그 확인
t : tcp, l: listening socket, p : socket 을 사용하는 프로세스의 정보를 표시
자세한 정보는 URL 참조 : https://www.lesstif.com/lpt/linux-socket-ss-socket-statistics-91947283.html
Node별 fluent-bit socket status
$> ssh ec2-user@$N1 sudo ss -tnlp | grep fluent-bit
$> kubectl describe cm cwagentconfig -n amazon-cloudwatch
$> kubectl describe -n amazon-cloudwatch ds cloudwatch-agent
$> ssh ec2-user@$N1 sudo tree /dev/disk
$> kubectl get cm -n amazon-cloudwatch fluent-bit-cluster-info -o yaml | yh
설정 부분 구성 : application-log.conf , dataplane-log.conf , fluent-bit.conf , host-log.conf , parsers.conf
$> kubectl describe cm fluent-bit-config -n amazon-cloudwatch
$> kubectl describe -n amazon-cloudwatch ds fluent-bit
$> curl -s https://nginx.$MyDomain
$> yum install -y httpd
#ab -c 클라이언트수 -n 요청수 -t 시간 URL
$> ab -c 500 -n 30000 https://nginx.$MyDomain/
$> kubectl logs deploy/nginx -f
상세한 Query는 URL 참조 : https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/application
stats count() as error_count by kubernetes.container_name
| filter stream="stderr"
| sort error_count desc
#로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/dataplane
fields @timestamp, @message, ec2_instance_id
| filter message =~ /.*(E|W)[0-9]{4}.*/ and ec2_instance_id="<YOUR INSTANCE ID>"
| sort @timestamp desc
#로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/dataplane
fields @timestamp, @message, ec2_instance_id
| filter message =~ /.*(E|W)[0-9]{4}.*/
| stats count(*) as error_count by ec2_instance_id
#로그 그룹 선택 : /aws/containerinsights/<CLUSTER_NAME>/performance
STATS avg(node_cpu_utilization) as avg_node_cpu_utilization by NodeName
| SORT avg_node_cpu_utilization DESC
STATS avg(number_of_container_restarts) as avg_number_of_container_restarts by PodName
| SORT avg_number_of_container_restarts DESC
fields @timestamp, @message
| sort @timestamp desc
| filter Type="Pod"
| stats min(pod_number_of_containers) as requested, min(pod_number_of_running_containers) as running, ceil(avg(pod_number_of_containers-pod_number_of_running_containers)) as pods_missing by kubernetes.pod_name
| sort pods_missing desc
stats avg(cluster_failed_node_count) as CountOfNodeFailures
| filter Type="Cluster"
| sort @timestamp desc
stats pct(container_cpu_usage_total, 50) as CPUPercMedian by kubernetes.container_name
| filter Type="Container"
| sort CPUPercMedian desc
AWS WEB Console에서 Container Insights의 메뉴 확인
Metric-server는 사용자가 요청한 kubectl top 명령어를 api-server로부터 받아 ,각 Pod(Container)의 자원 사용량을 정보를 취합하는 cAdvisor에서 정보를 요청하는 kubelet에서 정보를 받아 최종적으로 사용자에게 취합 결과를 전달한다.
$> kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
$> kubectl get pod -n kube-system -l k8s-app=metrics-server
$> kubectl api-resources | grep metrics
$> kubectl get apiservices |egrep '(AVAILABLE|metrics)'
kubectl top 명령어는 Nodes or Pods의 자원 소모량을 보여주는 명령어로 자세한 설명은 URL 참조: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#top
$> kubectl top node
$> kubectl top pod -A
$> kubectl top pod -n kube-system --sort-by='cpu'
$> kubectl top pod -n kube-system --sort-by='memory'
kwatch helps you monitor all changes in your Kubernetes(K8s) cluster, detects crashes in your running apps in realtime, and publishes notifications to your channels (Slack, Discord, etc.) instantly
보다 자세한 설명은 URL 참조 : https://kwatch.dev/
개인 Slack Channel 백수로 메시지 전송
$> cat <<EOT > ~/kwatch-config.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kwatch
namespace: kwatch
data:
config.yaml: |
alert:
slack:
webhook: 'https://hooks.slack.com/services/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'
title: $NICK-EKS
#text:
pvcMonitor:
enabled: true
interval: 5
threshold: 70
EOT
$> kubectl apply -f kwatch-config.yaml
$> kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.3/deploy/deploy.yaml
$> watch kubectl get pod
$> kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
$> kubectl get events -w
$> kubectl delete pod nginx-19
$> kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.8.3/deploy/deploy.yaml
BotKube는 Kubernetes 클러스터 모니터링 및 디버깅을위한 메시징 봇이며, Slack, Mattermost, Microsoft Teams 등을 지원하고 메신저에서 kubectl 을 통한 명령도 가능
보다 자세한 사항은 URL 참조 : https://botkube.io/
아래 TOKEN 정보는 블로그에서는 보이지 않게 표시
자세한 사항은 URL 참조 : https://docs.botkube.io/installation/slack/
$> export SLACK_API_BOT_TOKEN='xoxb-5293467881940-5291085511123-Mnm7wL6XNNyOJIlgwHcYbNuM'
$> export SLACK_API_APP_TOKEN='xapp-1-A058XQW2VQR-5291233622130-93fad117387b75eb1b3662b63c851ed414f1ca2cafc2d88201016047311c969e'
$> helm repo add botkube https://charts.botkube.io
$> helm repo update
Botkube helm chart 관련 상세한 Parmaeter 부분은 URL 참조 : https://docs.botkube.io/next/configuration/helm-chart-parameters/
#이건 뭔지 모르겠네..
$> export ALLOW_KUBECTL=true
# enables `helm` commands execution
$> export ALLOW_HELM=true
#Slack channel name without '#' prefix where you have added Botkube and want to receive notifications in
$> export SLACK_CHANNEL_NAME=백수들
$> cat <<EOT > botkube-values.yaml
actions:
'describe-created-resource': # kubectl describe
enabled: true
'show-logs-on-error': # kubectl logs
enabled: true
executors:
k8s-default-tools:
botkube/helm:
enabled: true
botkube/kubectl:
enabled: true
EOT
$> helm install --version v1.0.0 botkube --namespace botkube --create-namespace \
--set communications.default-group.socketSlack.enabled=true \
--set communications.default-group.socketSlack.channels.default.name=${SLACK_CHANNEL_NAME} \
--set communications.default-group.socketSlack.appToken=${SLACK_API_APP_TOKEN} \
--set communications.default-group.socketSlack.botToken=${SLACK_API_BOT_TOKEN} \
--set settings.clusterName=${CLUSTER_NAME} \
--set 'executors.k8s-default-tools.botkube/kubectl.enabled'=${ALLOW_KUBECTL} \
--set 'executors.k8s-default-tools.botkube/helm.enabled'=${ALLOW_HELM} \
-f botkube-values.yaml botkube/botkube
@Botkube ping
@Botkube status notifications
@Botkube k get pod
@Botkube kc get pod --namespace kube-system
@Botkube kubectl get pod --namespace kube-system -o wide
@Botkube kubectl
$> watch kubectl get pod
$> kubectl apply -f https://raw.githubusercontent.com/junghoon2/kube-books/main/ch05/nginx-error-pod.yml
$> kubectl get events -w
@Botkube k get pod
$> kubectl delete pod nginx-19
$> helm uninstall botkube --namespace botkube
kubenetis system의 자원의 상태를 감시하고 alert 메시지를 발생 시키는 open source monitoring solution
service discvery : 모니터링 대상을 service endpoint로 등록하여, 자동으로 변경 내역을 감지
pull 방식 : prometheus server가 모니터링 대상의 정보를 pull 방식으로 획득
TSDB(Time-series database) 사용 :감시 대상의 Metric 데이터를 시간과 값이 한쌍을 이루는 데이터 형태로 관리하여 시간 순차적으로 저장하는 시계열 데이터 베이스를 사용
자체 검색 언어 PromQL 제공 : 다양한 데이터 조회가 가능하며 , 이를 그래프로 표시가 가능
모니터링에 필요한 여러 요소를 스택(단일 Chart)으로 제공
$> kubectl create ns monitoring
$>watch kubectl get pod,pvc,svc,ingress -n monitoring
$> CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
$> echo $CERT_ARN
$> helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$> 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
# 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'
EOT
$> 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
$> helm list -n monitoring
$> kubectl get pod,svc,ingress -n monitoring
$> kubectl get-all -n monitoring
$> kubectl get prometheus,servicemonitors -n monitoring
$> kubectl get crd | grep monitoring
Promethus Server는 각 감시 대상의 Node에 HTTP /metrics:9100 GET 방식으로 Metric 정보를 조회하여 TSDB에 저장
$> kubectl get node -owide
$> kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter
$> ssh ec2-user@$N1 curl -s localhost:9100/metrics
$> kubectl get ingress -n monitoring kube-prometheus-stack-prometheus
$> kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus
$> echo -e "Prometheus Web URL = https://prometheus.$MyDomain"
TSDB 데이타를 시각화, Alert 메시지 생성, 사용자 Dashboard 생성
Grafana는 자체 DB를 가지지 않으며, 이번 실습에서는 Promethus에서 생성한 TSDB를 참조
$> kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version
$> kubectl get ingress -n monitoring kube-prometheus-stack-grafana
$> kubectl describe ingress -n monitoring kube-prometheus-stack-grafana
MyDomain"
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
$> kubectl get pod,svc,ep
```

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

### 6.2.5 nginx 파드내에 컨테이너 갯수 확인
promethus exporter container가 sidecar 형식으로 추가가 되어 container 갯수가 2개
$> kubectl get pod -l app.kubernetes.io/instance=nginx

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

### 6.2.6 메트릭 확인 >> 프로메테우스에서 Target 확인
(kubectl get pod -l app.kubernetes.io/instance=nginx -o jsonpath={.items[0].status.podIP})
NGINXIP:9113/metrics

NGINXIP:9113/metrics | grep ^nginx_connections_active

### 6.2.7 NGINX 접속 및 접속 로그 확인
MyDomain"

MyDomain
$> kubectl logs deploy/nginx -f
## 6.3 Promethus Dashboard에 Nginx Target 등록
상위 메뉴 Status -> Targets 메뉴 선택후

