Kubernetes (K8s) ์นํธ์ํธ ํต์ฌ ๋ช
๋ น์ด ๋ฐ ์ค์ ๊ฐ์ด๋
kubectl ํ์ ๋ช
๋ น์ด, Pod/Deployment/Service/Ingress ๊ด๋ฆฌ, ๋กค๋ง ์
๋ฐ์ดํธ & ๋กค๋ฐฑ, ConfigMap & Secret, ํธ๋ฌ๋ธ์ํ
๋๋ฒ๊น
๋ฐ YAML dry-run ์๋ฒฝ ๊ฐ์ด๋
## 1. ํด๋ฌ์คํฐ ์ ๋ณด & Context / Namespace ์ ์ด
```bash
# โธ๏ธ [1] ํด๋ฌ์คํฐ ์ํ ๋ฐ ์๋ํฌ์ธํธ ํ์ธ
kubectl cluster-info
kubectl get componentstatus # ์ปจํธ๋กค ํ๋ ์ธ ์ํ ์ ๊ฒ
kubectl get nodes -o wide # ์ ์ฒด ๋
ธ๋ ๋ชฉ๋ก (IP, OS, K8s ๋ฒ์ )
# ๐ [2] Kubeconfig Context (๋ค์ค ํด๋ฌ์คํฐ) ์ ํ
kubectl config get-contexts # ๋ฑ๋ก๋ ํด๋ฌ์คํฐ ์ปจํ
์คํธ ๋ชฉ๋ก
kubectl config current-context # ํ์ฌ ํ์ฑ ์ปจํ
์คํธ ํ์ธ
kubectl config use-context prod-cluster # ํน์ ํด๋ฌ์คํฐ๋ก ์ ํ
# ๐ท๏ธ [3] ๋ค์์คํ์ด์ค(Namespace) ๊ด๋ฆฌ
kubectl get namespaces # ๋ค์์คํ์ด์ค ๋ชฉ๋ก ์กฐํ
kubectl create namespace my-app # ๋ค์์คํ์ด์ค ์์ฑ
# ํ์ฌ ์ปจํ
์คํธ์ ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค๋ฅผ ์๊ตฌ ๋ณ๊ฒฝ
kubectl config set-context --current --namespace=my-app
```
## 2. Pod & ์ํฌ๋ก๋ ์กฐํ (Get & Describe)
```bash
# ๐ฆ [1] ํ๋(Pod) ๊ธฐ๋ณธ ์กฐํ
kubectl get pods # ํ์ฌ ๋ค์์คํ์ด์ค์ Pod ๋ชฉ๋ก
kubectl get pods -A # ์ ์ฒด ๋ค์์คํ์ด์ค Pod ์กฐํ (--all-namespaces)
kubectl get pods -o wide # ๋
ธ๋ IP, Pod IP ํฌํจ ์์ธ ์ถ๋ ฅ
kubectl get pods -w # ์ค์๊ฐ ๋ณ๊ฒฝ ๊ฐ์ง (Watch ๋ชจ๋)
kubectl get pods -l app=frontend # ๋ผ๋ฒจ ์
๋ ํฐ ํํฐ๋ง
# ๐ [2] ๋ฆฌ์์ค ์์ธ ๋ถ์ & ์ด๋ฒคํธ ํ์ธ (์๋ฌ ๋ถ์์ ํต์ฌ)
kubectl describe pod <pod-name>
kubectl describe node <node-name>
kubectl get events --sort-by=.metadata.creationTimestamp # ์ต๊ทผ ํด๋ฌ์คํฐ ์ด๋ฒคํธ
# ๐ [3] JSON/YAML ํฌ๋งท ์ถ๋ ฅ & ๋ฆฌ์์ค ์ ์ ์กฐํ
kubectl get deployment my-web -o yaml
kubectl explain pod.spec.containers # API ์คํค๋ง ํ๋ ์ค๋ช
์ ์ฆ์ ํ์ธ
```
## 3. Pod & Deployment ์์ฑ ๋ฐ ์ค์ผ์ผ๋ง
```bash
# ๐ [1] ์์ ํ
์คํธ Pod ์ฆ์ ์คํ
kubectl run test-curl --image=curlimages/curl --rm -it -- sh
# โ๏ธ [2] Deployment ์์ฑ
kubectl create deployment web-api --image=nginx:alpine --replicas=3
# ๐ [3] ํ๋ ์ธ์คํด์ค ์๋ ์ค์ผ์ผ๋ง
kubectl scale deployment web-api --replicas=5
# ๐ค [4] HPA (์คํ ์ค์ผ์ผ๋ฌ) ์ค์ (CPU ์ฌ์ฉ๋ฅ 70% ์ด๊ณผ ์ ์๋ ํ์ฅ)
kubectl autoscale deployment web-api --min=2 --max=10 --cpu-percent=70
kubectl get hpa
```
## 4. ๋กค๋ง ์
๋ฐ์ดํธ & ๋ฌด์ค๋จ ๋ฐฐํฌ & ๋กค๋ฐฑ (Rollout)
```bash
# ๐ [1] ์ด๋ฏธ์ง ๋ฒ์ ์
๋ฐ์ดํธ (๋กค๋ง ๋ฐฐํฌ ์์)
kubectl set image deployment/web-api nginx=nginx:1.25.4-alpine
# ๐ [2] ๋กค์์ ์งํ ์ํ ๋ชจ๋ํฐ๋ง
kubectl rollout status deployment/web-api
# ๐ [3] ๋ฐฐํฌ ํ์คํ ๋ฆฌ(๋ฆฌ๋น์ ) ์กฐํ
kubectl rollout history deployment/web-api
# โช [4] ์ด์ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋กค๋ฐฑ (Rollback)
kubectl rollout undo deployment/web-api
# ํน์ ๋ฆฌ๋น์ ๋ฒํธ๋ก ๋กค๋ฐฑ
kubectl rollout undo deployment/web-api --to-revision=2
# ๐ [5] ๋ฌด์ค๋จ ์ฌ์์ (ํ๊ฒฝ์ค์ ๋ณ๊ฒฝ ์ ์ฉ ์ ํ๋ ์์ฐจ ์ฌ๊ธฐ๋)
kubectl rollout restart deployment/web-api
```
## 5. ๋คํธ์ํน & ์๋น์ค (Service & Ingress)
```bash
# ๐ [1] Service ์์ฑ (Deployment ๋
ธ์ถ)
# ClusterIP (ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ์ฉ, ๊ธฐ๋ณธ๊ฐ)
kubectl expose deployment web-api --port=80 --target-port=80 --type=ClusterIP
# NodePort (์์ปค๋
ธ๋ ์ธ๋ถ IP:ํฌํธ๋ก ๋
ธ์ถ 30000~32767)
kubectl expose deployment web-api --port=80 --target-port=80 --type=NodePort
# LoadBalancer (ํด๋ผ์ฐ๋ AWS ELB/GCP LB ์๋ ์ฐ๋)
kubectl expose deployment web-api --port=80 --target-port=80 --type=LoadBalancer
# ์๋น์ค ๋ฐ ์๋ํฌ์ธํธ ๋ชฉ๋ก ํ์ธ
kubectl get svc,endpoints
```
```yaml
# ๐ [2] Ingress ๋ผ์ฐํ
YAML ํ์ค ์์ (Nginx Ingress)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-api
port:
number: 80
```
## 6. ConfigMap & Secret (ํ๊ฒฝ์ค์ & ๋ฏผ๊ฐ์ ๋ณด ๋ถ๋ฆฌ)
```bash
# ๐ [1] ConfigMap ์์ฑ (์ผ๋ฐ ํ๊ฒฝ๋ณ์ / ์ค์ ํ์ผ)
kubectl create configmap app-config --from-literal=APP_ENV=production --from-literal=LOG_LEVEL=info
kubectl create configmap nginx-conf --from-file=default.conf
# ๐ [2] Secret ์์ฑ (๋น๋ฐ๋ฒํธ / API Token Base64 ์ํธํ)
kubectl create secret generic db-secret \
--from-literal=DB_PASSWORD='MySecretPass123!' \
--from-file=tls.key=./server.key
# ์กฐํ ๋ฐ ๋์ฝ๋ฉ ํ์ธ
kubectl get configmaps,secrets
kubectl get secret db-secret -o jsonpath="{.data.DB_PASSWORD}" | base64 -d
```
## 7. ํธ๋ฌ๋ธ์ํ
, ๋ก๊ทธ & ์๊ฒฉ ์ ๋๋ฒ๊น
```bash
# ๐ [1] ์ค์๊ฐ ๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ (Tail Logs)
kubectl logs -f <pod-name>
# ๋ค์ค ์ปจํ
์ด๋ Pod์ธ ๊ฒฝ์ฐ ํน์ ์ปจํ
์ด๋ ์ง์ (-c)
kubectl logs -f <pod-name> -c app-container
# ์ง์ ์ ๋น์ ์ ํฌ๋์(CrashLoopBackOff)๋ ์ด์ ์ธ์คํด์ค ๋ก๊ทธ ํ์ธ
kubectl logs <pod-name> --previous
# ๐ป [2] ์คํ ์ค์ธ Pod์ ๋ํํ ์ ์ ์
kubectl exec -it <pod-name> -- /bin/sh
kubectl exec -it <pod-name> -- /bin/bash
# ๐ [3] ๋ก์ปฌ ํฌํธ ํฌ์๋ฉ (๋ฐฉํ๋ฒฝ ํต๊ณผ ๋ก์ปฌ ํ
์คํธ)
# ๋ก์ปฌ 8080 โ Pod 80 ํฌํธ๋ก ํฐ๋๋ง
kubectl port-forward pod/<pod-name> 8080:80
# Service ํฌํธ ํฌ์๋ฉ
kubectl port-forward svc/web-api 8080:80
# ๐ [4] ํ์ผ ๋ณต์ฌ (Local โ Pod)
kubectl cp ./app.jar <pod-name>:/usr/app/app.jar
kubectl cp <pod-name>:/var/log/app.log ./app.log
# ๐ [5] ๋ฆฌ์์ค ์ค์๊ฐ ์ฌ์ฉ๋ ์ธก์ (Metrics Server ํ์)
kubectl top nodes
kubectl top pods --sort-by=memory
```
## 8. ์์ฐ์ฑ ์นํธ: YAML Dry-Run ํ
ํ๋ฆฟ & ๋ฆฌ์์ค ์ญ์
```bash
# ๐ก [1] ์์ผ๋ก ์์ฑํ์ง ์๊ณ YAML ๋ผ๋ ์ฆ์ ์์ฑ (--dry-run=client -o yaml)
# Pod YAML ์์ฑ
kubectl run my-nginx --image=nginx:alpine --dry-run=client -o yaml > pod.yaml
# Deployment YAML ์์ฑ
kubectl create deployment my-deploy --image=nginx --replicas=3 --dry-run=client -o yaml > deploy.yaml
# Service YAML ์์ฑ
kubectl expose deployment my-deploy --port=80 --target-port=8080 --dry-run=client -o yaml > svc.yaml
# ๐ [2] YAML ๋งค๋ํ์คํธ ์ ์ฉ (Declarative Apply)
kubectl apply -f deploy.yaml
kubectl apply -f ./k8s-manifests/ # ๋๋ ํ ๋ฆฌ ๋ด ๋ชจ๋ yaml ์ผ๊ด ์ ์ฉ
kubectl diff -f deploy.yaml # ํด๋ฌ์คํฐ ์ค์ํ์ YAML ๋ณ๊ฒฝ์ฌํญ ๋น๊ต
# ๐งน [3] ๋ฆฌ์์ค ์์ ์ญ์
kubectl delete -f deploy.yaml # YAML ์ ์ ํ์ผ ๊ธฐ๋ฐ ์ญ์
kubectl delete pod <pod-name> --grace-period=0 --force # ๊ฐ์ ์ฆ์ ์ญ์
kubectl delete pods --field-selector=status.phase=Failed # ์คํจํ Pod ์ผ๊ด ์ ๋ฆฌ
```
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์