

# 클러스터 지표를 수집하도록 CloudWatch 에이전트 설정
<a name="Container-Insights-setup-metrics"></a>

**중요**  
Amazon EKS 클러스터에 Container Insights를 설치하는 경우 이 섹션의 지침을 따르는 대신 Amazon CloudWatch Observability EKS 추가 기능을 사용하여 설치하는 것이 좋습니다. 자세한 정보와 지침은 [Amazon CloudWatch Observability EKS 추가 기능 빠른 시작](Container-Insights-setup-EKS-addon.md) 섹션을 참조하십시오.

Container Insights를 설정하여 지표를 수집하려면 [Amazon EKS 및 Kubernetes에서 Container Insights의 빠른 시작 설정](Container-Insights-setup-EKS-quickstart.md)의 절차를 따르거나 이 단원의 절차를 따르면 됩니다. 다음 단계에서는 클러스터에서 지표를 수집할 수 있도록 CloudWatch 에이전트를 설정합니다.

Amazon EKS 클러스터에 설치하고 2023년 11월 6일 또는 그 이후에 이 섹션의 지침을 사용하는 경우 Amazon EKS의 관찰 기능이 향상된 Container Insights를 클러스터에 설치합니다.

## 1단계: CloudWatch의 네임스페이스 생성
<a name="create-namespace-metrics"></a>

다음 단계를 통해 CloudWatch에 대해 `amazon-cloudwatch`라는 Kubernetes 네임스페이스를 생성합니다. 이 네임스페이스를 이미 생성했다면 이 단계를 건너뛸 수 있습니다.

**CloudWatch의 네임스페이스를 생성하려면**
+ 다음 명령을 입력합니다.

  ```
  kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  ```

## 2단계: 클러스터에서 서비스 계정 생성
<a name="create-service-account"></a>

아직 서비스 계정이 없다면 다음 방법 중 하나를 사용하여 CloudWatch 에이전트의 서비스 계정을 생성합니다.
+ `kubectl` 사용
+ `kubeconfig` 파일 사용

### 인증에 `kubectl` 사용
<a name="use-kubectl"></a>

**`kubectl`을 사용하여 CloudWatch 에이전트의 서비스 계정을 생성하려면**
+ 다음 명령을 입력합니다.

  ```
  kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
  ```

이전 단계를 따르지 않았지만 사용하려는 CloudWatch 에이전트에 대한 서비스 계정이 이미 있는 경우에는 다음 규칙이 있는지 확인해야 합니다. 뿐만 아니라 Container Insights 설치를 위한 나머지 단계에서 `cloudwatch-agent` 대신 이 서비스 계정의 이름을 사용해야 합니다. CloudWatch 에이전트에는 클러스터 전체 액세스를 위한 ClusterRole 및 네임스페이스의 ConfigMap 작업을 위한 `amazon-cloudwatch` 네임스페이스 범위 역할이 필요합니다.

**ClusterRole(클러스터 범위 권한):**

```
rules:
  - apiGroups: [""]
    resources: ["pods", "nodes", "endpoints"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["list", "watch", "get"]
  - apiGroups: ["apps"]
    resources: ["replicasets", "daemonsets", "deployments", "statefulsets"]
    verbs: ["list", "watch"]
  - apiGroups: ["batch"]
    resources: ["jobs"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["nodes/proxy"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["nodes/stats", "events"]
    verbs: ["create", "get"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get"]
  - nonResourceURLs: ["/metrics"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["discovery.k8s.io"]
    resources: ["endpointslices"]
    verbs: ["list", "watch", "get"]
```

**역할(amazon-cloudwatch 네임스페이스에 대한 네임스페이스 범위 권한):**

```
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["create", "update"]
```

### 인증에 `kubeconfig` 사용
<a name="use-kubeconfig"></a>

