λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Container/Kubernetes

[Kubernetes] μΏ λ²„λ„€ν‹°μŠ€μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§(feat. Prometheus)

λ°˜μ‘ν˜•

πŸ”Š ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ μ‹œμž‘ν•˜μ„Έμš”! 도컀/μΏ λ²„λ„€ν‹°μŠ€ μ„œμ μ„ 읽고 개인적인 λͺ©μ  ν•˜μ— μž‘μ„±λ˜λŠ” κΈ€μž…λ‹ˆλ‹€. ν¬μŠ€νŒ…μ— μ‚¬μš©λ˜λŠ” λͺ¨λ“  μžλ£ŒλŠ” μ œκ°€ 직접 μž¬κ΅¬μ„±ν•˜μ˜€μŒμ„ μ•Œλ¦½λ‹ˆλ‹€.
 

Kubernetes


이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μΏ λ²„λ„€ν‹°μŠ€μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§μ— λŒ€ν•΄μ„œ 닀루어보렀고 ν•œλ‹€. 직전 ν¬μŠ€νŒ…κΉŒμ§€λŠ” μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ μ–΄λ– ν•œ λ¦¬μ†ŒμŠ€ 였브젝트λ₯Ό μƒμ„±ν•˜κ³  μ μš©ν•˜λŠ” 방법에 λŒ€ν•΄ 주둜 λ°°μ›Œμ™”λ‹€λ©΄ μ΄μ œλŠ” μ§€κΈˆκΉŒμ§€ μƒμ„±ν•΄μ˜¨ λ¦¬μ†ŒμŠ€λ“€μ˜ μƒνƒœκ°€ ν˜„μž¬ 어떀지, μž₯μ• κ°€ λ‚œ 건 μ•„λ‹Œμ§€λ₯Ό λͺ¨λ‹ˆν„°λ§ ν•˜λŠ” μ‹œμŠ€ν…œμ„ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ μ–΄λ–»κ²Œ ꡬ좕할 수 μžˆλŠ”μ§€μ— λŒ€ν•΄ λ°°μ›Œλ³Έλ‹€.

 

사싀 μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ 자체적으둜 μ œκ³΅ν•˜λŠ” λͺ¨λ‹ˆν„°λ§ κΈ°λŠ₯은 μ—†λ‹€. 보톡은 ν”„λ‘œλ©”ν…Œμš°μŠ€μ™€ 같은 μ˜€ν”ˆμ†ŒμŠ€ 도ꡬ듀을 μ‘°ν•©ν•˜κ±°λ‚˜ Datadogκ³Ό 같은 유료 μ†”λ£¨μ…˜μ„ λ„μž…ν•΄μ„œ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜κ²Œ λœλ‹€. 방금 μ–ΈκΈ‰ν•œ ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” μ˜€ν”ˆμ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμœΌλ‘œ μΏ λ²„λ„€ν‹°μŠ€μ™€ 맀우 쒋은 ν˜Έν™˜μ„±μ„ μ§€λ‹Œ μ†Œν”„νŠΈμ›¨μ–΄ μ œν’ˆμ΄λ‹€. 이 ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” νŠΉλ³„ν•œ 것은 μ•„λ‹ˆκ³  데이터λ₯Ό μ €μž₯ν•˜λŠ” μΌμ’…μ˜ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ΄λ‹€. 이 ν”„λ‘œλ©”ν…Œμš°μŠ€μ˜ κ°œλ…μ΄ ꡬ체적으둜 무엇이고 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λŠ” ν›„μˆ ν•  μ˜ˆμ •μ΄λ‹€.

 

우린 μ•žμœΌλ‘œ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§ κΈ°λ³Έ ꡬ쑰와 λ™μž‘ 원리λ₯Ό μ‚΄νŽ΄λ³Έλ‹€. κ·Έ μ΄ν›„μ—λŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€λ‘œ μΏ λ²„λ„€ν‹°μŠ€ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμ„ μ–΄λ–»κ²Œ ꡬ좕할 수 μžˆλŠ”μ§€λ„ μ‚΄νŽ΄λ³΄μž.

1. λͺ¨λ‹ˆν„°λ§μ˜ 기본적인 ꡬ쑰

μΈνŠΈλ‘œμ—μ„œ ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€λΌκ³  ν–ˆλ‹€. μš°λ¦¬κ°€ μ£Όλͺ©ν•  뢀뢄은 'λ°μ΄ν„°λ² μ΄μŠ€'λΌλŠ” 것이닀. λͺ¨λ‹ˆν„°λ§μ„ ꡬ좕할 λ•Œλ„ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ‚¬μš©λœλ‹€. 그러면 이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜λŠ” λ°μ΄ν„°λŠ” λ¬΄μ—‡μΌκΉŒ? μ—¬λŸ¬ 가지가 μžˆκ² μ§€λ§Œ, λŒ€ν‘œμ μœΌλ‘œ CPU μ‚¬μš©λ₯ , λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ , λ„€νŠΈμ›Œν¬ I/O, μ΄ˆλ‹Ή μš”μ²­ 횟수 λ“±κ³Ό 같은 μΌμ’…μ˜ 'λ©”νŠΈλ¦­' 데이터가 μ €μž₯λœλ‹€.

 

