Dashboard를 꾸미기 위해서는 먼저 Container Insights를 해야합니다.
에러가 뜰경우 Node에 CloudwatchAgentServer Policy가 Attach되어있는 지 확인하도록 한다
Container Insights를 지원하는 리전 중 하나에 노드가 연결되어 작동하는 Amazon EKS 또는 Kubernetes 클러스터있어야합니다.
kubectl을 설치하여 실행되어야합니다.
작업자 노드의 IAM 역할에 정책을 연결합니다. 이는 Amazon EKS 클러스터와 다른 Kubernetes 클러스터 모두에 적용됩니다. 정책은 “CloudWatchAgentServerPolicy” 연결되어야합니다.
클러스터 서비스 계정의 IAM 역할을 사용하고 이 역할에 정책을 연결합니다. 이는 Amazon EKS 클러스터에만 적용됩니다.
mkdir -p cloudwatch/cloudwatchagent && cd cloudwatch/cloudwatchagent
cat << EOF > cloudwatch.yaml
apiVersion: v1
kind: Namespace
metadata:
name: amazon-cloudwatch
labels:
name: amazon-cloudwatch
EOF
kubectl apply -f cloudwatch.yaml
cat << EOF > cwagentserviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cloudwatch-agent
namespace: amazon-cloudwatch
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cloudwatch-agent-role
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "endpoints"]
verbs: ["list", "watch"]
- apiGroups: ["apps"]
resources: ["replicasets"]
verbs: ["list", "watch"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["nodes/proxy"]
verbs: ["get"]
- apiGroups: [""]
resources: ["nodes/stats", "configmaps", "events"]
verbs: ["create"]
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["cwagent-clusterleader"]
verbs: ["get","update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cloudwatch-agent-role-binding
subjects:
- kind: ServiceAccount
name: cloudwatch-agent
namespace: amazon-cloudwatch
roleRef:
kind: ClusterRole
name: cloudwatch-agent-role
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f cwagentserviceaccount.yaml
cat << EOF > configmap.yaml
apiVersion: v1
data:
cwagentconfig.json: |
{
"logs": {
"metrics_collected": {
"kubernetes": {
"cluster_name": "{{cluster_name}}", //ClusterName을 입력해야합니다.
"metrics_collection_interval": 60
}
},
"force_flush_interval": 5
}
}
kind: ConfigMap
metadata:
name: cwagentconfig
namespace: amazon-cloudwatch
EOF
kubectl apply -f configmap.yaml
cat << EOF > cloudwatchagent.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cloudwatch-agent
namespace: amazon-cloudwatch
spec:
selector:
matchLabels:
name: cloudwatch-agent
template:
metadata:
labels:
name: cloudwatch-agent
spec:
containers:
- name: cloudwatch-agent
image: amazon/cloudwatch-agent:1.247354.0b251981
resources:
limits:
cpu: 200m
memory: 200Mi
requests:
cpu: 200m
memory: 200Mi
# Please don't change below envs
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: HOST_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: K8S_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: CI_VERSION
value: "k8s/1.3.11"
volumeMounts:
- name: cwagentconfig
mountPath: /etc/cwagentconfig
- name: rootfs
mountPath: /rootfs
readOnly: true
- name: dockersock
mountPath: /var/run/docker.sock
readOnly: true
- name: varlibdocker
mountPath: /var/lib/docker
readOnly: true
- name: containerdsock
mountPath: /run/containerd/containerd.sock
readOnly: true
- name: sys
mountPath: /sys
readOnly: true
- name: devdisk
mountPath: /dev/disk
readOnly: true
volumes:
- name: cwagentconfig
configMap:
name: cwagentconfig
- name: rootfs
hostPath:
path: /
- name: dockersock
hostPath:
path: /var/run/docker.sock
- name: varlibdocker
hostPath:
path: /var/lib/docker
- name: containerdsock
hostPath:
path: /run/containerd/containerd.sock
- name: sys
hostPath:
path: /sys
- name: devdisk
hostPath:
path: /dev/disk/
terminationGracePeriodSeconds: 60
serviceAccountName: cloudwatch-agent
EOF
kubectl apply -f cloudwatchagent.yaml
kubectl get pods -n amazon-cloudwatch
결과: Cloudwatch Agent는 /aws/containerinsights/Cluster_Name/performance라는 LogGroup을 생성하고 이 로그 그룹에 성능 로그 이벤트를 전송합니다. 또한 StatsD 리스너로서 에이전트를 설정하는 경우, 에이전트는 애플리케이션 Pod가 예약된 노드의 IP 주소를 통해 포트 8125에서 StatsD 지표를 수신합니다.
결과(2): Cluster에 대해서 Container에 대한 리소스, 성능 등을 모니터링할 수 있습니다. Cloudwatch - Container Insights로 이동해서 확인하도록 합니다. 더욱 많은 리소스가 있습니다. 아래 처럼 configMap으로 표시가 됩니다.
결과(3) 지표에도 생성이됩니다. 이처럼 EKS Cluster에 포함하는 모든 리소스들은 지표로 모니터링된다는 것을 확인할 수 있습니다.
Step (2) Node마다 Pod Rx/Tx 확인하기
1. 지표 이름은 2가지를 선택합니다. pod_network_tx_bytes, pod_network_rx_bytes 입니다. 이제 서칭 방법은 Cluster Name, Namespace Name, PodName을 입력해서 찾으시면 됩니다. 또는 매우 쉬운 방법은 Container Insights에서 Performance monitoring을 선택하면 됩니다.
2. 그럼 이제 아래 지표에 한눈에 보기 쉽게 확인이 가능합니다. 이제 사용자가 원하는 리소스를 선택해서 확인도 가능합니다.
3. 그럼 저희는 EKS Pods를 선택한 뒤 네트워크 부분에서 대시보드에 추가를 선택합니다.
4. 위젯 유형은 한눈으로 보기 쉽도록 누적 면적으로 선택합니다. 그런 뒤 위젯 제목은 “Pod 송/수신 데이터”로 지정합니다.
5. 대시보드에 추가를 선택합니다.
Step (3) Node마다 Service CPU 사용률 확인하기
1. Container Insights에서 Performance monitoring을 선택한 뒤 EKS Service를 선택합니다.
2. CPU 사용률 부분에서 대시보드에 추가를 선택합니다
3. 대시 보드 선택 후, 위젯 유형은 번호를 선택합니다. 그런 다음 CPU 사용률은 그대로 둡니다.
4. 대시보드에 추가를 선택합니다. 아래 처럼 확인이 가능합니다. 각 Service마다 CPU 사용률을 말입니다 !!!