또는 `kubeconfig` 파일을 인증에 사용할 수 있습니다. 이 방법을 사용하면 CloudWatch 에이전트 구성에서 `kubeconfig` 경로를 직접 지정하여 서비스 계정에 대한 필요성을 우회할 수 있습니다. 또한 인증을 위한 Kubernetes 컨트롤 플레인 API에 대한 종속성을 제거하여 설정을 간소화하고 kubeconfig 파일을 통해 인증을 관리함으로써 보안을 강화할 수 있습니다.

이 방법을 사용하려면 다음 예와 같이 CloudWatch 에이전트 구성 파일을 업데이트하여 `kubeconfig` 파일 경로를 지정합니다.

```
{
  "logs": {
    "metrics_collected": {
      "kubernetes": {
        "cluster_name": "{{YOUR_CLUSTER_NAME}}",
        "enhanced_container_insights": false,
        "accelerated_compute_metrics": false,
        "tag_service": false,
        "kube_config_path": "/path/to/your/kubeconfig{{}}" 
        "host_ip": "{{HOSTIP}}"
      }
    }
  }
}
```

`kubeconfig` 파일을 생성하려면 `system:masters` Kubernetes 역할을 가진 `admin/{create_your_own_user}` 사용자에 대한 인증서 서명 요청(CSR)을 생성합니다. 그런 다음 Kubernetes 클러스터의 인증 기관(CA)에 서명하고 `kubeconfig` 파일을 생성합니다.

## 3단계: CloudWatch 에이전트에 대한 ConfigMap 생성
<a name="create-configmap"></a>

다음 단계를 통해 CloudWatch 에이전트에 대한 ConfigMap을 생성합니다.

**CloudWatch 에이전트에 대한 ConfigMap을 생성하려면**

