본문 바로가기

⭐ AWS/CloudWatch

Container Insights 로 eks 모니터링

# 클라우드 와치에서는 컨테이너 인사이트
- 이 기능은 쿠버네티스의 애플리케이션의 상태를 확인할 수 있고, 클러스터 노드, 파드, 네임스페이스, 서비스 레벨의 매트릭을 참조하여 모니터링이 가능하다.
- 컨테이너 인사이트의 동작 구조는 간단한데, 클라우드와치 에이전트를 데몬 셋으로 동작시킨 후 메트릭 값을 클라우드 와치에서 받아서 화면에 뿌려주는 구조이다.

# 사전작업

- eks 데이터노드 인스턴스를 클릭하여 화면 중간에 있는 IAM역할 링크를 클릭하여 IAM 역할 설정 창으로 이동한다.
- 여기서 아래와 같이 정책 연결을 클릭 후 AmazonEKSWorkerNodePolicy 정책을 추가해 주면 된다.

1. CloudWatch용 네임스페이스 생성

- cloudwatch-namespace.yaml 이라는 파일 명으로 yaml 파일을 생성한다.

apiVersion: v1
kind: Namespace
metadata:
  name: amazon-cloudwatch
  labels:
    name: amazon-cloudwatch

- 생성한 yaml 파일을 실행하여, namespace를 생성한다.

seungkim:~/environment $ kubectl apply -f cloudwatch-namespace.yaml
namespace/amazon-cloudwatch created

2. CloudWatch용 서비스 계정 생성

- 클라우드 와치 에이전트가 사용할 서비스 계정을 생성한다.
- cwagent-serviceaccount.yaml 이라는 파일 명으로 아래의 코드를 생성한다.

# create cwagent service account and role binding
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

- 생성한 yaml 파일을 실행한다.

kubeclt apply -f cwagent-serviceaccount.yaml

- 실행 후 아래와 같이 나오면 정상적으로 실행이 된 것이다.

seungkim:~/environment $ kubectl apply -f cwagent-serviceaccount.yaml 
serviceaccount/cloudwatch-agent created
clusterrole.rbac.authorization.k8s.io/cloudwatch-agent-role created
clusterrolebinding.rbac.authorization.k8s.io/cloudwatch-agent-role-binding created

3. CloudWatch 에이전트가 사용할 컨피그맵 생성

- 클라우드 와치 에이전트 파드는 이미 설정해 놓은 설정값을 불러오므로 컨피그 맵을 작성하여 참조하도록 설정한다.
- 컨피그맵 yaml 파일 생성 > cwagent-configmap.yaml 파일 이라는 이름으로 아래의 코드를 생성한다.

# create configmap for cwagent config
apiVersion: v1
data:
  # Configuration is in Json format. No matter what configure change you make,
  # please keep the Json blob valid.
  cwagentconfig.json: |
    {
      "logs": {
        "metrics_collected": {
          "kubernetes": {
            "cluster_name": "eksworkshop-eksctl-20211222", #해당 클러스터 네임에 각자의 클러스터 명을 입력.
            "metrics_collection_interval": 60
          }
        },
        "force_flush_interval": 5
      }
    }
kind: ConfigMap
metadata:
  name: cwagentconfig
  namespace: amazon-cloudwatch

- 생성한 컨피그 맵 yaml 파일을 실행한다.

seungkim:~/environment $ kubectl apply -f cwagent-configmap.yaml
configmap/cwagentconfig created

4. CloudWatch 에이전트를 데몬셋으로 동자 시키기

- 데몬셋 파일 생성
- 아래의 코드를 사용하여 cwagent-daemonset.yaml 이라는 파일을 생성한다.

# deploy cwagent as daemonset
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:latest
        imagePullPolicy: Always
        #ports:
        #  - containerPort: 8125
        #    hostPort: 8125
        #    protocol: UDP
        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
        # Please don't change the mountPath
        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: 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: sys
        hostPath:
          path: /sys
      - name: devdisk
        hostPath:
          path: /dev/disk/
      terminationGracePeriodSeconds: 60
      serviceAccountName: cloudwatch-agent

- 생성한 데몬셋을 실행한다.

seungkim:~/environment $ kubectl apply -f cwagent-daemonset.yaml
daemonset.apps/cloudwatch-agent created

- 모든 세팅이 끝났다. 클라우드 와치 서비스로 이동하여 정상적으로 매트릭을 수집하고 모니터링 할 수 있는지 확인하자.

5. 클라우드 와치 서비스에서 모니터링 하기

- CloudWatch 서비스로 이동하여, 데이터가 수집되는것을 확인 할 수 있다.

- 예시로, eks 클러스터를 모니터링 하고있는 화면

- 컨테이너 인사이트를 활용하여 다른 모니터링 툴의 대체로 사용이 가능할거 같다.
- 클라우드 와치에는 알람기능도 잘 구현이 되어 있으므로 여러가지로 유용하게 사용 할 수 있을듯 하다.

- 끝 -