
์ ๋ฏธ๋์ด CLI(Gemini CLI)๋ก ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌํ๊ธฐ
์ ๋ฏธ๋์ด CLI(Gemini CLI)๋ก ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌํ๊ธฐ ๊ด๋ จ
ํฐ๋ฏธ๋์์ ์ธ๊ณต์ง๋ฅ ์์ด์ ํธ๋ฅผ ํตํด ์ ๋ฌด ํจ์จ์ฑ์ ๋์ด๋ ๋๊ตฌ๋ก๋ ํด๋ก๋ ์ฝ๋(Claude Code)๊ฐ ๊ฐ์ฅ ์ ๋ช ํฉ๋๋ค. ๋ค๋ง ํด๋ก๋ ์ฝ๋์ ๊ฒฝ์ฐ ๋ฌด๋ฃ ์ฌ์ฉ์๋ ๊ฒฝํํด ๋ณด๊ธฐ์กฐ์ฐจ ์ด๋ ค์ ์ ํ์ ์ธ ์ฌ์ฉ์๋ค๋ง ์ฌ์ฉํ๊ณ ์๋ ์ํ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ 6์ ๋ง ๊ณต๊ฐ๋ โ์ ๋ฏธ๋์ด CLI(Gemini CLI)โ๋ก ๊ฐ์ ๋์์ต๋๋ค. ์ด์ ๋ ์ธ๊ณต์ง๋ฅ ์์ด์ ํธ๋ฅผ ํ์๋ก ํ๋ ๋๊ตฌ๋ ํฐ๋ฏธ๋ ํ๊ฒฝ์์ ์ ๋ฏธ๋์ด CLI๋ก ๊ธฐ์ ์ ๊ฒฝํํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.

๋ฌผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ ์ต์ ์ ํด๋ก๋๊ฐ ์๋ฑํ ๋ง์ ํ ์ ์๋ ๊ฒ๋ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น ๋ฅธ ์ฒดํ์ผ๋ก ํจ๊ณผ๋ฅผ ์๊ธฐ ์ํด์๋ ์ ๋ฏธ๋์ด CLI๋ ์ถฉ๋ถํ ๊ด์ฐฎ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด์ฌ์ค๋๋ค.

์ด๋ฒ ๊ธ์์๋ ๊ทธ๋ฌํ ์ ๋ฏธ๋์ด CLI๋ฅผ ํ์ฉํด ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฏธ๋์ด CLI ์ค์นํ๊ธฐ
๊ทธ๋ผ ์ ๋ฏธ๋์ด CLI[1]๋ฅผ ์ค์นํ๋ ๊ฒ๋ถํฐ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฏธ๋์ด CLI๋ Node.js 20 ์ด์ ๋ฒ์ ์ ์๊ตฌํ๋ฏ๋ก, ํ์ด์ง ์๋ด์ ๋ฐ๋ผ ์ฐ์ Node.js๋ฅผ ์ค์นํ๊ณ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.

์ ๋ฏธ๋์ด CLI๋ฅผ ํ์ฉํ๋ ค๋ฉด โ์ ๋ฏธ๋์ด API ํคโ๋ฅผ ์ ๋ ฅํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด ๊ตฌ๊ธ AI ์คํ๋์ค(Google AI Studio)์ ์ ์ํฉ๋๋ค. ๊ธฐ์กด ํ๋ก์ ํธ๊ฐ ์๋ค๋ฉด ์ด๋ฅผ ์ ํํ๊ณ , ์๋ค๋ฉด ํ๋ก์ ํธ๋ฅผ ์๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ํ๋ก์ ํธ์์ + API ํค ๋ง๋ค๊ธฐ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.

API ํค๋ฅผ ์์ฑํ๋ค๋ฉด, ์ด๋ฅผ ๋ณต์ฌํฉ๋๋ค.
์ฐธ๊ณ ๋ก API ํค๋ ์ค์ ๋ก๋ ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถ๋์ง ์์์ผ ํ๋ ์ ๋ณด์ ๋๋ค. (์๋ ์์์ API ํค๋ ์ด๋ฏธ ์ญ์ ๋ ์ํ์ ๋๋ค.)