1. 다음 명령을 실행하여 `kubectl` 클라이언트 호스트로 ConfigMap YAML을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap-enhanced.yaml
   ```

1. 다운로드한 YAML 파일을 다음과 같이 편집합니다.
   + **cluster\_name** – `kubernetes` 섹션에서 `{{cluster_name}}`을 클러스터 이름으로 바꿉니다. `{{}}` 문자를 제거합니다. 또는 Amazon EKS 클러스터를 사용하는 경우 `"cluster_name"` 필드 및 값을 삭제할 수 있습니다. 그렇게 하면 CloudWatch 에이전트가 Amazon EC2 태그에서 클러스터 이름을 감지합니다.

1. (선택 사항) 다음과 같이 모니터링 요구사항에 따라 ConfigMap을 추가로 변경합니다.
   + **metrics\_collection\_interval** – `kubernetes` 섹션에서 에이전트가 지표를 수집하는 빈도를 지정할 수 있습니다. 기본값은 60초입니다. Kubelet의 기본 cadvisor 수집 간격은 15초이기 때문에 이 값을 15초 미만으로 설정해서는 안 됩니다.
   + **endpoint\_override** – `logs` 섹션에서 기본 엔드포인트를 재정의하려는 경우 CloudWatch Logs 엔드포인트를 지정할 수 있습니다. VPC의 클러스터에서 게시 중인 데이터를 VPC 종단점으로 이동시키고 싶은 경우에 재정의를 원할 수 있습니다.
   + **force\_flush\_interval** – `logs` 섹션에서 로그 이벤트를 CloudWatch Logs에 게시하기 전에 배치 처리하는 간격을 지정할 수 있습니다. 기본값은 5초입니다.
   + **region** – 기본적으로 에이전트는 작업자 노드가 있는 리전에 지표를 게시합니다. 이를 재정의하기 위해 `"region":"us-west-2"`처럼 `agent` 섹션에서 `region` 필드를 추가할 수 있습니다.
   + **statsd** 섹션 - CloudWatch Logs 에이전트가 클러스터의 각 작업자 노드에서 StatsD 리스너로도 실행되도록 하려는 경우 다음 예와 같이 `statsd` 섹션을 `metrics` 섹션에 추가할 수 있습니다. 이 섹션의 다른 StatsD 옵션에 대한 자세한 내용은 [StatsD를 사용하여 사용자 지정 지표 검색](CloudWatch-Agent-custom-metrics-statsd.md) 단원을 참조하세요.

     ```
     "metrics": {
       "metrics_collected": {
         "statsd": {
           "service_address":":8125"
         }
       }
     }
     ```

     JSON 섹션에 대한 전체 예는 다음과 같습니다. 인증에 `kubeconfig` 파일을 사용하는 경우, `kube_config_path` 파라미터를 추가하여 kubeconfig 파일의 경로를 지정합니다.

     ```
     {
         "agent": {
             "region": "us-east-1"
         },
         "logs": {
             "metrics_collected": {
                 "kubernetes": {
                     "cluster_name": "MyCluster",
                     "metrics_collection_interval": 60,
                     "kube_config_path": "{{/path/to/your/kubeconfig}}" //if using kubeconfig for authentication
                 }
             },
             "force_flush_interval": 5,
             "endpoint_override": "logs.us-east-1.amazonaws.com"
         },
         "metrics": {
             "metrics_collected": {
                 "statsd": {
                     "service_address": ":8125"
                 }
             }
         }
     }
     ```

1. 다음 명령을 실행하여 클러스터에서 ConfigMap을 생성합니다.

   ```
   kubectl apply -f cwagent-configmap-enhanced.yaml
   ```

## 4단계: DaemonSet로 CloudWatch 에이전트 배포
<a name="deploy-agent-yaml"></a>

CloudWatch 에이전트의 설치를 완료하고 컨테이너 지표 수집을 시작하려면 다음 단계를 따르세요.

**CloudWatch 에이전트를 DaemonSet로 배포하려면**

1. 
   + 클러스터에서 StatsD를 사용하려면 다음 명령을 입력하세요.

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
     ```
   + StatsD를 사용하지 않으려면 다음 절차를 따르세요.

     1. 다음 명령을 실행하여 `kubectl` 클라이언트 호스트에 DaemonSet YAML을 다운로드합니다.

        ```
        curl -O  https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
        ```

     1. 다음과 같이 `cwagent-daemonset.yaml` 파일에서 `port` 섹션의 주석 처리를 해제합니다.

        ```
        ports:
          - containerPort: 8125
            hostPort: 8125
            protocol: UDP
        ```

     1. 다음 명령을 실행하여 클러스터에서 CloudWatch 에이전트를 배포합니다.

        ```
        kubectl apply -f cwagent-daemonset.yaml
        ```

     1. 다음 명령을 실행하여 클러스터의 Windows 노드에서 CloudWatch 에이전트를 배포합니다. StatsD 리스너는 Windows의 CloudWatch 에이전트에서 지원되지 않습니다.

        ```
        kubectl apply -f cwagent-daemonset-windows.yaml
        ```

1. 다음 명령을 실행하여 에이전트가 배포되었는지 확인합니다.

   ```
   kubectl get pods -n amazon-cloudwatch
   ```

완료되면 CloudWatch 에이전트는 `/aws/containerinsights/{{Cluster_Name}}/performance`라는 로그 그룹을 생성하고 이 로그 그룹에 성능 로그 이벤트를 전송합니다. 또한 StatsD 리스너로서 에이전트를 설정하는 경우, 에이전트는 애플리케이션 Pod가 예약된 노드의 IP 주소를 통해 포트 8125에서 StatsD 지표를 수신합니다.

### 문제 해결
<a name="ContainerInsights-deploy-troubleshooting"></a>

에이전트에서 배포가 올바르게 되지 않으면 다음을 수행해 보세요.
+ 다음 명령을 실행하여 Pod 목록을 가져옵니다.

  ```
  kubectl get pods -n amazon-cloudwatch
  ```
+ 다음 명령을 실행하고 출력 하단에서 이벤트를 확인합니다.

  ```
  kubectl describe pod {{pod-name}} -n amazon-cloudwatch
  ```
+ 다음 명령을 실행하여 로그를 확인합니다.

  ```
  kubectl logs {{pod-name}}  -n amazon-cloudwatch
  ```