๐Ÿš K9s๋กœ nodeshell๋กœ Node ์ ‘์†ํ•˜๊ธฐ

3โ€“4๋ถ„

Ubuntu ๊ธฐ๋ฐ˜ shellPod ์ด๋ฏธ์ง€ + ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋กœ ์šด์˜ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ


๐Ÿ’ก ์™œ ์ด ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€?

Kubernetes๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด, ์–ด๋–ค **๋…ธ๋“œ(Node)**์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•  ์ผ์ด ์ƒ๊ธด๋‹ค.

๋ณดํ†ต์€ SSH๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ์ ‘์†ํ•ด์„œ top, netstat, ps ๋“ฑ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ๋ณด๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ํ”ํ•˜๋‹ค:

  • SSH ํฌํŠธ๊ฐ€ ๋‹ซํ˜€ ์žˆ๊ฑฐ๋‚˜ Bastion์„ ํ†ตํ•ด์„œ๋งŒ ์ ‘์† ๊ฐ€๋Šฅ
  • ๋ชจ๋“  ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” SSH ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
  • GKE, EKS, AKS์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ˜• Kubernetes์—์„œ๋Š” SSH ์ ‘๊ทผ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จ๋จ

์ด๋Ÿด ๋•Œ ๋Œ€์•ˆ์ด ๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ K9s์˜ nodeShell ๊ธฐ๋Šฅ์ด๋‹ค.


๐Ÿงญ nodeShell ๊ธฐ๋Šฅ์ด๋ž€?

K9s๋Š” ์ธ๊ธฐ ์žˆ๋Š” Kubernetes ํ„ฐ๋ฏธ๋„ UI ํˆด์ด๋‹ค.

์—ฌ๊ธฐ์„œ nodeShell ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ํŠน์ • ๋…ธ๋“œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ง์ ‘ ์—ฐ๊ฒฐ๋œ Pod๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋งˆ์น˜ SSH์ฒ˜๋Ÿผ ์‰˜์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ nodeShell์€ ๋‹ค์Œ ๋™์ž‘์„ ํ•œ๋‹ค:

  1. ํ˜„์žฌ ์„ ํƒํ•œ ๋…ธ๋“œ ์œ„์— privileged + hostPID Pod๋ฅผ ๋„์šด๋‹ค.
  2. ํ•ด๋‹น Pod ์•ˆ์—์„œ nsenter ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋…ธ๋“œ์˜ PID 1 (init) ์— ์ง„์ž…ํ•œ๋‹ค.
  3. ๋„คํŠธ์›Œํฌ, ํŒŒ์ผ์‹œ์Šคํ…œ, mount, UTS, IPC ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊นŒ์ง€ ํ•จ๊ป˜ ์ ‘๊ทผํ•œ๋‹ค.
  4. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ทธ ๋…ธ๋“œ์˜ ๋ฃจํŠธ ํ™˜๊ฒฝ์— bash๋กœ ์ง„์ž…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š”โ€ฆ


โš ๏ธ ๊ธฐ๋ณธ shellPod๋Š” BusyBox ๊ธฐ๋ฐ˜์ด๋‹ค

K9s๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ BusyBox ๊ธฐ๋ฐ˜์˜ ์ตœ์†Œํ•œ shellPod๋ฅผ ๋„์šด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถˆํŽธ์ด ์žˆ๋‹ค:

  • bash๊ฐ€ ์•„๋‹ˆ๋ผ sh๋งŒ ์ œ๊ณต๋จ
  • ps, top, ss, netstat, vim, curl ์—†์Œ
  • ์‹œ์Šคํ…œ ์ง„๋‹จ์„ ์ œ๋Œ€๋กœ ํ•˜๊ธฐ ์–ด๋ ค์›€

์šด์˜์ž๋ผ๋ฉด, ์‹ค์ „์—์„œ ์ด๋Ÿฐ ํˆด์ด ๋น ์ง„ ํ™˜๊ฒฝ์€ ์‚ฌ์‹ค์ƒ ๋ฌด์šฉ์ง€๋ฌผ์ด๋‹ค.