API ํค๋ export
๋ช
๋ น์ผ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ํธ๋ฆฌํ๊ฒ ์ฐ๋ ค๋ฉด zshrc๋ bashrc ํ์ผ์ ์ถ๊ฐํด ์
ธ(shell)์ ์์ํ ๋๋ง๋ค ์๋์ผ๋ก ๋ถ๋ฌ์ค๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
echo >> ~/ zshrc export
#
# GEMINI_API_KEY="AIzaSyBykjOkcMmqetXOpPbfXfJkmIhey_JmBMM"
source ~/ zshrc
๋ค์์ผ๋ก, ๋ช
๋ น์ด๋ฅผ ์ค์นํ๊ณ ๊ตฌ์ฑํ๊ธฐ ์ํด npm install
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
npm install -g @google/gemini-cli
#
# added 431 packages in 24s
#
# 123 packages are looking for funding
# run 'npm fund for details
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์ ๋ฏธ๋์ด CLI์ ๋ช ๋ น์ ์คํํ ์ค๋น๋ฅผ ๋ง์ณค์ต๋๋ค.
์ ๋ฏธ๋์ด CLI๋ก ํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ์ ๋ณด ํ์ธํ๊ธฐ
๋ณธ๊ฒฉ์ ์ผ๋ก ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์๋ ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ํํ๋ ๋ช ๋ น์ ๋ฐ๋ผ .py๋ .yaml ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ก ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ด๋ํฉ๋๋ค.
mkdir managed-by-gemini-cli
cd managed-by-gemini-cli
์ด์ gemini ๋ช ๋ น์ ์คํํ๋ฉด ์๋์ ๊ฐ์ ํ์ ํ์ด์ง๊ฐ ๋ํ๋ฉ๋๋ค. ๋ช ๋ น์ด ์๋ ์ผ๋ฐ ๊ตฌ๋ฌธ์ ์ ๋ ฅํ ์ ์๋ ํฐ๋ฏธ๋ ํ๋ฉด์ ๋๋ค.

/help
๋ช
๋ น์ด๋ก ์ด๋ค ๋ช
๋ น์ด๋ฅผ ์ธ ์ ์๋์ง ํ์ธํฉ๋๋ค.
Basics:
Add context: Use @ to specify files for context (e.g., @src/myFile.ts) to target specific files or folders.
Shell mode: Execute shell commands via ! (e.g., Inpm run start) or use natural language (e.g. start server).
Commands:
/help - for help on gemini-cli
/docs - open full Gemini CLI documentation in your browser
/clear - clear the screen and conversation history
/theme - change the theme
/auth - change the auth method
/editor - set external editor preference
/stats - check session stats
/mcp - list configured MCP servers and tools
/memory - manage memory. Usage: /memory โนshow|refreshladd> [text for add]
/tools - list available Gemini CLI tools
/about - show version info
/bug - submit a bug report
/chat - Manage conversation history. Usage: /chat < list|save| resume> [tag]
/quit - exit the cli
/compress - Compresses the context by replacing it with a summary.
! - shell command
Keyboard Shortcuts:
Enter - Send message
Shift+Enter - New line
Up/Down - Cycle through your prompt history
Alt+Left/Right - Jump through words in the input
Esc - Cancel operation
Ctrl+C - Quit application
์ฒ์๋ถํฐ ์์ฃผ ์ฌ์ฉํ ๋ช
๋ น์ด๊ฐ ๋ง์ง๋ ์์ต๋๋ค. ๊ฐ๋จํ ํ์ฌ ์
ธ(shell)์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํ ์ฉ๋๋ก !ls -l
์ ๋ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ค๋ง ์ค์ ํฐ๋ฏธ๋์ ๋ฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ฑ ํธ๋ฆฌํฉ๋๋ค.
์ฒซ ์ง๋ฌธ์ผ๋ก ๋ด๊ฐ ๊ฐ์ง ํด๋ฌ์คํฐ์ ์ข ๋ฅ๋ฅผ ๋ฌผ์ด๋ด ๋๋ค. ์์ธํ ์ด๋ป๊ฒ ํ๋ผ๊ณ ๋ ์ง์ํ์ง ์์์ต๋๋ค.
**Prompt |** What kind of cluster I have?
์ ๋ฏธ๋์ด CLI๋ ๊ธฐ๋ณธ์ ์ผ๋ก kubectl version ๋ช ๋ น์ ์คํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ง๋ฌธ ์์ฒด๊ฐ ์๋ชป์ด์ด์ ๋ต๋ ์ ๋ชป ๋์จ ๊ฒฝ์ฐ์ ๋๋ค. ์ด ๋ช ๋ น์ด ๋ถํ์ํ๋ค๊ณ ๋๊ปด์ง๋ฉด No๋ฅผ ์ ํํ๊ฑฐ๋ esc ํค๋ฅผ ๋๋ฌ ์ข ๋ฃํฉ๋๋ค.

์ด์ฒ๋ผ ์งํ์ ๋งค๋ฒ ํ์ธํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ๋๋ ์ ์์ต๋๋ค. ๊ทธ๋ด ๋๋ ctrl+y๋ฅผ ๋๋ฌ ์์ผ๋ก์ ๋ช ๋ น์ ์๋์ผ๋ก ๋ชจ๋ yes ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฒ์๋ ์ด ์ค์ ์ ์ ์ฉํ์ง ์์์ต๋๋ค.
๊ทธ ๋์ /quit
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๊ฑฐ๋ Ctrl+C๋ฅผ ๋๋ฌ ํ์ฌ ์ ๋ฏธ๋์ด ํฐ๋ฏธ๋์ ์ข
๋ฃํ๊ณ , gemini -y
๋ฅผ ์คํํด ์๋์ผ๋ก YES ๋๋๋ก ์ค์ ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค์ ์ ๋ฏธ๋์ด C๋ฅผ ์คํํ์ต๋๋ค.

