Cluster Cloudwatch Agent 사용하기 - DashBoard 꾸미기

Hoju·2022년 8월 25일
0
post-custom-banner

Dashboard를 꾸미기 위해서는 먼저 Container Insights를 해야합니다.
에러가 뜰경우 Node에 CloudwatchAgentServer Policy가 Attach되어있는 지 확인하도록 한다

1. 사전 조건

  • Container Insights를 지원하는 리전 중 하나에 노드가 연결되어 작동하는 Amazon EKS 또는 Kubernetes 클러스터있어야합니다.

  • kubectl을 설치하여 실행되어야합니다.

  • 작업자 노드의 IAM 역할에 정책을 연결합니다. 이는 Amazon EKS 클러스터와 다른 Kubernetes 클러스터 모두에 적용됩니다. 정책은 “CloudWatchAgentServerPolicy” 연결되어야합니다.

  • 클러스터 서비스 계정의 IAM 역할을 사용하고 이 역할에 정책을 연결합니다. 이는 Amazon EKS 클러스터에만 적용됩니다.

실습

  1. 먼저 Cloudwatch Agent를 적용할 Namespace를 생성합니다.
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
  1. Cloudwatch Agent Service Account를 생성합니다.
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
  1. ConfigMap을 생성합니다.
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
  1. DaemonSet로 CloudWatch 에이전트 배포
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에 포함하는 모든 리소스들은 지표로 모니터링된다는 것을 확인할 수 있습니다.

이제 대시보드를 꾸며 보도록 하겠습니다.

  1. Node마다 Pod 갯수 - 지표 이름은 node_number_of_running_pods 또는 node_number_of_running_containers 입니다. 모니터링할 해당 Node는 Instance ID로 인식되기 때문에 사용자는 Cluster Name과 Instance ID로 서칭을해야합니다.
  2. 이제 선택을 했다면 오른쪽 작업에서 대시보드에 추가를 선택합니다.
  3. 대시보드를 선택 후 위젯 유형은 게이지로 선택합니다. 그런 다음 위젯 제목을 사용자에 맞게 지정하도록 합니다.
  4. 대시보드에 추가를 선택합니다. 그럼 확인이 바로 가능합니다.
  5. 또는 Pod에 갯수를 이제 Node에 인스턴스 타입마다 할당할 수 있는 Pod에 갯수가 정해져 있지 않습니까? 그것을 이제 사용자가 확인할 수 있도록 게이지 범위를 설정해주시면 됩니다. 방법은 해당 지표를 편집을 누른 뒤 옵션에서 게이지 범위를 적용하면 됩니다.

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 사용률을 말입니다 !!!

profile
Devops가 되고 싶은 청소년
post-custom-banner

0개의 댓글