μ˜ˆμ „ 도컀 κ΄€λ ¨ ν¬μŠ€νŒ…μ—μ„œ CAdvisorλΌλŠ” 것에 λŒ€ν•΄ μ†Œκ°œν•œ 적이 μžˆλ‹€. CAdvisorλŠ” μ»¨ν…Œμ΄λ„ˆμ— κ΄€λ ¨λœ λͺ¨λ‹ˆν„°λ§ 데이터λ₯Ό 확인할 수 μžˆλŠ” λͺ¨λ‹ˆν„°λ§ 도ꡬ이닀. ν•˜μ§€λ§Œ 이 CAdvisorκ°€ GUI ν™”λ©΄μœΌλ‘œ λ³΄μ—¬μ£ΌλŠ” λ©”νŠΈλ¦­ 데이터듀은 μ§€λ‚œ ν¬μŠ€νŒ…μ„ 보면 μ•Œκ² μ§€λ§Œ 사싀 μ •κ°ˆν•˜μ§€ λͺ»ν•˜λ‹€. μΏ λ²„λ„€ν‹°μŠ€λŠ” 이 CAdvisorλ₯Ό κ°€μ Έλ‹€ μ“°λ˜ λ°μ΄ν„°λ² μ΄μŠ€μ™€ κ²°ν•©ν•΄μ„œ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•œλ‹€.

 

μš°μ„  이 CAdvisorλŠ” μΏ λ²„λ„€ν‹°μŠ€ ν΄λŸ¬μŠ€ν„°λ₯Ό κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  λ…Έλ“œμ— kubelet μ—μ΄μ „νŠΈμ™€ ν•¨κ»˜ λ‚΄μž₯λ˜μ–΄ μžˆλ‹€. 그리고 ν”„λ‘œλ©”ν…Œμš°μŠ€μ™€ 같은 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν•˜λ‚˜ λ‘μ–΄μ„œ CAdvisor와 ν†΅μ‹ ν•˜λ©° λ…Έλ“œμ˜ λ©”νŠΈλ¦­λ“€μ„ μ „λ‹¬λ°›κ²Œ λœλ‹€. κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

 

λ¨Όμ € λͺ¨λ“  λ…Έλ“œλŠ” /metrics λΌλŠ” 경둜둜 μ—”λ“œν¬μΈνŠΈ 경둜λ₯Ό λ…ΈμΆœ(Listen)ν•˜κ³  μžˆλŠ”λ°, λ°”λ‘œ 이 μ—”λ“œν¬μΈνŠΈλ‘œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•˜λ©΄ 각 λ…Έλ“œμ— λΆ™μ–΄μžˆλŠ” CAdvisorλŠ” ν•΄λ‹Ή λ…Έλ“œλ‘œλΆ€ν„° μˆ˜μ§‘ν•œ λ©”νŠΈλ¦­μ„ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전달해쀀닀. μœ„ κ·Έλ¦Όμ—μ„œλŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λœλ‹€. ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ /metrics μ—”λ“œν¬μΈνŠΈλ‘œ μš”μ²­μ„ μˆ˜ν–‰ν•˜λ©΄ 각 λ…Έλ“œλ“€λ‘œλΆ€ν„° λ©”νŠΈλ¦­ 데이터듀을 응닡받고, ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” 이 데이터듀을 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•œλ‹€.(참고둜 이 λ•Œ CAdvisorκ°€ μ „λ‹¬ν•΄μ£ΌλŠ” λ°μ΄ν„°μ˜ ν˜•νƒœλŠ” ν‚€-κ°’ 쌍으둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€)

 

λ¬Όλ‘  ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ μžλ™μœΌλ‘œ μ—”λ“œν¬μΈνŠΈλ₯Ό νƒμ§€ν•˜λŠ” 것은 μ•„λ‹ˆκ³ , λ°˜λ“œμ‹œ ν”„λ‘œλ©”ν…Œμš°μŠ€μ— CAdvisor μ—”λ“œν¬μΈνŠΈ 정보λ₯Ό 등둝해주어야 ν•œλ‹€. μ΄λ ‡κ²Œ ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•  μ—”λ“œν¬μΈνŠΈλ₯Ό λ“±λ‘ν•΄μ£ΌλŠ” 것을 'μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬(Service Discovery)'라고도 ν•œλ‹€. 

 

그리고 CAdvisor 처럼 /metrics λΌλŠ” 경둜λ₯Ό 외뢀에 λ…ΈμΆœμ‹œμΌœμ„œ μ–΄λ”˜κ°€μ—μ„œ 데이터λ₯Ό μˆ˜μ§‘ν•  수 μžˆλ„λ‘ κ³΅ν†΅ν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” μ„œλ²„λ₯Ό Exporter 라고 λΆ€λ₯Έλ‹€. Exporter의 μ’…λ₯˜λ‘œλŠ” 맀우 λ‹€μ–‘ν•œλ°, λ§Œμ•½ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€μ˜ 데이터λ₯Ό ν”„λ‘œλ©”ν…Œμš°μŠ€λ‘œ μˆ˜μ§‘ν•˜κ³  μ‹Άλ‹€λ©΄ Pythonμ΄λ‚˜ Go 언어와 같은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ œκ³΅ν•˜λŠ” Exporter 라이브러리λ₯Ό 톡해 μ»€μŠ€ν…€ Exporterλ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆλ‹€. 

