๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Minikube & K9s (Kubernetes ๋„คํŠธ์›Œํฌ ์‹ค์Šต)

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2025. 6. 7.

 

Kubernetes ๋„คํŠธ์›Œํฌ ์‹ค์Šต ํ•ญ๋ชฉ

ํ•ญ๋ชฉ ํ…Œ์ŠคํŠธ ๋ชฉ์ 
Pod ๊ฐ„ ํ†ต์‹  Pod์—์„œ Service ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ Pod์— HTTP ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
Secvice ์ ‘๊ทผ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€(ํ˜ธ์ŠคํŠธ)์—์„œ ClusterIP ์—†์ด๋„ ์„œ๋น„์Šค ์ ‘์† ํ™•์ธ
NodePort ํ…Œ์ŠคํŠธ NodePort ํƒ€์ž… Service๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
Ingress ํ…Œ์ŠคํŠธ Ingress Controller๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
DNS ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ DNS๊ฐ€ Service FQDN์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋Š”์ง€ ํ™•์ธ

 

์ „์ œ : nginx๊ฐ€ ์ด๋ฏธ pod๋กœ ๋„์–ด์ ธ ์žˆ๋Š” ์ƒํƒœ

 

1. Pod ๊ฐ„ ํ†ต์‹ 

๋ชฉํ‘œ : Pod์—์„œ Service ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ Pod์— HTTP ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

 

1. BusyBox ์‰˜ Pod ์‹คํ–‰

kubectl run busybox --image=busybox --restart=Never -it --rm -- sh

 

2. ์…ธ ์•ˆ์—์„œ nginx Service๋กœ HTTP ์š”์ฒญ

wget -qO- http://nginx

 

3. ๊ฒฐ๊ณผ

HTML(nginx ํ™˜์˜ ํŽ˜์ด์ง€)์ด ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋˜๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

Welcome to nginx! ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

2. Service ์ ‘๊ทผ (ClousterIP ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ)

๋ชฉํ‘œ : ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€(ํ˜ธ์ŠคํŠธ)์—์„œ ClusterIP ์—†์ด๋„ ์„œ๋น„์Šค ์ ‘์† ํ™•์ธ

 

1. minikube ip๋กœ ์ ‘๊ทผ

minikube ip

 

minikube ip๋กœ ์ ‘๊ทผ ์‹คํŒจ

minikube ip๋กœ ๋ฐ˜ํ™˜ ๋ฐ›์€ ip๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผํ–ˆ์ง€๋งŒ, ์ ‘๊ทผ์ด ์•ˆ ๋จ

 

ClusterIP ํƒ€์ž…์˜ Service๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ€์ƒ IP๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค., ๋”ฐ๋ผ์„œ ํ˜ธ์ŠคํŠธ ๋จธ์‹ (๋ธŒ๋ผ์šฐ์ €)์—์„œ minikube ip๋ฅผ ์ด์šฉํ•ด ์ ‘์†ํ•ด๋„ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€๋กœ ๋ผ์šฐํŒ…๋˜์ง€ ์•Š์•„ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

 

2. minikube service nginx --url ๋กœ ์ ‘๊ทผ

minikube service nginx --url

 

์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‚ด๋ถ€์ ์œผ๋กœ SSH(port-forward) ์„ ๋„์›๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ http://127.0.0.1:54374 ์ด ๋‚˜์˜จ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋˜ํ•œ ๋กœ์ปฌ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํŒŒ์•…์ด ๋ฉ๋‹ˆ๋‹ค.

 

ํ˜„์žฌ ๋กœ์ปฌ์—์„œ๋งŒ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‚ฌํžˆ ๋ธŒ๋ผ์šฐ์ €๋กœ nginx ์ ‘๊ทผ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

3. NodePort ํ…Œ์ŠคํŠธ

๋ชฉํ‘œ : NodePort ํƒ€์ž… Service๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

 

1. NodePort type์œผ๋กœ nginx๋ฅผ ์„œ๋น„์Šค๋กœ ๋„์šฐ๊ธฐ

kubectl expose deployment nginx \
  --type=NodePort \
  --port=80

:svc(service)

 

k9s์—์„œ NodePort type์œผ๋กœ ์‹คํ–‰์ด ๋˜์—ˆ์Œ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

minikube service nginx --url

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ip๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ ๋กœ์ปฌ์—์„œ๋งŒ ๋‚˜์˜จ๋‹ค๋Š” ๋ง์€ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ URL์„ ๋ฐ˜ํ™˜ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

 

darwin ์—์„œ Docker ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์•ผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

-> ํ•ด๋‹น ๋ง์€ VM ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์“ฐ๋ฉด minikube service ~ ๋ช…๋ น์ด ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„์–ด ํ•ด๋‹น ์„œ๋น„์Šค URL์„ ์—ด์–ด์ฃผ์ง€๋งŒ, Docker ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์“ฐ๋Š” macOS(Darwin) ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์‹คํ–‰ ๊ธฐ๋Šฅ์ด ์ง€์›๋˜์ง€ ์•Š์•„์„œ, ์ง์ ‘ minikube service ~ ๋ช…๋ น์–ด๋ฅผ ์ณ์„œ ๋‚˜์˜ค๋Š” url์„ ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•ด์„œ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜ํ™˜ ๋ฐ›์€ URL์„ ์ž…๋ ฅํ•˜๋ฉด,

์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

4. Ingress ํ…Œ์ŠคํŠธ

๋ชฉํ‘œ: Ingress Controller๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ

 

1. Ingress ์• ๋“œ์˜จ ํ™œ์„ฑํ™”

