Kubernetes μ λ¬Έ
Kubernetes μ λ¬Έ¶
1. Kubernetesλ?¶
Kubernetes(K8s)λ 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ νλ«νΌμ λλ€. μ¬λ¬ 컨ν μ΄λμ λ°°ν¬, νμ₯, κ΄λ¦¬λ₯Ό μλνν©λλ€.
Docker vs Kubernetes¶
| Docker | Kubernetes |
|---|---|
| 컨ν μ΄λ μ€ν | 컨ν μ΄λ κ΄λ¦¬/μ€μΌμ€νΈλ μ΄μ |
| λ¨μΌ νΈμ€νΈ | ν΄λ¬μ€ν° (μ¬λ¬ μλ²) |
| μλ μ€μΌμΌλ§ | μλ μ€μΌμΌλ§ |
| λ¨μ λ°°ν¬ | λ‘€λ§ μ λ°μ΄νΈ, λ‘€λ°± |
μ Kubernetesκ° νμνκ°?¶
λ¬Έμ μν©:
컨ν
μ΄λκ° 100κ°μΌ λ...
- μ΄λ€ μλ²μ λ°°ν¬ν΄μΌ νλ?
- 컨ν
μ΄λκ° μ£½μΌλ©΄ λκ° λ€μ μμνλ?
- νΈλν½μ΄ λλ©΄ μ΄λ»κ² νμ₯νλ?
- μ λ²μ λ°°ν¬ μ€ λ€μ΄νμμ?
Kubernetes ν΄κ²°μ± :
- μλ μ€μΌμ€λ§: μ΅μ μ λ
Έλμ λ°°μΉ
- μκ° μΉμ : μ₯μ μ μλ 볡ꡬ
- μλ μ€μΌμΌλ§: λΆνμ λ°λΌ νμ₯/μΆμ
- λ‘€λ§ μ
λ°μ΄νΈ: 무μ€λ¨ λ°°ν¬
2. Kubernetes μν€ν μ²¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Kubernetes Cluster β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Control Plane β β
β β βββββββββββ ββββββββββββ βββββββββββββ βββββββββββββ β β
β β β API β β Schedulerβ β Controllerβ β etcd β β β
β β β Server β β β β Manager β β β β β
β β βββββββββββ ββββββββββββ βββββββββββββ βββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββΌβββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β Node 1 β β Node 2 β β Node 3 β β
β β ββββββββββ β β ββββββββββ β β ββββββββββ β β
β β β kubeletβ β β β kubeletβ β β β kubeletβ β β
β β ββββββββββ€ β β ββββββββββ€ β β ββββββββββ€ β β
β β β Pod β β β β Pod β β β β Pod β β β
β β β Pod β β β β Pod β β β β Pod β β β
β β ββββββββββ β β ββββββββββ β β ββββββββββ β β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
μ£Όμ κ΅¬μ± μμ¶
| κ΅¬μ± μμ | μν |
|---|---|
| API Server | λͺ¨λ μμ²μ μ²λ¦¬νλ μ€μ κ²μ΄νΈμ¨μ΄ |
| Scheduler | Podλ₯Ό μ΄λ Nodeμ λ°°μΉν μ§ κ²°μ |
| Controller Manager | μνλ μν μ μ§ (볡μ , λ°°ν¬ λ±) |
| etcd | ν΄λ¬μ€ν° μν μ μ₯μ |
| kubelet | κ° Nodeμμ 컨ν μ΄λ μ€ν κ΄λ¦¬ |
| kube-proxy | λ€νΈμν¬ νλ‘μ, μλΉμ€ λ‘λλ°Έλ°μ± |
3. ν΅μ¬ κ°λ ¶
Pod¶
- Kubernetesμ μ΅μ λ°°ν¬ λ¨μ
- νλ μ΄μμ 컨ν μ΄λ ν¬ν¨
- κ°μ Podμ 컨ν μ΄λλ λ€νΈμν¬/μ€ν λ¦¬μ§ κ³΅μ
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
Deployment¶
- Podμ μ μΈμ λ°°ν¬ κ΄λ¦¬
- 볡μ λ³Έ μ κ΄λ¦¬ (ReplicaSet)
- λ‘€λ§ μ λ°μ΄νΈ, λ‘€λ°± μ§μ
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3 # Pod 3κ° μ μ§
selector:
matchLabels:
app: my-app
template: # Pod ν
νλ¦Ώ
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
Service¶
- Podμ λν λ€νΈμν¬ μ κ·Όμ
- λ‘λλ°Έλ°μ±
- Podκ° λ°λμ΄λ μΌκ΄λ μ κ·Ό μ 곡
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # μ΄ λΌλ²¨μ Podλ‘ νΈλν½ μ λ¬
ports:
- port: 80 # Service ν¬νΈ
targetPort: 80 # Pod ν¬νΈ
type: ClusterIP # μλΉμ€ νμ
Service νμ ¶
| νμ | μ€λͺ |
|---|---|
ClusterIP |
ν΄λ¬μ€ν° λ΄λΆμμλ§ μ κ·Ό (κΈ°λ³Έκ°) |
NodePort |
κ° Nodeμ ν¬νΈλ‘ μΈλΆ μ κ·Ό |
LoadBalancer |
ν΄λΌμ°λ λ‘λλ°Έλ°μ μ°κ²° |
4. λ‘컬 νκ²½ μ€μ ¶
minikube μ€μΉ¶
λ‘컬μμ Kubernetesλ₯Ό μ€ννλ λꡬμ λλ€.
macOS:
brew install minikube
Windows (Chocolatey):
choco install minikube
Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube μμ¶
# ν΄λ¬μ€ν° μμ
minikube start
# μν νμΈ
minikube status
# λμ보λ μ΄κΈ°
minikube dashboard
# ν΄λ¬μ€ν° μ€μ§
minikube stop
# ν΄λ¬μ€ν° μμ
minikube delete
kubectl μ€μΉ¶
Kubernetes ν΄λ¬μ€ν°μ ν΅μ νλ CLI λꡬμ λλ€.
macOS:
brew install kubectl
Windows:
choco install kubernetes-cli
νμΈ:
kubectl version --client
5. kubectl κΈ°λ³Έ λͺ λ Ήμ΄¶
리μμ€ μ‘°ν¶
# λͺ¨λ Pod μ‘°ν
kubectl get pods
# λͺ¨λ 리μμ€ μ‘°ν
kubectl get all
# μμΈ μ 보
kubectl get pods -o wide
# YAML νμμΌλ‘ μΆλ ₯
kubectl get pod my-pod -o yaml
# λ€μμ€νμ΄μ€ μ§μ
kubectl get pods -n kube-system
리μμ€ μμ±/μμ ¶
# YAML νμΌλ‘ μμ±
kubectl apply -f deployment.yaml
# μμ
kubectl delete -f deployment.yaml
# μ΄λ¦μΌλ‘ μμ
kubectl delete pod my-pod
kubectl delete deployment my-deployment
μμΈ μ 보¶
# 리μμ€ μμΈ μ 보
kubectl describe pod my-pod
kubectl describe deployment my-deployment
# λ‘κ·Έ νμΈ
kubectl logs my-pod
kubectl logs -f my-pod # μ€μκ°
# 컨ν
μ΄λ μ μ
kubectl exec -it my-pod -- /bin/sh
μ€μΌμΌλ§¶
# 볡μ λ³Έ μ λ³κ²½
kubectl scale deployment my-deployment --replicas=5
6. μ€μ΅ μμ ¶
μμ 1: 첫 λ²μ§Έ Pod μ€ν¶
# 1. Pod μ§μ μ€ν
kubectl run nginx-pod --image=nginx:alpine
# 2. νμΈ
kubectl get pods
# 3. μμΈ μ 보
kubectl describe pod nginx-pod
# 4. λ‘κ·Έ νμΈ
kubectl logs nginx-pod
# 5. μμ
kubectl delete pod nginx-pod
μμ 2: Deploymentλ‘ μ± λ°°ν¬¶
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: nginxdemos/hello
ports:
- containerPort: 80
# 1. Deployment μμ±
kubectl apply -f deployment.yaml
# 2. νμΈ
kubectl get deployments
kubectl get pods
# 3. Pod νλ μμ ν΄λ³΄κΈ° (μλ 볡ꡬ νμΈ)
kubectl delete pod <pod-name>
kubectl get pods # μ Podκ° μμ±λ¨
# 4. μ€μΌμΌ μ
kubectl scale deployment hello-app --replicas=5
kubectl get pods
μμ 3: Serviceλ‘ λ ΈμΆ¶
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 80
type: NodePort
# 1. Service μμ±
kubectl apply -f service.yaml
# 2. νμΈ
kubectl get services
# 3. minikubeμμ μ κ·Ό
minikube service hello-service
# λλ ν¬νΈ ν¬μλ©
kubectl port-forward service/hello-service 8080:80
# http://localhost:8080 μμ νμΈ
μμ 4: μ 체 μ ν리μΌμ΄μ (Node.js + MongoDB)¶
app-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app
spec:
replicas: 2
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node
image: node:18-alpine
command: ["node", "-e", "require('http').createServer((req,res)=>{res.end('Hello K8s!')}).listen(3000)"]
ports:
- containerPort: 3000
env:
- name: MONGO_URL
value: "mongodb://mongo-service:27017/mydb"
---
apiVersion: v1
kind: Service
metadata:
name: node-service
spec:
selector:
app: node-app
ports:
- port: 80
targetPort: 3000
type: NodePort
mongo-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongo
image: mongo:6
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-storage
mountPath: /data/db
volumes:
- name: mongo-storage
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mongo-service
spec:
selector:
app: mongo
ports:
- port: 27017
targetPort: 27017
# 1. MongoDB λ°°ν¬
kubectl apply -f mongo-deployment.yaml
# 2. Node.js μ± λ°°ν¬
kubectl apply -f app-deployment.yaml
# 3. νμΈ
kubectl get all
# 4. μ μ
minikube service node-service
7. λ‘€λ§ μ λ°μ΄νΈ¶
μ λ°μ΄νΈ μ μ©¶
# μ΄λ―Έμ§ μ
λ°μ΄νΈ
kubectl set image deployment/hello-app hello=nginxdemos/hello:latest
# λλ YAML μμ ν
kubectl apply -f deployment.yaml
μ λ°μ΄νΈ μν νμΈ¶
# λ‘€μμ μν
kubectl rollout status deployment/hello-app
# νμ€ν 리
kubectl rollout history deployment/hello-app
λ‘€λ°±¶
# μ΄μ λ²μ μΌλ‘ λ‘€λ°±
kubectl rollout undo deployment/hello-app
# νΉμ λ²μ μΌλ‘ λ‘€λ°±
kubectl rollout undo deployment/hello-app --to-revision=2
8. ConfigMapκ³Ό Secret¶
ConfigMap - μ€μ λ°μ΄ν°¶
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db-service"
LOG_LEVEL: "info"
Deploymentμμ μ¬μ©:
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
Secret - λ―Όκ°ν λ°μ΄ν°¶
# Secret μμ±
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123
# YAMLλ‘ μμ± (base64 μΈμ½λ© νμ)
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # echo -n 'admin' | base64
password: c2VjcmV0MTIz # echo -n 'secret123' | base64
Deploymentμμ μ¬μ©:
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
9. λ€μμ€νμ΄μ€¶
리μμ€λ₯Ό λ Όλ¦¬μ μΌλ‘ λΆλ¦¬ν©λλ€.
# λ€μμ€νμ΄μ€ μμ±
kubectl create namespace dev
kubectl create namespace prod
# νΉμ λ€μμ€νμ΄μ€μ λ°°ν¬
kubectl apply -f deployment.yaml -n dev
# κΈ°λ³Έ λ€μμ€νμ΄μ€ λ³κ²½
kubectl config set-context --current --namespace=dev
λͺ λ Ήμ΄ μμ½¶
| λͺ λ Ήμ΄ | μ€λͺ |
|---|---|
kubectl get pods |
Pod λͺ©λ‘ |
kubectl get all |
λͺ¨λ 리μμ€ |
kubectl apply -f file.yaml |
리μμ€ μμ±/μ λ°μ΄νΈ |
kubectl delete -f file.yaml |
리μμ€ μμ |
kubectl describe pod name |
μμΈ μ 보 |
kubectl logs pod-name |
λ‘κ·Έ νμΈ |
kubectl exec -it pod -- sh |
컨ν μ΄λ μ μ |
kubectl scale deployment name --replicas=N |
μ€μΌμΌλ§ |
kubectl rollout status |
λ°°ν¬ μν |
kubectl rollout undo |
λ‘€λ°± |
λ€μ νμ΅ μΆμ²¶
- Ingress: HTTP λΌμ°ν , SSL μ²λ¦¬
- Persistent Volume: μꡬ μ μ₯μ
- Helm: ν¨ν€μ§ κ΄λ¦¬μ
- λͺ¨λν°λ§: Prometheus, Grafana
- μλΉμ€ λ©μ: Istio, Linkerd