quit
์ ๋์ค๋ ํ๋ฉด์ด๋ฒ์๋ ์ง๋ฌธ์ ์กฐ๊ธ ๋ฐ๊ฟ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ปจํ ์คํธ(context)๋ฅผ ๋์ดํด ๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
**Prompt |** List up my kubernetes clusters's context
์ง๋ฌธ์ ์์ด๋ก ์์ฑํ ์ด์ ๋ ํ๊ธ๊ณผ ์์ด๋ฅผ ๋์์ ์ ๋ ฅํ๋ ๊ฒ์ด ๋ถํธํ๊ธฐ๋ ํ๊ณ , ๋๋ก๋ ์ฉ์ด ์ฐจ์ด๋ก ์ ํํ์ง ์์ ๋ต๋ณ์ด ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌผ๋ก ํ๊ธ ์ ๋ ฅ์ ์ ํธํ๋ค๋ฉด ํ๊ธ๋ก ์ง๋ฌธํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. ์๋ชป๋ ๋ต๋ณ์ด ๋์ค๋ฉด ๋ค์ ์ง๋ฌธํด ํด๊ฒฐํ๋ฉด ๋ฉ๋๋ค.

๋ต์ด ๋์์ต๋๋ค. โkubernetes-admin@kubernetesโ ์ปจํ ์คํธ๋ฅผ ๋ณต์ฌํด ๋ง๋ค์๊ธฐ์ ํ๋ฉด์๋ 4๊ฐ๊ฐ ๋ํ๋์ง๋ง, ์ค์ ๋ก๋ ๋ชจ๋ ๋์ผํ ํญ๋ชฉ์์ ์ ์ ์์ต๋๋ค. ๋ํ, -y(์๋ ์๋ฝ) ๋ชจ๋๋ก ์งํํด ํ์ธ ์ ์ฐจ ์์ด ์ฆ์ ๋ช ๋ น์ด ์ํ๋ ๊ฒ๋ ๋ณด์ ๋๋ค.
์ด๋ฒ์๋ ์ปจํ ์คํธ๋ฅผ gke๋ก ๋ฐ๊ฟ ๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
**Prompt |** how could I change context to gke?

์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ทธ๋๋ ํ์ธ์ด ํ์ํ๋ ํ์ฌ ์ปจํ ์คํธ๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๊ณ ํฉ๋๋ค
**Prompt |** show current context

ํฐ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ค๋ง -y
๋ชจ๋(yolo ๋ชจ๋)๋ ํธ๋ฆฌํด๋, ์์
์ค์ ์์ฑํ๊ณ ์ ์ฉํ๋ ๋ถ๋ถ์ด ์๊ธธ ์ ์์ด ๊ทธ๋๋ก ๋๊ธฐ๊ฐ ์ํํด ๋ณด์
๋๋ค. ๋ฐ๋ผ์ ๋ณธ๊ฒฉ์ ์ธ ์์
์ ์งํํ ๋๋ yolo ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ญ์ ๋ณธ๊ฒฉ์ ์ธ ํ ์คํธ์ ์์ Ctrl+y๋ฅผ ์ ๋ ฅํด yolo ๋ชจ๋๋ฅผ ํด์ ํ์ต๋๋ค.
๊ฐ๋จํ ํ ์คํธ๋ฅผ ์๋ฃํ์ผ๋ ์ด์ ์ ๋ฏธ๋์ด CLI๋ก ์ฟ ๋ฒ๋คํฐ์ค์ ์ฑ์ ๋ฐฐํฌํ๋ ์ค์ต์ ์งํํ๊ฒ ์ต๋๋ค.
์ ๋ฏธ๋์ด CLI๋ก ์ฟ ๋ฒ๋คํฐ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์๋น์ค๋ก ๋ ธ์ถํ๊ธฐ
์ด์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ 80๋ฒ ํฌํธ๋ก ๋ ธ์ถํด๋ฌ๋ผ๊ณ ์์ฒญํด ๋ด ๋๋ค.
**Prompt |** Deploy web application to current context and expose it for port 80