๐ŸŽฏ ๋ชฉํ‘œ: Ubuntu ํ™˜๊ฒฝ์—์„œ ์‹ค์ „ shellPod ๊ตฌ์„ฑ

์šฐ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ shellPod๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค:

  • Ubuntu 22.04 ๊ธฐ๋ฐ˜
  • bash, ps, top, nsenter, procps, util-linux ํฌํ•จ
  • Docker ์ด๋ฏธ์ง€๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • K9s์™€ ์—ฐ๋™๋˜๋„๋ก ์ž๋™ ์„ค์ •
  • ์•ˆ์ „ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์šด์˜์— ํ™œ์šฉ ๊ฐ€๋Šฅ

๐Ÿ›  1. Dockerfile ์ž‘์„ฑ

FROM ubuntu:22.04

RUN apt-get update && \\
    apt-get install -y util-linux procps bash && \\
    rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--", "bash"]


์„ค๋ช…

  • util-linux: nsenter ํฌํ•จ๋จ. โ†’ ์ด๊ฒŒ ํ•ต์‹ฌ.
  • procps: ps, top ๊ฐ™์€ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด ์ œ๊ณต
  • -target 1: PID 1 = ๋…ธ๋“œ์˜ init process โ†’ ๊ฐ€์žฅ ์ƒ์œ„ ๊ถŒํ•œ
  • -mount, -net, -pid ๋“ฑ์€ namespace ๊ณต์œ  ํ”Œ๋ž˜๊ทธ
  • bash ์‹คํ–‰๋จ โ†’ ์ต์ˆ™ํ•œ ํ™˜๊ฒฝ

์ด ์ด๋ฏธ์ง€๋กœ Pod๋ฅผ ๋„์šฐ๋ฉด, ๋…ธ๋“œ ์ž์ฒด์— ์ง„์ž…ํ•œ ๋“ฏํ•œ bash ํ™˜๊ฒฝ์ด ์ œ๊ณต๋œ๋‹ค.


โš™๏ธ 2. ์ด๋ฏธ์ง€ ๋นŒ๋“œ & ํ‘ธ์‹œ ์ž๋™ํ™” (build_and_push.sh)

./build_and_push.sh ghcr.io/myuser/k9s-nodeshell latest


๊ธฐ๋Šฅ ์„ค๋ช…

  • Dockerfile์ด Ubuntu 22.04 ๊ธฐ๋ฐ˜์ธ์ง€ ๊ฒ€์‚ฌ
  • Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ˆ˜ํ–‰
  • GitHub Container Registry(ghcr.io) ๋“ฑ์— ํ‘ธ์‹œ

์‚ฌ์šฉ๋ฒ•

./build_and_push.sh <repository> <tag>
์˜ˆ์‹œ:
./build_and_push.sh ghcr.io/myuser/k9s-nodeshell latest

DockerHub๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ๋Š” GitHub Container Registry ๊ถŒ์žฅ


๐Ÿ”ง 3. K9s ์„ค์ • ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ (setup_k9s_shellpod.sh)

./setup_k9s_shellpod.sh ghcr.io/myuser/k9s-nodeshell:latest

๋™์ž‘ ๋ฐฉ์‹

  • $HOME/.config/k9s/config.yaml ํŒŒ์ผ์„ ์ฐพ์Œ (๋˜๋Š” ์ƒ์„ฑ)
  • k9s.shellPod.image ๊ฐ’์„ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ด๋ฏธ์ง€๋กœ ์ž๋™ ์„ค์ •
  • ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ถ”๊ฐ€, ์žˆ์œผ๋ฉด ๊ฐ’๋งŒ ๋ฎ์–ด์”€

์ž๋™์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ์„ค์ • ์˜ˆ์‹œ

k9s:
  shellPod:
    image: ghcr.io/myuser/k9s-nodeshell:latest
    namespace: default
    limits:
      cpu: 100m
      memory: 100Mi

์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์‹ค์ˆ˜๋‚˜ ์˜คํƒ€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์„ ์ถ”์ฒœ