2. λͺ¨λ‹ˆν„°λ§ λ©”νŠΈλ¦­μ˜ μ’…λ₯˜

직전에 μ†Œκ°œν•œ CAdvisorλŠ” 주둜 μ»¨ν…Œμ΄λ„ˆ 레벨의 λ©”νŠΈλ¦­μ„ μ œκ³΅ν•΄μ€€λ‹€. μ—¬κΈ°μ„œ 'μ»¨ν…Œμ΄λ„ˆ 레벨의 λ©”νŠΈλ¦­'μ΄λž€ 무엇을 μ˜λ―Έν• κΉŒ? 그리고 μ»¨ν…Œμ΄λ„ˆ 레벨 말고 λ‹€λ₯Έ 레벨의 λ©”νŠΈλ¦­λ„ μžˆλŠ” 건가? 이번 λͺ©μ°¨μ—μ„œλŠ” 주둜 λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμ—μ„œ μˆ˜μ§‘ν•˜λŠ” λ©”νŠΈλ¦­μ˜ λŒ€ν‘œμ μΈ μ’…λ₯˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. μ ˆλŒ€μ μΈ λΆ„λ₯˜λ²•μ€ μ•„λ‹ˆμ§€λ§Œ λŒ€λž΅μ μΈ λΆ„λ₯˜ μ²΄κ³„λ‘œλ§Œ μ΄ν•΄ν•˜κΈ°λ§Œ ν•˜λ©΄ 될 λ“― ν•˜λ‹€.

 

  • 인프라 μˆ˜μ€€μ˜ λ©”νŠΈλ¦­: 호슀트 λ¨Έμ‹  λ ˆλ²¨μ—μ„œμ˜ λ©”νŠΈλ¦­μ„ 의미. 예λ₯Ό λ“€μ–΄, 파일 λ””μŠ€ν¬λ¦½ν„° 개수, λ””μŠ€ν¬ μ‚¬μš©λŸ‰, NIC의 νŒ¨ν‚· μ‚¬μš©λŸ‰ λ“± 
  • μ»¨ν…Œμ΄λ„ˆ μˆ˜μ€€μ˜ λ©”νŠΈλ¦­: μ»¨ν…Œμ΄λ„ˆ λ ˆλ²¨μ—μ„œμ˜ λ©”νŠΈλ¦­μ„ 의미. 예λ₯Ό λ“€μ–΄, μ»¨ν…Œμ΄λ„ˆλ³„ CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ , μ»¨ν…Œμ΄λ„ˆμ˜ ν”„λ‘œμ„ΈμŠ€ μƒνƒœ, μ»¨μ—ν‹°λ„ˆμ— ν• λ‹Ήλœ λ¦¬μ†ŒμŠ€ ν• λ‹ΉλŸ‰, μ»¨ν…Œμ΄λ„ˆ 및 νŒŒλ“œμ˜ μƒνƒœ λ“±
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€μ˜ λ©”νŠΈλ¦­: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆλ²¨μ—μ„œ λ°œμƒν•˜λŠ” λ©”νŠΈλ¦­μ„ 의미. νŠΈλ ˆμ΄μ‹± 데이터, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” νŠΉμ • ν”„λ ˆμž„μ›Œν¬μ—μ„œ λ°œμƒν•˜λŠ” λ©”νŠΈλ¦­ 데이터 λ“±

3. k8sμ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§ ꡬ쑰

이번 λͺ©μ°¨μ—μ„œλŠ” 본격적으둜 μΏ λ²„λ„€ν‹°μŠ€μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œ ꡬ쑰에 λŒ€ν•΄ μ‚΄νŽ΄λ³Έλ‹€. ν•΄λ‹Ή λͺ©μ°¨μ˜ λ‚΄μš©μ„ μ½μ–΄λ‚˜κ°ˆ λ•Œ, [λͺ©μ°¨ 1]μ—μ„œ μ†Œκ°œν•œ ꡬ쑰λ₯Ό 머릿속에 μˆ™μ§€ν•œ 채 읽어내렀가보도둝 ν•˜μž.

3-1. μ»¨ν…Œμ΄λ„ˆμ™€ 인프라 레벨의 λ©”νŠΈλ¦­μ„ μ œκ³΅ν•˜λŠ” μ„œλ²„: metrics-server

metrics-server λΌλŠ” μ„œλ²„λŠ” μΏ λ²„λ„€ν‹°μŠ€ μžμ²΄κ°€ μ œκ³΅ν•˜μ§€λŠ” μ•Šμ§€λ§Œ μΏ λ²„λ„€ν‹°μŠ€μ— μ†μ‰½κ²Œ μ„€μΉ˜ν•  수 μžˆλŠ” μ—λ“œμ˜¨(add-on)이닀. 이 metrics-serverλ₯Ό μ„€μΉ˜ν•˜λ©΄ kubectl top λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ 좜λ ₯λ˜λŠ” λ‚΄μš© λ˜λŠ” HPAκ°€ λ™μž‘ν•˜λŠ” 기쀀이 λ˜λŠ” νŒŒλ“œμ˜ CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ μ„ 얻을 수 있게 λœλ‹€. 이 metrics-serverλŠ” 보톡 kube-system μ΄λΌλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— νŒŒλ“œ ν˜•νƒœλ‘œ μƒμ„±λœλ‹€.

 

