본문 바로가기

DevOps

[AWS EKS] (13) EKS 스터디 4주차 ( 운영에서 프로메테우스 스택 사용 )

CloudNet@팀의 EKS 스터디 AEWS 2기에 작성된 자료를 토대로 작성합니다.

 

프로메테우스/그라파나 활용시 운영환경에서 어떻게 대시보드를 구성하고 알람을 설정하여

해당 알람이 발생시 어떤식으로 조치하는가 간략하게 소개해보려 합니다.

환경마다 중요시 하는 메트릭들이 상당히 차이가 있겠지만

각 워커노드의 CPU 사용률과 같은 경우는 공통적으로 사용하기 때문에 

해당 부분을 대표적으로 다루도록 하겠습니다. 

 

 

CPU 사용률 대시보드 쿼리 설정 및 알람 설정 

 

- 노드 별 CPU 사용률 

목표: 기준을 80%로 지정해두고 해당 기준을 넘어갈 경우 Alert를 슬랙으로 전달합니다.

sum by (instance) (irate(node_cpu_seconds_total{mode!~"guest.*|idle|iowait", instance="$instance"}[5m]))
  • grafana Alert 설정 : 점3개 선택해서 Edit

  • Alert 선택 

  • contact Point 미리 만들어두기

  • 80% 이상 인 경우 알람을 받기 위해서 먼저 C 항목에 ‘Threshold’ 선택하고
  • ‘IS ABOVE  ’80’를 입력합니다.

 

  • 다음으로 B 항목에 ‘Reduce’의 Max 옵션을 선택합니다. 최대 사용률이 80% 초과인 경우 알람을 받도록 설정합니다.
  • Input은 ‘A’ 즉 앞에서 결과값이 나오는 Query를 선택한다.

  • 다음은 알람 확인 주기 입니다. 몇 분 간격(evaluation)으로 얼마나(for) 지속되면 알람을 보낼 것인지 설정합니다. 필자는 아래와 같이 1분 간격으로 1분 동안 지속되면 알람을 보내도록 설정하였습니다.

 

리소스 부족 상황이거나 IO wait로 인해 CPU가 정상적으로 작동하지 못하는 상황으로 추정

선제적으로 리소스 확보 한 후 상세 점검합니다.

1. 해당 클러스터의 서비스 담당자에게 메일 발송 


안녕하세요. OOO  책임 연구원님
클라우드 운영센터 OOO 입니다.

KST 3/1일 12시 13분 경  ccs-au-prd 클러스터의 CPU 사용률이 80퍼 이상 사용중으로 알람 발생 하여 공유드립니다.

서비스 이상 있는지 확인 부탁드리며, 노드 증설 가능 여부 체크 부탁드립니다.








2. 사용자가 서비스 영향도가 있다고 판단하면 VM 재기동 또는 노드 스케일링 

안녕하세요. OOO 책임 연구원님 
클라우드 운영센터 ㅇㅁㄴ입니다.

현재 노드 증설 가능한 리소스 풀 확인 하였습니다.
ap-northeast-2a-svchub 리소스 풀에 32 core VM 노드 템플릿 4개 세트 증설 가능합니다.

노드 증설 부탁 드립니다.
감사합니다.

3. top , cpu load, io wait ,vmstat 확인 