๐Ÿ–ฅ 4. ์‹ค์ œ ์‚ฌ์šฉ๋ฒ• โ€“ K9s์—์„œ ์‰˜ ์ง„์ž…

  1. k9s ์‹คํ–‰
  2. n ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๋…ธ๋“œ ๋ทฐ๋กœ ์ด๋™
  3. ์ ‘์†ํ•  ๋…ธ๋“œ๋ฅผ ์„ ํƒ
  4. s ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด โ†’ shellPod๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๋ฉฐ bash ์ ‘์†

๊ฒฐ๊ณผ ํ™”๋ฉด

  • ์ด ์ƒํƒœ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์˜ / ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ง์ ‘ ์ง„์ž…ํ•œ ๊ฒƒ๊ณผ ๋™์ผ
  • ps, top, netstat ๋“ฑ ์‹œ์Šคํ…œ ๋„๊ตฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ ์—†์ด ์ง์ ‘ ๋…ธ๋“œ ์ง„๋‹จ ๊ฐ€๋Šฅ

๐Ÿงช 5. ์ง์ ‘ Pod๋กœ ๋ฐฐํฌํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

apiVersion: v1
kind: Pod
metadata:
  name: nodeshell-direct
spec:
  hostPID: true
  containers:
    - name: nodeshell
      image: ghcr.io/myuser/k9s-nodeshell:latest
      securityContext:
        privileged: true
      stdin: true
      tty: true
  restartPolicy: Never


์„ค์ • ํ•ด์„ค

  • hostPID: true โ†’ ๋…ธ๋“œ์˜ PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต์œ 
  • privileged: true โ†’ ๋ชจ๋“  namespace์™€ ์žฅ์น˜ ์ ‘๊ทผ ํ—ˆ์šฉ
  • stdin: true, tty: true โ†’ ํ„ฐ๋ฏธ๋„ ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅ

๐Ÿ” ๋ณด์•ˆ ๊ด€๋ จ ์ฃผ์˜์‚ฌํ•ญ

์ด shellPod๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋‹ค. ๋…ธ๋“œ์˜ ๋ฃจํŠธ ํ™˜๊ฒฝ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

  • ์šด์˜์ž๋งŒ ์‚ฌ์šฉ (๊ฐœ๋ฐœ์ž๋‚˜ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒ ๋น„ํ—ˆ์šฉ)
  • ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„  ์ž„์‹œ ์ ‘์†๋งŒ ํ—ˆ์šฉ
  • ์ด๋ฏธ์ง€ push๋Š” trusted registry์—๋งŒ
  • ๋…ธ๋“œ ๋ ˆ๋ฒจ ๊ฐ์‚ฌ ๋กœ๊ทธ๋กœ ์‚ฌ์šฉ ์ถ”์  ํ•„์š”

๐Ÿงช ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ •๋ณด

  • K9s ๋ฒ„์ „: v0.50.1
  • ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ: self-hosted Kubernetes (kubeadm ๊ธฐ๋ฐ˜)
  • Docker ๋ฒ„์ „: 24.x
  • OS: Ubuntu 22.04 LTS

โœ… ์š”์•ฝ ์ •๋ฆฌ

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ชฉ์ K9s์˜ nodeShell ๊ธฐ๋Šฅ์„ Ubuntu ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„ 
์ฃผ์š” ๋„๊ตฌDocker, nsenter, bash, util-linux
๋ณด์•ˆ ์ด์Šˆ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ€์ง„ Pod์ด๋ฏ€๋กœ ๊ด€๋ฆฌ์ž๋งŒ ์‚ฌ์šฉ
์ž๋™ํ™”๋นŒ๋“œ, ํ‘ธ์‹œ, ์„ค์ • ์Šคํฌ๋ฆฝํŠธ ์ œ๊ณต
ํ…Œ์ŠคํŠธ๋œ ํ™˜๊ฒฝK9s v0.50.1, Ubuntu 22.04

๐Ÿ“Ž ์ „์ฒด ์ฝ”๋“œ ๋ฐ ๋ฌธ์„œ

๐Ÿ”— GitHub: https://github.com/pu4ro/k9s_node_shell