μ’€ 더 λ‚˜μ•„κ°€μ„œ metrics-serverκ°€ λ™μž‘ν•˜λŠ” 원리에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄μž. metrics-serverλŠ” APIService λΌλŠ” μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€ 였브젝트λ₯Ό ν™œμš©ν•΄μ„œ μΏ λ²„λ„€ν‹°μŠ€ API ν™•μž₯ κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€. 일반적으둜 kubectl ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 kube-apiserver둜 μš”μ²­μ„ μ „μ†‘ν•œλ‹€κ³  ν–ˆλ‹€. APIService λΌλŠ” μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€ μ˜€λΈŒμ νŠΈλŠ” API μ„œλ²„μ˜ μŠ€νŽ™μ„ μ€€μˆ˜ν•˜λŠ” λ³„λ„μ˜ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•œ λ’€, ν•΄λ‹Ή μ„œλ²„λ₯Ό μΏ λ²„λ„€ν‹°μŠ€μ— λ“±λ‘ν•˜κ²Œ 되면 kube-apiserver 처럼 λ‚˜λ§Œμ˜ ν™•μž₯된 API μ„œλ²„μ²˜λŸΌ μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것이닀. 

 

λ¨Όμ € APIService λ¦¬μ†ŒμŠ€ 였브젝트λ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ‹œ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό μ‚΄νŽ΄λ³΄μž.

 

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.custom.metrics.k8s.io
spec:
  group: custom.metrics.k8s.io
  service:
    name: prometheus-adapter
    namespace: prometheus
    port: 443
  version: v1beta1

 

λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό 보면 μƒˆλ‘œμš΄ APIλ₯Ό ν™•μž₯ν•΄μ„œ μ–΄λ– ν•œ μ„œλΉ„μŠ€μ— 접근할지λ₯Ό λͺ…μ‹œν•˜κ³  μžˆλ‹€. 생성될 API Service의 이름은 v1beta1.custom.metrics.k8s.io 이며, 이 APIλŠ” prometheus-adapter 에 μ ‘κ·Όν•¨μœΌλ‘œμ¨ μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” v1beta1.custom.metrics.k8s.io λΌλŠ” μ΄λ¦„μ˜ APIλ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 이 μš”μ²­μ€ kube-apiserver둜 가지 μ•Šκ³  ν•΄λ‹Ή APIService둜 κ°€μ„œ μ²˜λ¦¬λœλ‹€.

 

참고둜 μ΄λŸ¬ν•œ API ν™•μž₯ 방식을 API Aggregation이라고도 ν•˜λ‹ˆ μš©μ–΄λ₯Ό μ•Œμ•„λ‘λ„λ‘ ν•˜μž.

3-2. λ¦¬μ†ŒμŠ€ μƒνƒœμ— λŒ€ν•œ λ©”νŠΈλ¦­μ„ μ œκ³΅ν•˜λŠ” μ„œλ²„: kube-state-metrics

μ΄λ²ˆμ— μ•Œμ•„λ³Ό 또 λ‹€λ₯Έ μ—λ“œμ˜¨ μ„œλ²„λŠ” μΏ λ²„λ„€ν‹°μŠ€ ν΄λŸ¬μŠ€ν„° λ‚΄μ˜ λ¦¬μ†ŒμŠ€ μƒνƒœμ— λŒ€ν•œ λ©”νŠΈλ¦­μ„ μ œκ³΅ν•˜λŠ” μ„œλ²„μΈ kube-state-metrics 이닀. 'λ¦¬μ†ŒμŠ€ μƒνƒœμ— λŒ€ν•œ λ©”νŠΈλ¦­'이라 함은 예λ₯Ό λ“€μ–΄, νŒŒλ“œμ˜ μƒνƒœκ°€ Running인지 λ˜λŠ” λ””ν”Œλ‘œμ΄λ¨ΌνŠΈμ˜ λ ˆν”Œλ¦¬μΉ΄ κ°œμˆ˜κ°€ λͺ‡ κ°œμΈμ§€ 등이 ν•΄λ‹Ήν•œλ‹€. kube-state-metrics μ„€μΉ˜ν•˜λŠ” YAML νŒŒμΌμ€ μΏ λ²„λ„€ν‹°μŠ€μ˜ 곡식 githubμ—μ„œ μ‰½κ²Œ 확인이 κ°€λŠ₯ν•˜λ‹€.

3-3. 인프라 μˆ˜μ€€μ˜ λ©”νŠΈλ¦­μ„ μ œκ³΅ν•˜λŠ” μ„œλ²„: node-exporter

