# 클라우드 와치에서는 컨테이너 인사이트
- 이 기능은 쿠버네티스의 애플리케이션의 상태를 확인할 수 있고, 클러스터 노드, 파드, 네임스페이스, 서비스 레벨의 매트릭을 참조하여 모니터링이 가능하다.
- 컨테이너 인사이트의 동작 구조는 간단한데, 클라우드와치 에이전트를 데몬 셋으로 동작시킨 후 메트릭 값을 클라우드 와치에서 받아서 화면에 뿌려주는 구조이다.
# 사전작업
- 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 클러스터를 모니터링 하고있는 화면
- 컨테이너 인사이트를 활용하여 다른 모니터링 툴의 대체로 사용이 가능할거 같다.
- 클라우드 와치에는 알람기능도 잘 구현이 되어 있으므로 여러가지로 유용하게 사용 할 수 있을듯 하다.
- 끝 -
'⭐ AWS > CloudWatch' 카테고리의 다른 글
클라우드와치 경보 생성 하기 (0) | 2021.10.26 |
---|---|
Apache Access 로그를 CloudWatch 에서 수집 및 모니터링하기 (0) | 2021.08.29 |
CloudWatch Agent를 통한 인스턴스 로그 수집 (0) | 2021.08.29 |
CloudWatch 설정 및 편집 (0) | 2021.03.10 |