๊ทธ๋ฌ๋ ์ด ์ ๋์ ์์ฒญ์ผ๋ก๋ ๋ฐ๋ก ๋ฐฐํฌ๋์ง ์์ต๋๋ค. ์ ๋ฏธ๋์ด(Gemini)๊ฐ โ์ด๋ฏธ์ง๋ฅผ ์ด๋ป๊ฒ ์ง์ ํ๋ฉด ์ข์๊น?โ๋ผ๊ณ ๋ค์ ์ง๋ฌธํฉ๋๋ค.
์ด๋ฏธ์ง๋ nginx stable ๋ฒ์ ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ฆ๋ ๊ทธ๋๋ก ์ฌ์ฉํด ๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
**Prompt |** image is nginx stable version and name is same as that
ํ์ง๋ง, ์ด ์์ฒญ์ ๋ฐ๋ผ ์ ๋ฏธ๋์ด๊ฐ ๊ตฌ๊ธ ๊ฒ์์ผ๋ก nginx stable ๋ฒ์ ์ ์ฐพ๋ ์ค ์๋์ฒ๋ผ ์ฟผํฐ(quota) ์ ํ์ ๊ฑธ๋ ธ์ต๋๋ค. ์ด๋ ์ ๊ธฐ์กด ์ฌ์ฉ ์ด๋ ฅ์ด ๋์ ๋์ด ๋ฐ์ํ ๊ฒ์ผ๋ก, ์ ๋ฏธ๋์ด๋ฅผ ์ฌ์ฉํ ๋๋ ์ด ์ ํ์ ์ฐํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.

์ฟผํฐ ์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ๊ตฌ๊ธ AI ์คํ๋์ค์ ๋ก๊ทธ์ธํด ์ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋ฐ์ ์ API ํค๋ฅผ export ๋ช ๋ น์ผ๋ก ๋ค์ ์ ์ฉํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.

์๋ก์ด API ํค ๋ฑ๋ก๊น์ง ๋ง์น๊ณ ๋ค์ ์ ๋ฏธ๋์ด CLI๋ฅผ ์คํํ์ต๋๋ค. ํ ๋ฒ ๋ nginx stable ์ด๋ฏธ์ง๋ฅผ ์ง์ ํ๊ณ ๋ฐฐํฌ๋ฅผ ์์ฒญํฉ๋๋ค.
**Prompt |** Deploy web application to current context and expose it for port 80. web application image is nginx stable version

๋ช ๋ น์ด ๋ด๊ฐ ์๋ํ ๋ด์ฉ๊ณผ ์ผ์นํ๋์ง ๋จผ์ ํ์ธํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์์๊ธฐ์, Yes, Allow once ์ต์ ์ ์ ํํฉ๋๋ค.
์ด๋ Allow always โkubectl โฆโ ์ต์
์ ์ ํํ๋ฉด ์์ผ๋ก kubectl
๊ด๋ จ ๋ช
๋ น์ด๋ ๋ณ๋ ํ์ธ ์์ด ์ฆ์ ์คํ๋ฉ๋๋ค. ์์ ์ ์ํด โYes, Allow onceโ๋ฅผ ์ ํํด ์งํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.

๋ฐฐํฌ๋ nginx-deployment ์๋น์ค๋ฅผ ์ธ๋ถ์ ๋ ธ์ถ์ํค๊ธฐ ์ํ ๋ช ๋ น ๋ํ ์๋์ ๊ฐ๋ค๋ฉด, ๋ค์ ํ๋ฒ Yes, Allow once๋ฅผ ์ ํํฉ๋๋ค.
๋ชจ๋ ๊ณผ์ ์ ๊ฑฐ์ณ nginx-deployment ์๋น์ค๊ฐ ๋ ธ์ถ๋์๋ค๊ณ ํ์๋ฉ๋๋ค.

์ด๋ก์จ ๊ธฐ๋ณธ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ๋ก๋๋ฐธ๋ฐ์(LoadBalancer) ํ์ ์ผ๋ก ๋ ธ์ถํ์ต๋๋ค. ์ด์ ์ ๋ฏธ๋์ด CLI๋ก, ๊ฐ์ฉ์ฑ์ ๋ ๋์ด๊ฑฐ๋ ๊ฐ์ ํ ๋ถ๋ถ์ด ์๋์ง ๋ถ์ํ๊ณ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฏธ๋์ด CLI๋ก ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌ๋ ์ฑ์ ์ํ ๊ฐ์ ํ๊ธฐ
๊ณ ๊ฐ์ฉ์ฑ ํ๋ณด ์ ์๊ณผ ์ ์ฉ
(๋ต์ด ์ ํด์ ธ ์๋ ์ง๋ฌธ์ ํ๋ ๊ฒ ๊ฐ์ง๋ง) nginx์ ๋ํ ๊ณ ๊ฐ์ฉ์ฑ(HA)์ ํ๋ณดํ๋ ค๋ฉด, ์ด๋ป๊ฒ ํ๋ ๊ฒ์ด ์ข์์ง ์๊ฒฌ์ ๋ฌผ์ด๋ด ๋๋ค.
**Prompt |** how could I do HA for nginx?