λ‹€μŒμœΌλ‘œ μ•Œμ•„λ³Ό μ—λ“œμ˜¨μ€ 인프라 μˆ˜μ€€μ˜ λ©”νŠΈλ¦­μ„ μ œκ³΅ν•˜λŠ” μ„œλ²„μΈ node-exporter 이닀. node-exporterλŠ” 이전에 μ†Œκ°œν•œ μ—λ“œμ˜¨κ³ΌλŠ” 달리 파일 μ‹œμŠ€ν…œ, λ„€νŠΈμ›Œν¬ νŒ¨ν‚· λ“±κ³Ό 같은 호슀트 μΈ‘λ©΄μ—μ„œμ˜ λ‹€μ–‘ν•˜κ³  μžμ„Έν•œ λ©”νŠΈλ¦­μ„ μ œκ³΅ν•œλ‹€. κ·Έλž˜μ„œ 호슀트 μΈ‘λ©΄μ—μ„œμ˜ λ©”νŠΈλ¦­μ„ μœ„ν•œ μ„œλ²„μ΄κΈ° λ•Œλ¬Έμ— node-exporterλŠ” λͺ¨λ“  λ…Έλ“œμ— μ„€μΉ˜λ˜μ–΄μ•Ό ν•΄μ„œ 데λͺ¬μ…‹ ν˜•νƒœλ‘œ λ°°ν¬λœλ‹€. κ·Έλž˜μ„œ νŠΉμ • λ…Έλ“œμ— μŠ€μΌ€μ₯΄λ§λœ node-exporter 데λͺ¬μ…‹ νŒŒλ“œ ν•˜λ‚˜λ₯Ό 좜λ ₯ν•΄μ„œ IP ν•­λͺ©μ„ 보면 ν•΄λ‹Ή νŒŒλ“œκ°€ μŠ€μΌ€μ₯΄λ§λœ λ…Έλ“œμ˜ IPλž‘ λ™μΌν•œ 것을 λ³Ό 수 μžˆλ‹€. μ΄λŠ” node-exporter 데λͺ¬μ…‹ νŒŒλ“œκ°€ 호슀트 λ„€νŠΈμ›Œν¬ λͺ¨λ“œ(hostNetwork)둜 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 마치 docker run λͺ…λ Ήμ–΄μ˜ --net host 와 같은 μ˜΅μ…˜κ³Ό λ™μΌν•œ 효과인 μ…ˆμ΄λ‹€.

 

node-exporterλŠ” 기본적으둜 μƒλ‹Ήνžˆ λ§Žμ€ μ–‘μ˜ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜κ²Œ λœλ‹€. λ§Œμ•½ μˆ˜μ§‘ν•  ν•„μš”κ°€ μ—†λŠ” λ©”νŠΈλ¦­λ“€μ΄ μžˆλ‹€λ©΄ node-exporter 데λͺ¬μ…‹ λ§€λ‹ˆνŽ˜μŠ€νŠΈμ˜ μ‹€ν–‰ 인자 쀑에 --no-collectorλ₯Ό 적절히 μΆ”κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ μš©ν•΄λ³Ό 수 μžˆλ‹€.

 

참고둜 node-exporterλ₯Ό μ„€μΉ˜ν•˜λŠ” YAML νŒŒμΌμ€ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ κ³΅μ‹μ μœΌλ‘œ μ œκ³΅ν•˜μ§€λŠ” μ•Šμ§€λ§Œ kube-prometheus 와 같은 κΉƒν—™ λ ˆν¬μ§€ν† λ¦¬μ—μ„œ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό μ°Ύμ•„λ³Ό 수 μžˆλ‹€. 

4. ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό ν™œμš©ν•΄μ„œ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜μž

직전 λͺ©μ°¨κΉŒμ§€ 배운 λ©”νŠΈλ¦­μ„ λͺ¨λ‹ˆν„°λ§ν•˜κΈ° μœ„ν•œ μ—λ“œμ˜¨μΈ kube-state-metrics, node-exporter, 그리고 kubelet에 λ‚΄μž₯λ˜μ–΄μžˆλŠ” CAdvisor도 λͺ¨λ‘ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” μƒνƒœλΌλ©΄ 이제 이 μ—λ“œμ˜¨λ“€μ΄ μˆ˜μ§‘ν•˜λŠ” λ©”νŠΈλ¦­μ„ μˆ˜μ§‘(이λ₯Ό μŠ€ν¬λž˜ν•‘(Scraping)이라고도 함)ν•˜λŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄ λ¬Έλ‘μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” μΌμ’…μ˜ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€κ³ , 이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ—λ“œμ˜¨λ“€μ΄ μˆ˜μ§‘ν•˜λŠ” λ©”νŠΈλ¦­μ„ μ €μž₯ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 그리고 이 ν”„λ‘œλ©”ν…Œμš°μŠ€μ— μ €μž₯된 λ©”νŠΈλ¦­μ„ 가지고 κ·ΈλΌνŒŒλ‚˜μ™€ 같은 μ‹œκ°ν™” 도ꡬλ₯Ό 가지고 λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œλ₯Ό μ œμž‘ν•  수 μžˆλ‹€. ꡬ쑰λ₯Ό 그렀보면 λ‹€μŒκ³Ό κ°™λ‹€.

 

4-1. ν”„λ‘œλ©”ν…Œμš°μŠ€ μ„€μΉ˜ν•˜κΈ°