minikube addons enable ingress

 

2. ๊ฐ„๋‹จํ•œ Ingress ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ƒ์„ฑ (ingress.yaml)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ing
spec:
  rules:
  - host: hello.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

 

์ดํ›„,

kubectl apply -f ingress.yaml

 

์œ„์˜ ๋ช…๋ น์œผ๋กœ Kubernetes API์„œ๋ฒ„์— Ingress ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋“ฑ๋ก๋˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด Ingress Controller๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์„ค์ •์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

 

echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts

 

๊ทธ ๋‹ค์Œ /etc/hosts ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

 

 

3. ํ„ฐ๋„ ๋ฐ”์ธ๋”ฉ

 

1. DNS -> ํ„ฐ๋„ ๋ฐ”์ธ๋”ฉ

minikube tunnel
  • ์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด 127.0.0.1:80 ์„ ๋ฆฌ์Šจ(listen) 

 

2. ํ„ฐ๋„ -> LoadBalacner/NodePort ์„œ๋น„์Šค

  • ๊ทธ๋Ÿฌ๋ฉด ํ„ฐ๋„์ด ๋ฐ›์€ TCP ํŒจํ‚ท์„ ํด๋Ÿฌ์ŠคํŠธ ๋‚ด "ingress-nginx-controller" ์„œ๋น„์Šค์˜ "port:80"์œผ๋กœ ์ „๋‹ฌ

 

3. Service -> Ingress Controller Pod

  • kube-proxy ๊ฐ€ ๋ผ์šฐํŒ…ํ•˜์—ฌ Ingress-nginx ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ๋“œ๋กœ ์—ฐ๊ฒฐ

 

4. Ingress Controller(Nginx) -> ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค

  • Nginx Ingress Controller Pod๊ฐ€ HTTP ์š”์ฒญ์„ ์ˆ˜์‹  → ํ—ค๋”์˜ Host: hello.local ๊ณผ path: / ๋ฅผ ํ™•์ธ
  • ingress-ng ๋ฆฌ์†Œ์Šค์˜ ๋ฃฐ์— ๋”ฐ๋ผ backend.service.name: nginx, backend.service.port.number: 80 ์œผ๋กœ ์š”์ฒญ ํ”„๋ก์‹œ

 

5. ๋ฐฑ์—”๋“œ(nginx Service) -> ์‹ค์ œ ํŒŒ๋“œ

  • nginx ์„œ๋น„์Šค์˜ targetPort(containerPort) ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ → ์‹ค์ œ Nginx ์ปจํ…Œ์ด๋„ˆ ์‘๋‹ต

 

6. ์‘๋‹ต ๋ฐ˜ํ™˜

  • ์‘๋‹ต์ด ์—ญ์ˆœ์œผ๋กœ ingress-controller → ํ„ฐ๋„ → ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก

 

4. ์ ‘๊ทผ

 

http:hello.local๋กœ ์ ‘๊ทผ ์‹œ ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

5. DNS ํ…Œ์ŠคํŠธ

๋ชฉํ‘œ : ํด๋Ÿฌ์Šคํ„ฐ DNS๊ฐ€ Service FQDN(Fully Qualified Domain Name)์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋Š”์ง€ ํ™•์ธ

 

1. ๋””๋ฒ„๊ทธ์šฉ ํŒŒ๋“œ ์‹คํ–‰

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ busybox๋‚˜ DNS ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ์“ฐ๋Š” ์ž„์‹œ ํŒŒ๋“œ๋ฅผ ๋„์–ด์„œ ๊ทธ ์•ˆ์—์„œ ์ง์ ‘ ์กฐํšŒํ•ด ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

kubectl run -i --tty dns-test \
  --image=busybox --restart=Never --rm /bin/sh

 

 

2. nslookup/host ์‚ฌ์šฉ

์‰˜์— ์ง„์ž…ํ•œ ๋’ค, Service FQDN์„ ์กฐํšŒ

# ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— nginx๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ์„ ๋•Œ
nslookup nginx.default.svc.cluster.local

# ๋˜๋Š” host ๋ช…๋ น
host nginx.default.svc.cluster.local

ํ˜„์žฌ default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— nginx๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚˜ ์ปค์Šคํ…€ ๋„๋ฉ”์ธ๋„ ํ™•์ธ ๊ฐ€๋Šฅ

 

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด nginx.my-namespace.svc.cluster.local ์ฒ˜๋Ÿผ ์ „์ฒด FQDN์„ ์ž…๋ ฅ
  • ์งง๊ฒŒ nginx๋งŒ ์ณ๋„, ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด๋ผ๋ฉด nginx.default.svc.cluster.local ๋กœ ์ž๋™ ๋ณด์™„ํ•ด ์ค๋‹ˆ๋‹ค.

 

4. ๊ธฐ์กด ํŒŒ๋“œ์—์„œ ํ™•์ธํ•˜๊ธฐ

์ด๋ฏธ ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ Ingress Controller ํŒŒ๋“œ ์•ˆ์—์„œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ exec ํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์˜ˆ: ingress-nginx-controller ํŒŒ๋“œ ์ด๋ฆ„์ด ingress-nginx-abcde ๋ผ๋ฉด
kubectl exec -it ingress-nginx-abcde -n ingress-nginx -- nslookup nginx.default.svc.cluster.local

 

์ด ๊ณผ์ •์„ ํ†ตํ•ด "Service ์ด๋ฆ„ -> ClusterIP"๋กœ์˜ DNS ํ•ด์„์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ์†์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋ชจ๋“  Pod์—์„œ ๋™์ผํ•œ FQDN ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€