AI๊ฐ ํ์ฌ 1๊ฐ์ธ ํ๋(Pod)๋ฅผ 3๊ฐ๋ก ๋๋ฆฌ๋ผ๊ณ ์ ์ํฉ๋๋ค. AI์ ์ ์์ ์ค์ ์ํ์ผ๋ก ์ด์ด๊ฐ๋ ค๋ฉด, Yes, Allow once๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค.
๊ณง ๋ฐฐํฌ๋ฅผ ๋ง์ณค๋ค๊ณ ์๋ด๊ฐ ๋์์ง๋ง, ๊ทธ๋๋ ์ผ๋ฐ ํฐ๋ฏธ๋์์ ๋ฐฐํฌ ์ํ๋ฅผ ์ค์ ๋ก ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. k get po,svc
๋ก ํ์ธํ๊ณ , ํฐ ๋ฌธ์ ๋ ์์์ต๋๋ค.
k get po, svc
#
# NAME READY STATUS RESTARTS AGE
# pod/nginx-deployment-58fd877478-2zhsx 1/1 Running 0 14m
# pod/nginx-deployment-58fd877478-mgb6r 1/1 Running 0 3m13s
# pod/nginx-deployment-58fd877478-xm84b 1/1 Running 0 3m13s
#
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/kubernetes ClusterIP 10.96.0.1. <none> 443/TCP 60m
# service/nginx-deployment LoadBalancer 10.98.147.86 192.168.1.11 80:32305/TCP 13m
ํ๋ ์๋ฅผ ๋๋ฆฌ์๋ 1๋ฒ ์ ์ ์ธ์๋ AI๋ ์ถ๊ฐ๋ก ๊ณ ๊ฐ์ฉ์ฑ์ ๋์ผ ๋ฐฉ๋ฒ๋ค์ ์ฃผ์์ต๋๋ค.


2๋ฒ ์ ์์ ํฌ์ค ์ฒดํฌ(Health check)๋ก ์ํ๋ฅผ ๋ณด๊ณ ์ ์ ์ํ์ ํ๋์๋ง ์๋น์ค ํธ๋ํฝ์ด ์ ๋ฌ๋๋๋ก ์ค์ ํ๋ ๊ฒ, 3๋ฒ ์ ์์ ์ํฐ ์ดํผ๋ํฐ(Anti-Affinity) ํจํด ์ ์ฉ์ผ๋ก ๊ฐ๋ฅํ ํ๋๊ฐ ์๋ก ๋ค๋ฅธ ๋ ธ๋์ ๊ท ๋ฑํ๊ฒ ๋ฐฐํฌ๋๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ๋, 4๋ฒ์งธ๋ก๋ AZ(๊ฐ์ฉ ์์ญ)๋ฅผ ์ด์ฉํ ๋ฐฐ์น๋ ์ ์ํ์ผ๋, ํ์ฌ ํ๊ฒฝ์๋ AZ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ด ๋ถ๋ถ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ฌ์ค ์ด๋ฐ ์ ์์ ๊ธด ๋ฐ๋ค ์์ด๋ผ ์ฝ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ทธ๋ด ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฒญํฉ๋๋ค.
**Prompt |** ํ๊ตญ์ด๋ก ์งง๊ฒ ์ค๋ช
ํด์ค
AZ๊ฐ ๋น ์ง 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก๋ง ์ ๋ฆฌํด ์คฌ์ต๋๋ค. ๋, ์ด๋ฏธ ์คํํ 1๋ฒ ์ธ์ 2๋ฒ์ ์งํํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๋๊ณ ๋ฌผ์ด์ต๋๋ค.

์ด์ ๋ฐ๋ผ 2๋ฒ ํญ๋ชฉ์ธ ํฌ์ค ์ฒดํฌ ๊ตฌ์ฑ์ ์์ฒญํฉ๋๋ค.
**Prompt |** okay please apply Health probes for nginx app
AI๋ ์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ํ์ฌ ๋ฐฐํฌ๋ ์ํฌ๋ก๋์ YAML ํ์ผ์ ํ์ธํ๊ฒ ๋ค๊ณ ํฉ๋๋ค. Yes, Allow once๋ฅผ ์ ํํฉ๋๋ค.

๊ธฐ์กด YAML ๋ด์ฉ์ ํ์ธํ AI๋ ํฌ์ค ์ฒดํฌ๋ฅผ ์ํ ํ๋ก๋ธ(probe) ์ค์ ์ ์ถ๊ฐํ์ฌ ๋ณด์ฌ์ค๋๋ค. ์ค์ ๋ด์ฉ์ ๋ค์ ํ์ธํ ํ ๋ค์ ์ด์ด ์งํํฉ๋๋ค.

โฆ ์ค๋ต โฆ

์ด๋ ๊ฒ ํฌ์ค ์ฒดํฌ ํ๋ก๋ธ ์ถ๊ฐ๋ฅผ ์ํ kubectl patch ๋ช ๋ น ์ํ์ด ์๋ฃ๋์์ต๋๋ค.