κ°€μž₯ λ¨Όμ € ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€. ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ„€μΉ˜ν•˜λŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€. Helm 차트둜 μ„€μΉ˜ν•˜λŠ” 방법, μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λ₯Ό ν™œμš©ν•΄μ„œ μ„€μΉ˜ν•˜λŠ” μ˜€νΌλ ˆμ΄ν„° 방법 등이 μžˆλ‹€. ν•΄λ‹Ή μ±…μ—μ„œλŠ” μ˜€νΌλ ˆμ΄ν„°λ₯Ό ν™œμš©ν•΄μ„œ μ„€μΉ˜ν•˜λŠ” 방법을 μ†Œκ°œν•œλ‹€. μ˜€νΌλ ˆμ΄ν„°λŠ” μ§€λ‚œ ν¬μŠ€νŒ…μ—μ„œ 배운 μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λ₯Ό ν™œμš©ν•΄μ„œ μ„€μΉ˜ν•˜λŠ” 방식이닀. μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ„€λͺ…은 μ§€λ‚œ ν¬μŠ€νŒ…μ„ μ°Έμ‘°ν•˜λ„λ‘ ν•˜κ³ , μ—¬κΈ°μ„œλŠ” 별도 μ„€λͺ…은 μƒλž΅ν•˜κ² λ‹€.

 

ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ˜€νΌλ ˆμ΄ν„°λ‘œ μ„€μΉ˜ν•˜κ³  λ™μž‘ν•˜λŠ” 단계와 κ΅¬μ‘°λŠ” 각각 λ‹€μŒκ³Ό κ°™λ‹€.

 

 

그림의 μ™Όμͺ½μ€ CRD와 CR, 그리고 μ»¨νŠΈλ‘€λŸ¬λΌλŠ” 것듀 κ°„μ˜ 관계이닀. μ§€λ‚œ μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€ ν¬μŠ€νŒ…μ—μ„œλ„ μ†Œκ°œν–ˆλ˜ λ‚΄μš©μ΄λ‹€. 이λ₯Ό ν”„λ‘œλ©”ν…Œμš°μŠ€λ‘œ μ μš©ν•˜λ©΄, κ°€μž₯ λ¨Όμ € ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ„€μΉ˜ν•˜κΈ° μœ„ν•΄μ„œ ν”„λ‘œλ©”ν…Œμš°μŠ€λΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€κ°€ μ •μ˜λœ CRD λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό λ‹€μš΄λ‘œλ“œλ°›λ“  κΉƒν—™μ—μ„œ cloneν•˜λ˜ κ°€μ Έμ˜¨λ‹€. 그리고 CRD λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό apply ν•˜λ©΄ ν”„λ‘œλ©”ν…Œμš°μŠ€λΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λœλ‹€. μ—¬κΈ°κΉŒμ§€κ°€ μ„€μΉ˜ν•˜λŠ” 과정이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

 

λ‹€μŒμ€ 이제 ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΌμ’…μ˜ 컨트둀러인 ν”„λ‘œλ©”ν…Œμš°μŠ€ μ˜€νΌλ ˆμ΄ν„°κ°€ ν”„λ‘œλ©”ν…Œμš°μŠ€λΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λ˜μ—ˆλ‹€λŠ” 것을 κ°μ§€ν•œ λ’€, ν”„λ‘œλ©”ν…Œμš°μŠ€λΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€μ— μ •μ˜λ˜μ–΄ μžˆλŠ” μ—¬λŸ¬κ°€μ§€ μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€λ“€(ex. νŒŒλ“œ, λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ, μ„œλΉ„μŠ€, μ‹œν¬λ¦Ώ, 컨피그맡, PV λ“±..)을 μ‹€μ§ˆμ μœΌλ‘œ μƒμ„±ν•œλ‹€. 이것이 λ°”λ‘œ ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ λ™μž‘ν•˜λŠ” 과정이닀.(λ§Œμ•½ μ˜€νΌλ ˆμ΄ν„° λ°©μ‹μœΌλ‘œ μ„€μΉ˜ν–ˆλ‹€λ©΄)

 

ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ GUI둜 μ œκ³΅ν•˜λŠ” 것이 μžˆλŠ”λ°, ν”„λ‘œλ©”ν…Œμš°μŠ€ μ˜€νΌλ ˆμ΄ν„°κ°€ μ„€μΉ˜ν•œ μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€ 였브젝트 쀑에 μ„œλΉ„μŠ€ λ¦¬μ†ŒμŠ€ μ˜€λΈŒμ νŠΈμ— 9090 포트둜 μ ‘κ·Όν•˜λ©΄ μ•„λž˜μ˜ GUI 화면에 μ ‘κ·Όν•  수 μžˆλ‹€.

 

ν”„λ‘œλ©”ν…Œμš°μŠ€ GUI ν™”λ©΄

 

μœ„ GUIμ—μ„œλŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ μŠ€ν¬λž˜ν•‘ν•˜λŠ” μ—”λ“œν¬μΈνŠΈλž‘ 연결이 잘 λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμ„ 뿐만 μ•„λ‹ˆλΌ, ν”„λ‘œλ©”ν…Œμš°μŠ€λΌλŠ” μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”νŠΈλ¦­ 데이터에 λŒ€ν•΄ μΏΌλ¦¬ν•΄μ„œ 데이터λ₯Ό λ³Ό μˆ˜λ„ μžˆλ‹€. 이 λ•Œ μ‚¬μš©ν•˜λŠ” 쿼리λ₯Ό PromQL이라고도 λΆ€λ₯Έλ‹€.

4-2. ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ λ©”νŠΈλ¦­ μˆ˜μ§‘ν•˜λ„λ‘ ν•˜κΈ°