[root@ip-192-168-1-163 ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 308844   2644 2592304    0    0     2    31   59   45  3  1 93  0  3
 0  0      0 308844   2644 2592424    0    0     0     0 1060 1672  3  2 94  0  2
 0  0      0 308844   2644 2592524    0    0     0     0 2055 3582  4  1 92  0  4
 0  0      0 308844   2644 2592544    0    0     0     0 1943 3554  1  0 97  0  2
 0  0      0 308844   2644 2592556    0    0     0     0 1742 3149  2  0 97  0  2
 0  0      0 308088   2644 2592564    0    0     0     0 2148 4278 10  1 83  0  5
 0  0      0 304812   2644 2592576    0    0     0     0 1576 3191  2  3 91  0  4
 0  0      0 304560   2644 2592588    0    0     0     0 1512 2790  4  2 91  0  3
 0  0      0 304560   2644 2592592    0    0     0     0 1031 1884  2  0 96  0  3
 0  0      0 304056   2644 2592604    0    0     0    12 1302 2630  3  1 94  0  2

 

4. iotop 을 통해 diskio 실시간 정보 확보 ( 특정한 process의 디스크 사용이 큰지 확인)

[root@ip-192-168-1-163 ~]# iotop -b -o -d 1 >> iotop.txt

... 중략
Total DISK READ:         0.00 B/s | Total DISK WRITE:       109.47 K/s
Current DISK READ:       0.00 B/s | Current DISK WRITE:       0.00 B/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
b'  75610 be/4 ec2-user    0.00 B/s  101.65 K/s  ?unavailable?  prometheus --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries --config.file=/etc/prometheus/config_out/prometheus.env.yaml --web.enable-lifecycle --web.external-url=http://prometheus.cubicle.zone/ --web.route-prefix=/ --storage.tsdb.retention.time=5d --storage.tsdb.retention.size=10GiB --storage.tsdb.path=/prometheus --storage.tsdb.wal-compression --web.config.file=/etc/prometheus/web_config/web-config.yaml'
b' 225951 be/4 ec2-user    0.00 B/s    7.82 K/s  ?unavailable?  prometheus --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries --config.file=/etc/prometheus/config_out/prometheus.env.yaml --web.enable-lifecycle --web.external-url=http://prometheus.cubicle.zone/ --web.route-prefix=/ --storage.tsdb.retention.time=5d --storage.tsdb.retention.size=10GiB --storage.tsdb.path=/prometheus --storage.tsdb.wal-compression --web.config.file=/etc/prometheus/web_config/web-config.yaml'

5. netstat을 통해 network io 실시간 정보 확인

[root@ip-192-168-1-163 ~]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eni371be3d8ed8   9001   381500      0      1 0        419150      0      0      0 BMRU
eni4c5ca41b167   9001   878197      0      1 0        997406      0      0      0 BMRU
enicd44662f22d   9001    86416      0      1 0         94168      0      0      0 BMRU
enide53aad20e7   9001  1758021      0      1 0       1674553      0      0      0 BMRU
enie56f4c00502   9001  4066939      0      1 0       4188603      0      0      0 BMRU
eniec9e2d62a25   9001  1314693      0      1 0       1340435      0      0      0 BMRU
ens5             9001  4154947      0      0 0       4002037      0      0      0 BMRU
ens6             9001  4783096      0      0 0       2921927      0      0      0 BMRU
ens7             9001     2713      0      0 0          2772      0      0      0 BMRU
lo              65536  1199779      0      0 0       1199779      0      0      0 LRU

# iperf3 테스트 후 
[root@ip-192-168-1-163 ~]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eni371be3d8ed8   9001   382375      0      1 0        420072      0      0      0 BMRU
eni4c5ca41b167   9001   879533      0      1 0        998870      0      0      0 BMRU
enicd44662f22d   9001    86546      0      1 0         94308      0      0      0 BMRU
enide53aad20e7   9001  1761138      0      1 0       1677486      0      0      0 BMRU
enie56f4c00502   9001  4073921      0      1 0       4196096      0      0      0 BMRU
eniec9e2d62a25   9001  1316711      0      1 0       1342496      0      0      0 BMRU
ens5             9001  8143152      0      0 0       5101219      0      0      0 BMRU
ens6             9001  4791450      0      0 0       2926810      0      0      0 BMRU
ens7             9001     2717      0      0 0          2776      0      0      0 BMRU
lo              65536  1201824      0      0 0       1201824      0      0      0 LRU

<테스트 전> 

<test 후 >

6. nfsstat을 통해 현재 네트워크 파일 시스템쪽의 문제가 있는지 확인해봄 

  • - 상황 발생시 nfs disk io 지연 발생 가능성이 있으므로 정보를 수집한다.
  • retrans ( 패킷 재전송)의 증가 여부를 확인 하면 네트워크 지연 등이 원인일수 있음
[root@ip-192-168-2-165 ~]# sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 192.168.1.91:/ /mnt/myefs

주요 옵션 설명
nfsvers=4.1 → EFS는 NFS v4.1 또는 v4.2를 지원하며, v4.1이 기본적으로 권장됨.
hard → 네트워크 오류가 발생해도 재시도하도록 설정. soft 옵션을 사용하면 파일이 손상될 수 있음.
timeo=600 → 요청 시간 초과(timeout) 값 설정. 기본값은 600 (60초).
retrans=2 → 요청이 실패했을 때의 재전송 횟수. 기본값 2회.
rsize=1048576,wsize=1048576 → 읽기/쓰기 버퍼 크기(1MB). 성능 최적화를 위해 설정.
noresvport → 동적 포트를 사용하여 보안 그룹과 충돌을 방지.


[root@ip-192-168-2-165 ~]# nfsstat
Client rpc stats:
calls      retrans    authrefrsh
17         0          17

Client nfs v4:
null             read             write            commit           open
1         5%     0         0%     0         0%     0         0%     0         0%
open_conf        open_noat        open_dgrd        close            setattr
0         0%     0         0%     0         0%     0         0%     0         0%
fsinfo           renew            setclntid        confirm          lock
2        11%     0         0%     0         0%     0         0%     0         0%
lockt            locku            access           getattr          lookup
0         0%     0         0%     0         0%     1         5%     0         0%
lookup_root      remove           rename           link             symlink
1         5%     0         0%     0         0%     0         0%     0         0%
create           pathconf         statfs           readlink         readdir
0         0%     1         5%     2        11%     0         0%     0         0%
server_caps      delegreturn      getacl           setacl           fs_locations
3        17%     0         0%     0         0%     0         0%     0         0%
rel_lkowner      secinfo          fsid_present     exchange_id      create_session
0         0%     0         0%     0         0%     2        11%     1         5%
destroy_session  sequence         get_lease_time   reclaim_comp     layoutget
0         0%     1         5%     0         0%     1         5%     0         0%
getdevinfo       layoutcommit     layoutreturn     secinfo_no       test_stateid
0         0%     0         0%     0         0%     1         5%     0         0%
free_stateid     getdevicelist    bind_conn_to_ses destroy_clientid seek
0         0%     0         0%     0         0%     0         0%     0         0%
allocate         deallocate       layoutstats      clone
0         0%     0         0%     0         0%     0         0%

 

7. 벤더 사에 확인 필요할시 노드 로그 수집 방법을 가이드 받은대로 logs_collector을 미리 스크립트 만들어두고 실행 후 메일에 첨부 

- 해당 스크립트에는 이외에도 인프라 상 문제가 될만한 정보들을 수집한다.