๋ค์์ผ๋ก ์ํฐ ์ดํผ๋ํฐ(anti-affinity) ์ค์ ์ ์งํํ๊ธฐ ์ , ์ ํํ ์ด๋ ํ ์์ ์ด ์ํ๋๋์ง ์ธ๋ถ ๋ด์ฉ์ ๋ฌธ์ํฉ๋๋ค.
**Prompt |** How about anti-affinity? do you have any suggestion?
AI๊ฐ ์ ์ฉํ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ฉฐ ์คํ ์ฌ๋ถ๋ฅผ ๋ฌป์ต๋๋ค.

์ด ์ค์ ์ ๋ฐ๋์ ์ ์ฉํด์ผ ํ๋์ง ์๋ฌธ์ด ์๊น๋๋ค. ์ค์ ์ ์ฉ ์ ์ฅ๋จ์ ์ ๋ํด ๋ค์ ๋ฌธ์ํฉ๋๋ค.
**Prompt |** What is the pros and cons?

์ค๊ฐ์ ํ๊ธ๋ก ์์ฒญํด์ ๊ทธ๋ฐ์ง ํ๊ตญ์ด๊ฐ ์์ฌ ๋์ต๋๋ค. ์ข ํฉ์ ์ธ ๋ต์ ๋ณด๋ ์ค์ ์ด ๊ผญ ํ์ํ ๊ฒ์ผ๋ก ๋ณด์ด์ง ์์ต๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค ์ค์ผ์ค๋ฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ์ ๋คํด(best-effort) ํ๋๋ฅผ ๋ถ์ฐ ๋ฐฐ์นํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ์ค์ ์ ๊ฑด๋๋ฐ๊ธฐ๋ก ํฉ๋๋ค.
์ค์ ํ๊ฒฝ์ ์ ์ฉํ ๋ฆฌ์์ค ์์ฒญ๊ณผ ์ ํ์ ๋ํ ์ ์๊ณผ ์ ์ฉ
๊ทธ ๋์ , ํ์ ํ๊ฒฝ์์ ๋์ฑ ์ ์ฉํ ๋ฆฌ์์ค ์์ฒญ(request)๊ณผ ์ ํ(limit)์ ์ ์ํด ๋ฌ๋ผ๊ณ AI์๊ฒ ์์ฒญํฉ๋๋ค.
**Prompt |** How about request and limit. do you have any suggestion value?

์ ์ ๋ฐ์ ๊ฐ์ด ๋ง์์ ๋ญ๋๋ค. ์ด์ AI๊ฐ ์ ์ํ ๊ฐ์ nginx-deployment์ ์ ์ฉํด๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
**Prompt |** yes I want to apply requests and limits for nginx-deployment

์์ฑ๋ ๋ด์ฉ์ ํ์ธํ๊ณ Yes, Allow once๋ฅผ ์ ํํ์ต๋๋ค. ๊ณง ์ ์ฉ ์๋ฃ ๋ฉ์์ง๊น์ง ํ์ธํ์ต๋๋ค.
์ด์ ๊น์ง ์ ์ฉํ ๋ฐฉ๋ฒ๋ค ์ธ์ ์๋น์ค ๊ด๋ จํด ์ถ์ฒํ ๋ค๋ฅธ ๊ฒ์ด ์๋์ง ๋ฌธ์ํ์ต๋๋ค.
**Prompt |** Do you have recommendation for nginx-deployment service?


์ธ๊ทธ๋ ์ค(Ingress) ์ฌ์ฉ๊ณผ ๋ก๋๋ฐธ๋ฐ์ ๊ด๋ จ externalTrafficPolicy
์ ์ฉ์ ์ถ์ฒํฉ๋๋ค.
ํ์ง๋ง ๋ต์ ๋ณด๊ณ ๋๋, โexternalTrafficPolicy
๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ์์ํ
๋ฐโ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ฒ์ด๋ ๋๋ ํญ์ ์ ์ํด์ผ ํฉ๋๋ค.(๊ด๋ จ ๋งํฌ) ์ด๋ฐ ๋ฌธ์ ๋ฅผ AI์ ๋ค์ ๋ฌผ์์ต๋๋ค.
**Prompt |** Side effect for externalTrafficPolicy to Local


AI๋ ์ค์ ์ ๋ฐ๋์ ์ ์ฉํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ตํ์ต๋๋ค. ๊ทธ๋๋ ๊ฐ๊ด์ ์ธ ํ์ธ์ ์ํด ํด๋ก๋(Claude)์๊ฒ ๊ฐ์ ๊ฒ์ ๋ฌผ์์ต๋๋ค.
**Prompt |** `externalTrafficPolicy`๋ฅผ `Local`๋ก ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ์