λ‹€μŒμ€ 이제 ν”„λ‘œλ©”ν…Œμš°μŠ€κ°€ μ–΄λ–€ κ³³(μ–΄λ–€ exporter)μ—μ„œ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λ„λ‘ 할지 μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 이 λ•Œ, ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό μ–΄λ–»κ²Œ μ„€μΉ˜ν–ˆλŠ”μ§€μ— 따라 μ•½κ°„ λ‹¬λΌμ§ˆ 수 μžˆλŠ”λ°, λ§Œμ•½ μ˜€νΌλ ˆμ΄ν„°λ₯Ό ν™œμš©ν•΄μ„œ μ„€μΉ˜ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ ν”„λ‘œλ©”ν…Œμš°μŠ€ νŒŒλ“œ 내뢀에 μžˆλŠ” config μ„€μ • νŒŒμΌμ— μ—”λ“œν¬μΈνŠΈλ₯Ό 직접 κΈ°μž…ν•œ ν›„, νŒŒλ“œλ₯Ό μž¬μ‹œμž‘ν•˜κ±°λ‚˜ νŒŒλ“œ λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž¬μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ˜€νΌλ ˆμ΄ν„° 즉, μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λ₯Ό ν™œμš©ν•΄μ„œ μ„€μΉ˜ν–ˆλ‹€λ©΄ ServiceMonitorλΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λ₯Ό ν™œμš©ν•΄μ„œ μ–΄λ– ν•œ μ—”λ“œν¬μΈνŠΈλ‘œλΆ€ν„° λ©”νŠΈλ¦­μ„ κ°€μ Έμ˜¬μ§€ μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€λ‘œμ„œ μ •μ˜ν•˜κ³ , 이λ₯Ό ν”„λ‘œλ©”ν…Œμš°μŠ€μ— μžλ™μœΌλ‘œ μ μš©ν•  수 있게 λœλ‹€.

 

ServiceMonitorλΌλŠ” μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λŠ” "μ–΄λ– ν•œ μΏ λ²„λ„€ν‹°μŠ€ μ„œλΉ„μŠ€μ— μ—°κ²°λ˜μ–΄ μžˆλŠ” νŒŒλ“œλ“€λ‘œλΆ€ν„° λ©”νŠΈλ¦­μ„ κ°€μ Έμ˜¬ 것인가"λ₯Ό ν”„λ‘œλ©”ν…Œμš°μŠ€μ—κ²Œ μ•Œλ €μ£ΌλŠ” 역할을 ν•œλ‹€. κ·Έλž˜μ„œ μ‹€μ œ ServiceMonitor μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€λ₯Ό μ •μ˜ν•˜λŠ” λ§€λ‹ˆνŽ˜μŠ€νŠΈλ₯Ό 보면 라벨 μ…€λ ‰ν„°(selector.matchLabels) ν•­λͺ©μ΄ μ‘΄μž¬ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. ν•΄λ‹Ή 뢀뢄에 νŠΉμ • μΏ λ²„λ„€ν‹°μŠ€ μ„œλΉ„μŠ€κ°€ κ°–κ³  μžˆλŠ” 라벨 key: valueλ₯Ό μ„€μ •ν•΄μ£Όλ©΄ λœλ‹€. μ•„λž˜λŠ” ServiceMonitor λ§€λ‹ˆνŽ˜μŠ€νŠΈμ˜ κ°„λ‹¨ν•œ μ˜ˆμ œμ΄λ‹€. spec.selector.matchLabels ν•­λͺ©μ„ μœ μ‹¬νžˆ 보자.

 

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  labels:
    team: frontend
spec:
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - port: web

 

μ΄λ ‡κ²Œ ν•΄μ„œ ν”„λ‘œλ©”ν…Œμš°μŠ€λ₯Ό ν™œμš©ν•΄μ„œ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μ•˜λ‹€.

 

참고둜 ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” μˆ˜μ§‘λ˜λŠ” λ©”νŠΈλ¦­ 양에 따라 λ©”λͺ¨λ¦¬λ₯Ό 많이 μ†Œλͺ¨ν•˜λŠ” μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ΄λ‹€. κ·Έλž˜μ„œ 보톡 ν”„λ‘œλ©”ν…Œμš°μŠ€μ˜ 데이터 λ¦¬ν…μ…˜μ€ 짧게 μ„€μ •ν•˜λŠ” 것이 ν”ν•˜κ³ , 일반적으둜 졜근 24μ‹œκ°„ λ™μ•ˆμ˜ λ°μ΄ν„°λ§Œμ„ μ‘°νšŒν•  수 μžˆλ‹€. 이 값은 ν”„λ‘œλ©”ν…Œμš°μŠ€ μ‹€ν–‰ μ˜΅μ…˜ 쀑 --stroage.tsdv.retention.time λ₯Ό μ΄μš©ν•  수 μžˆλ‹€. λ§Œμ•½ μž₯κΈ°κ°„μ˜ 데이터λ₯Ό ν”„λ‘œλ©”ν…Œμš°μŠ€μ— λ³΄κ΄€ν•΄μ„œ μ‹œκ°ν™”ν•˜κ³  μ‹Άλ‹€λ©΄ νƒ€λ…ΈμŠ€λΌλŠ” μΆ”κ°€ μ†”λ£¨μ…˜μ„ μ°Ύμ•„λ³Ό 수 μžˆλ‹€.

5. μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” 방식: Push, Pull

λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ ν”„λ‘œλ©”ν…Œμš°μŠ€ 말고도 influxDB λΌλŠ” 것도 μ‘΄μž¬ν•œλ‹€. 그런데 이 influxDBλŠ” ν”„λ‘œλ©”ν…Œμš°μŠ€μ™€ μ–΄λ–€ 차이점이 μžˆλŠ” 걸까? 

 

μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” λ°©μ‹μ—λŠ” 크게 Push, Pull 방식 2가지가 μ‘΄μž¬ν•œλ‹€. 이 2κ°€μ§€μ˜ 차이점은 "λ©”νŠΈλ¦­μ„ κ°€μ Έμ˜€λŠ” 주체가 λˆ„κ΅¬λƒ"이닀. λ¨Όμ € ν”„λ‘œλ©”ν…Œμš°μŠ€λŠ” Pull 방식을 μ‚¬μš©ν•œλ‹€. Pull 방식은 λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ©”νŠΈλ¦­μ„ λ…ΈμΆœν•˜λŠ” exporter에 μ ‘κ·Όν•΄μ„œ λ©”νŠΈλ¦­μ„ 당겨(Pull)μ˜€λŠ” 방식이닀. λ°˜λ©΄μ— influxDBλŠ” Push 방식을 μ‚¬μš©ν•˜λŠ”λ°, μ΄λŠ” exporterκ°€ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ©”νŠΈλ¦­μ„ 전솑(Push)ν•˜λŠ” 방식이닀. 

 

λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” 2가지 방식


μ΄λ ‡κ²Œ ν•΄μ„œ μ‹œμž‘ν•˜μ„Έμš”! 도컀/μΏ λ²„λ„€ν‹°μŠ€ μ„œμ μ„ κ³΅λΆ€ν•œ λͺ¨λ“  μ±•ν„°μ˜ λ‚΄μš©μ˜ 기둝이 끝이 났닀. ν•΄λ‹Ή 책은 크게 도컀와 μΏ λ²„λ„€ν‹°μŠ€ 두 가지 파트둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ”λ°, ν•΄λ‹Ή μ„œμ μ˜ 첫 파트λ₯Ό κ³΅λΆ€ν•˜κ³  λΈ”λ‘œκΉ…ν•˜λ˜ μ‹œμ μ΄ 2023λ…„ 2μ›”μ΄μ—ˆλ‹€. κ·Έ λ•ŒλΆ€ν„° μΏ λ²„λ„€ν‹°μŠ€ 기초인 2023λ…„ 8μ›”κΉŒμ§€ μ§„ν–‰ν•˜λ‹€κ°€, 싀무에 κ³ κΈ‰ λ‚΄μš©μ„ ν™œμš©ν•  일이 μ—†μ–΄ 잠깐 λ‹€λ₯Έ μͺ½μ„ κ³΅λΆ€ν–ˆμ—ˆλ‹€. κ·ΈλŸ¬λ‹€κ°€ μž‘λ…„ 9월에 이직을 ν•˜λ©΄μ„œ μΏ λ²„λ„€ν‹°μŠ€λ₯Ό μ œλŒ€λ‘œ 싀무에 ν™œμš©ν•˜λŠ” 상황에 λ‹€κ°€μ˜€λ‹€ λ³΄λ‹ˆ, 2024λ…„ 9μ›”λΆ€ν„° κ³„μ†ν•΄μ„œ μ„œμ μ„ μ½μ–΄λ‚˜κ°€κΈ° μ‹œμž‘ν–ˆλ‹€. 그리고 λ“œλ””μ–΄ 2025λ…„ 2월에 ν•΄λ‹Ή μ„œμ  곡뢀λ₯Ό λ§ˆμ§€λ§‰ μ±•ν„°κΉŒμ§€ μ™„λ£Œν–ˆλ‹€.

 

λŒ€λž΅ μ±… 700μͺ½ λΆ„λŸ‰μ˜ λ‚΄μš©μ„ 정말 찐(?)으둜 κ³΅λΆ€ν•˜κ³  κΈ°λ‘ν•˜λŠ” 데 μ‹€μ§ˆμ μœΌλ‘œ μ•½ 11κ°œμ›” 정도가 κ±Έλ¦° 것 κ°™λ‹€. 책을 11κ°œμ›” κ°„ μ½λ‹€λ‹ˆ.. 였래걸렸던 것 같기도 ν•˜λ‹€. ν•˜μ§€λ§Œ 천천히 μ§„ν–‰ν•˜λ©΄μ„œ κ³΅λΆ€ν•œ λ‚΄μš©μ— λŒ€ν•΄ μΉ˜λ°€ν•˜κ²Œ 고민해보고 곱씹어보며, 싀무에 μ μš©ν•˜λŠ” μ‹œκ°„λ„ 같이 κ°€μ Έκ°€λ‹€ λ³΄λ‹ˆ, νš¨κ³ΌλŠ” 배둜 κ°€μ Έκ°„ λ“― ν•˜λ‹€. μ•„λ¬΄νŠΌ 이번 κΈ°νšŒμ— 책을 μ™„λ…ν•˜κ²Œ λ˜μ–΄ λΏŒλ“―ν•˜λ‹€!

λ°˜μ‘ν˜•