๋ต๋ณ ๊ฐ์ด๋ฐ โ๊ฐ์ฉ์ฑ ์ ํ๊ฐ ๋ํ๋ ์ ์๋คโ๋ ์ ์ ์ค์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๋ค, ์๋ค ํ๋จํ๋ ๊ธฐ์ค์ด ๋ชจํธํ ๊ฒฝ์ฐ, ์๋ชป ํ๋จํ๋ฉด ์๋น์ค ์ฅ์ ๋ก ์ด์ด์ง ์๋ ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ ๋ ์งํํ์ง ์๊ธฐ๋ก ํฉ๋๋ค.
๋ณด์ ๊ด๋ จ ํฌํธ ์ฌ์ฉ์ ๋ํ ์ ์๊ณผ ์ ์ฉ
๋ง์ง๋ง์ผ๋ก, ๋ณด์ ๊ด์ ์์ 80๋ฒ ํฌํธ๋ฅผ ๊พธ์คํ ์ฌ์ฉํด๋ ๋๋์ง AI์๊ฒ ๋ฌธ์ํฉ๋๋ค.
**Prompt |** no how about port 80. is it unsecure?


์ ๊ฐ ๋ฌธ์ํ 80๋ฒ ํฌํธ๋ ํ๋ ์ธ๋ถ๋ก ๋ ธ์ถํ๋ ํฌํธ๋ฅผ ์๋ฏธํ ๊ฒ์ ๋๋ค. ๋ด์ฉ์ ์ข ๋ ์ ํํ๊ฒ ์์ ํด ๋ค์ ๋ฌธ์ํฉ๋๋ค.
**Prompt |** I mean just 80 port for outside. I think 8080 and container port 80 is better?


AI๋ ๊ณง ๋ด๋ถ์ ์ธ๋ถ์์ ๋ชจ๋ 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ์์ต๋๋ค. ๋ํ ๊ตณ์ด 8080๋ฒ ํฌํธ๊ฐ ํ์ํ๋ค๋ฉด ์ธ๊ทธ๋ ์ค(Ingress)๋ฅผ ํ์ฉํ๋ ํธ์ด ๋ ์ข๋ค๊ณ ์ถ๊ฐ๋ก ์ ์ํฉ๋๋ค.
์ง๊ธ ํ๊ฒฝ์์๋ AI ์ถ์ฒ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ผ๋ก ํ๋จํ์ฌ ์ค์ ์ ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํฉ๋๋ค.
๋ง์น๋ฉฐ
์ด๋ ๊ฒ ์ ๋ฏธ๋์ด CLI ์ค์น๋ถํฐ ๊ฐ๋จํ ์ฟ ๋ฒ๋คํฐ์ค ๋ฐฐํฌ์ ๊ฐ์ ์์ ์ ์งํํ์ต๋๋ค.
๋๊ตฌ๋ฅผ ์ฐ๋ค ๋ณด๋ ์ง๋ฌธ ์ํ๋ ๋ฒ๊ณผ ๋ต์ ์ ๊ตฌ๋ถํด ๋ด๋ ๋ฒ์ด ํ์ํ ๊ฒ์ผ๋ก ๋๊ปด์ก์ต๋๋ค. AI๊ฐ ํ์ฌ ์ํ๋ฅผ ๋ถ์ํ๊ณ ๋ฐ์ด๋ ์ ์์ ํ์ง๋ง ๊ทธ๊ฒ์ ํ๋จํ๊ณ ์ ์ฉํ๋ ๊ฒ์ ์ค๋กฏ์ด ์ธ๊ฐ์ ๋ชซ์ด์์ต๋๋ค.
๋ค์์๋ ์ ๋ฏธ๋์ด CLI๋ก ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋๋ฅผ ๋ฐฐํฌํ๊ณ ์ฐ๋ํ๋ ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ ๋ฏธ๋์ด CLI ์ฌ์ฉ์ ์ํด ์์์ผ ํ ๊ฒ๋ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
์๊ฐ
์กฐํ(CNCF ์ฐ๋ฒ์๋)
์์คํ /๋คํธ์ํฌ IT ๋ฒค๋์ ๊ฒฝํ ์ดํ, ๋ฉ๊ฐ์กด GCP ํด๋ผ์ฐ๋ ํ์์ ์ฟ ๋ฒ๋คํฐ์ค์ ์ฐ๊ด๋ ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํ Tech Advisor ๋ฐ Container Architecture Design์ ์ ๊ณตํ๊ณ ์๋ค. ํ์ด์ค๋ถ โIT ์ธํ๋ผ ์์ง๋์ด ๊ทธ๋ฃนโ์ ์ด์์ง์ ๋งก๊ณ ์์ผ๋ฉฐ, ์คํ ์์ค ์ปจํธ๋ฆฌ๋ทฐํฐ๋ก๋ ํ๋ํ๋ค. ์ง์ ๊ณต์ ๋ฅผ ์ํด ์ธํ๋ฐ/์ ๋ฐ๋ฏธ์์ ์ค์๋ธ ๋ฐ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ดํ ๊ฐ์๋ฅผ ํ๊ธฐ๋ ํ๋ค. ์ฑ <์ปจํ ์ด๋ ์ธํ๋ผ ํ๊ฒฝ ๊ตฌ์ถ์ ์ํ ์ฟ ๋ฒ๋คํฐ์ค/๋์ปค> ๋ฑ 3๊ถ์ ์ผ๋ค. CNCF(Cloud Native Computing Foundation) ์ฐ๋ฒ์๋๋ก์ ์ฟ ๋ฒ๋คํฐ์ค ์ํ๊ณ๊ฐ ๋ ํ๋ฐํ๊ฒ ํผ์ง ์ ์๋๋ก ๊ธฐ์ฌํ๊ณ ์๋ค.
์ฌ๊ทผ์ฐ
LG์ ํ๋ฌ์ค CTO๋ถ๋ฌธ์์ ๋๊ณ ๊ฐ ๋น์ฆ๋์ค ์์คํ ์ DevOps๋ฅผ ๋ด๋นํ๋ UcubeDAXํ์ ํ์ฅ์ผ๋ก ์ผํ๊ณ ์๋ค. ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋์ ํ๋ผ์ด๋น ํด๋ผ์ฐ๋์ ๊ฑธ์น ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ, ํนํ ์ฃผ๋์ด DevOps ์์ง๋์ด๋ค์ ์ก์ฑ์ ํฐ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฌธ์ฑ์ฃผ
์ฒด์ปค(CHEQUER) ์ฌ์ DevOps Engineer๋ก์ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฉํฐ ํด๋ฌ์คํฐ ๊ด๋ฆฌ ๋ฐฉ๋ฒ๋ก ๊ณผ ์ฟ ๋ฒ๋คํฐ์ค ๊ตฌํ์ฒด(CAPI, OCI)์ ๋ํ ๋ช ์ธ์ ์ปจํ ์ด๋ ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ์ฐ๊ตฌ๋ฅผ ๋ณํํ๊ณ ์๋ค. ์ด๋ฐ ์ฐ๊ตฌ ํ๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ณผ๋ฅจ ํ ์คํธ ํํธ์ ์ปจํธ๋ฆฌ๋ทฐ์ ํ๋ค. ๋ณธ์ ์ ์ฟ ๋ฒ๋คํฐ์ค ์คํผ๋ ์ดํฐ์ ๊ฐ์ CRD(์ปค์คํ ๋ฆฌ์์ค)๋ฅผ ๊ฐ๋ฐํด ํ์ ์์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ข ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋๋ ์ผ์ด๋ค. ๋ํ, ํ์ด์ค๋ถ ๊ทธ๋ฃน โ์ฝ๋ฉ์ด๋ ๋ฌด๊ดํฉ๋๋ค๋ง'๊ณผ โIT ์ธํ๋ผ ์์ง๋์ด ๊ทธ๋ฃน'์ ์ด์์ง์ ๋งก๊ณ ์๋ค.
์ด์ฑ๋ฏผ
๋ฏธ๊ตญ ๋ทํ๋ฆญ์ค(Netflix) ์ฌ์ Data Platform Infrastructure ํ์์ ์ฌ๋ด ํ๋ซํผ ํ๋ค๊ณผ ๋ฐ์ดํฐ ์ฌ์ฉ์๋ค์ ์ด์ฐ๋ฅด๊ธฐ ์ํ ๊ฐ์ํ ๋ฐ ๋๊ตฌ๋ค์ ๊ฐ๋ฐํ๋ ์ผ๋ค์ ํ๊ณ ์๋ค. ๊ณผ๊ฑฐ ์ปจํ ์ด๋์ ์ฟ ๋ฒ๋คํฐ์ค์ ํฐ ๊ด์ฌ์ ๋๊ณ ingress-nginx๋ฅผ ๋น๋กฏํ ์คํ ์์ค์ ์ฐธ์ฌํ์ผ๋ฉฐ, ํ์ฌ๋ ๋ฐ์ดํฐ ๋ถ์ผ์ ์ผํ๊ฒ ๋๋ฉด์ stateful ํ ์๋น์ค๋ค์ด ์ปจํ ์ด๋ํ์์ ๊ฒช๋ ์ด๋ ค์์ ๋ณด๋ค ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํ ๋ง์ ๋ ธ๋ ฅ์ ํ๊ณ ์๋ค.
์ ๋ฏธ๋์ด CLI ์ค์น ๋ฐฉ๋ฒ์ ๊ณ์ ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก, ๊ธฐ์ค ์์ ์์ ๊ณต์ ๊นํ๋ธ ํ์ด์ง (
google-gemini/gemini-cli
)๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. โฉ๏ธ