Flask๋ก ๋ง๋ ์น์ฌ์ดํธ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค๋ก ๋์ด๋ณด์
Flask ๋ด์ฉ
https://koreatstm.tistory.com/category/%F0%9F%90%BC%20%EB%B0%B1%EC%95%A4%EB%93%9C/Flask
'๐ผ ๋ฐฑ์ค๋/Flask' ์นดํ ๊ณ ๋ฆฌ์ ๊ธ ๋ชฉ๋ก
koreatstm.tistory.com
๋ฐฐํฌ
Dockerfile
# Base image
FROM python:3.9-slim
# Set working directory
WORKDIR /app
# Copy requirements and install dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Copy Flask app code
COPY . /app/
# Expose the port
EXPOSE 5001
# Start the Flask app
CMD ["python", "run.py"]
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-app
spec:
replicas: 1
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
app: flask-app
spec:
containers:
- name: flask-app
image: flask-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5001
spec๊ณผ template์ labels์ ์ฌ์ฉ๋๋ app์ด ์ผ์นํด์ผ ํ๋ค
Deployment์ spec ๋ถ๋ถ์ ์ ์๋ selector๋ ์ด๋ค Pod๋ค์ ๊ด๋ฆฌํ ์ง ์ง์ ํ๊ณ ์ด Pod๋ค์ template์์ ์ ์๋๋ค.
Deployment์ spec.selector๋ Pod์ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, Pod์ template.metadata.labels๋ ํด๋น Pod์ด ์ด๋ค ์๋น์ค์ ์ํ ์ง๋ฅผ ์ ์ํ๊ธฐ์ ์ผ์น ์์ผ์ผ ํ๋ค.
service.yaml
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: flask-app
ports:
- protocol: TCP
nodePort: 30001 # ํด๋ฌ์คํฐ ๋
ธ๋์ ํฌํธ (๋ก์ปฌ์์ ์ ๊ทผ ๊ฐ๋ฅํ ํฌํธ)
port: 80 # ์ธ๋ถ์์ ์ ๊ทผํ ํฌํธ
targetPort: 5001 # ์ปจํ
์ด๋ ๋ด๋ถ ํฌํธ
type: NodePort

- NodePort
- ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ํฌํธ
- ์ธ๋ถ(๋ก์ปฌ, ํด๋ผ์ฐ๋)์์ Kubernetes ํด๋ฌ์คํฐ์ ๋ ธ๋์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํฌํธ
- localhost:30001๋ก ์ ์ํ๋ฉด Kubernetes ๋ ธ๋์์ 30001๋ฒ ํฌํธ๊ฐ ์ธ๋ถ์ ์ฐ๊ฒฐ๋์ด ํด๋ฌ์คํฐ ๋ด๋ถ์ ์๋น์ค๋ก ์์ฒญ์ ์ ๋ฌ
- port
- Kubernetes ์๋น์ค(ํด๋ฌ์คํฐ ๋ด)๊ฐ ์ธ๋ถ์ ์์ฒญ์ ๋ฐ์ ํฌํธ
- ์ธ๋ถ์์ ๋ค์ด์ค๋ ์์ฒญ์ NodePort๋ฅผ ํตํด ์ด ์๋น์ค์ port๋ก ์ ๋ฌ
- ์ธ๋ถ์์ ๋ค์ด์จ ์์ฒญ์ ์๋น์ค์ port: 80์ผ๋ก ์ ๋ฌ
- targetPort
- ์๋น์ค์์ ๋ฐ์ ์์ฒญ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ (Pod)์ผ๋ก ์ ๋ฌํ๋ ํฌํธ
- Pod ๋ด์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ํฌํธ, ์๋น์ค๊ฐ ๋ฐ์ ์์ฒญ์ ์ด ํฌํธ๋ก ์ ๋ฌ
- ์๋น์ค๋ ์์ฒญ์ Pod ๋ด 5001๋ฒ ํฌํธ๋ก ์ ๋ฌ
- ์๋น์ค๋ ํ๋
- Service๋ ์ธ๋ถ์์ ์ ๊ทผํ๋ ๋จ์ผ ์ง์ ์ ์ญํ ์ ํฉ๋๋ค.
- ์๋น์ค๋ ๋ด๋ถ์์ ์ฌ๋ฌ Pod์ ์ฐ๊ฒฐ๋ ์ ์๋ค. ์ด Pod๋ค์ ๋ค์ํ ๋ ธ๋์ ๋ถํฌ๋ ์ ์์ผ๋ฉฐ, ์๋น์ค๋ ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์์ฒญ์ ์ ์ ํ Pod๋ก ์ ๋ฌ
- NodePort๋ฅผ ํตํด ์ธ๋ถ ์ ๊ทผ
- ์ธ๋ถ์์ NodePort๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ค. ๋ชจ๋ ๋ ธ๋์์ ๋์ผํ NodePort๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๋ ธ๋๊ฐ ์์ ๋ ์์ฒญ์ ์ด๋ ๋ ธ๋๋ก ๋ค์ด๊ฐ๋ ๋์ผํ ์๋น์ค๋ก ์ ๋ฌ
- ๋ถ๋ฐฐ
- ํด๋ฌ์คํฐ ๋ด์ ์ฌ๋ฌ Pod๊ฐ ์๋น์ค์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์์ฒญ์ด ์ค๋ฉด ์๋น์ค๋ ์ด๋ฅผ ์๋์ผ๋ก ๊ฐ Pod๋ก ๋ถ๋ฐฐ
- ์ด ๋ถ๋ฐฐ๋ Kubernetes์ ์๋น์ค ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด ์ด๋ฃจ์ด์ง๋ค.

์ ๋๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅ
๋กค๋ฐฑ

1. ์ฒ์ ๋ฐฐํฌ ์ํ: replicas๊ฐ 1๋ก ์ค์ ๋์ด ์์๊ณ , Deployment์์ 1๊ฐ์ ํ๋๊ฐ ์คํ๋๊ณ ์์๋ค.
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 34m
2. replicas๋ฅผ 3์ผ๋ก ๋๋ฆฐ ํ: kubectl scale ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ replicas ๊ฐ์ 3์ผ๋ก ๋ณ๊ฒฝ -> ์ด๋ก ์ธํด ์๋ก์ด ํ๋ 2๊ฐ๊ฐ ์์ฑ๋์์ผ๋ฉฐ, ์ด 3๊ฐ์ ํ๋๊ฐ ์คํ ์ค์ธ ์ํ๊ฐ ๋์๋ค.
- <flask-app-55fdcbcffc-pbcs5 (๊ธฐ์กด)>
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-8zfrv 1/1 Running 0 2s
flask-app-55fdcbcffc-9rsm7 1/1 Running 0 2s
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 34m
3. ๋กค๋ฐฑ (kubectl rollout undo): ๋กค๋ฐฑ์ ํ๋ฉด ์ด์ ๋ฒ์ ์ ๋ฐฐํฌ ์ํ๋ก ๋์๊ฐ๋ฉฐ ์ด ๊ณผ์ ์์ ๊ธฐ์กด ํ๋ 1๊ฐ์ ์๋ก์ด ํ๋ 2๊ฐ๊ฐ ์คํ ์ค์ธ ์ํ๋ก ๋๋์๊ฐ๊ณ ์ผ์์ ์ผ๋ก 4๊ฐ์ ํ๋๊ฐ ์คํ๋๋ค.
์ค์ํ ์ ์ ๊ธฐ์กด 3๊ฐ์ ํ๋๊ฐ ์ฌ์ ํ ์คํ๋๊ณ ์๊ณ , ๋กค๋ฐฑ์ผ๋ก ์๋ก ์์ฑ๋ 1๊ฐ์ ํ๋๊ฐ ์ถ๊ฐ๋์ด ์ด 4๊ฐ์ ํ๋๊ฐ ์คํ๋๋ค๋ ๊ฒ
- <flask-app-55fdcbcffc-pbcs5 (๊ธฐ์กด)>
- <flask-app-57644d9cd4-f4sq7 (์๋ก ์์ฑ๋ ๋กค๋ฐฑ ํ๋)>
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-8zfrv 1/1 Running 0 29s
flask-app-55fdcbcffc-9rsm7 1/1 Running 0 29s
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 35m
flask-app-57644d9cd4-f4sq7 0/1 ContainerCreating 0 1s
๋กค๋ง ์ ๋ฐ์ดํธ
์ฟ ๋ฒ๋คํฐ์ค์ ๋ฉ์ธ ๊ธฐ๋ฅ์ธ ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์คํํด๋ณด์
๋ฉ์ธ ํ์ด์ง์ธ index.html์ "<h1>Welcome to Flask App</h1>" ์์ "<h1>ํ๋ผ์คํฌ ํ ์คํธ!</h1>"๋ก ๋ณ๊ฒฝํ๊ณ ํ ์คํธ ํ๊ฒ ๋ค.
{% extends 'base.html' %}
{% block title %}Home - Flask App{% endblock %}
{% block content %}
<h1>ํ๋ผ์คํฌ ํ
์คํธ!</h1>
<p>Click below to see the categories, products, or users:</p>
<ul>
<li><a href="{{ url_for('view_categories.get_categories') }}">View Categories</a></li>
<li><a href="{{ url_for('view_products.get_products') }}">View Products</a></li>
<li><a href="{{ url_for('view_users.get_users') }}">View Users</a></li>
</ul>
{% endblock %}
โ flask git:(main) โ docker build -t flask-app:v2 .
โ flask git:(main) โ cd kubernetes
โ kubernetes git:(main) โ kubectl apply -f deployment.yaml
deployment.apps/flask-app configured
โ kubernetes git:(main) โ kubectl rollout status deployment/flask-app
deployment "flask-app" successfully rolled out
๋์ปค์ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ v2๋ก ์ค์ ํด์ ๊ตฌ๋ถํ ๋ค, deployment.yaml์์ ํ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ ๋์ปค ์ด๋ฏธ์ง์ ๋ฒ์ ์ v2๋ก ๋ณ๊ฒฝํ๊ณ
ํด๋ฌ์คํฐ์ ์ ์๋ ๋ฐฐํฌ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ช ๋ น์ดํ๋ฉด ์ง์ ๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ํ๊ฒฝ ์ค์ ์ ๋ง๊ฒ ํ๋๊ฐ ์์ฑ๋๋ค.
successfully rolled out์ผ๋ก ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์ ๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅ
์กฐ๊ธ ๋ ์ธ์ธํ๊ฒ ์ดํด๋ณด์
โ kubernetes git:(main) โ kubectl describe deployment flask-app
Name: flask-app
Namespace: default
CreationTimestamp: Mon, 31 Mar 2025 12:41:38 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 7
Selector: app=flask-app
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=flask-app
Containers:
flask-app:
Image: flask-app:v2
Port: 5001/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Node-Selectors: <none>
Tolerations: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: flask-app-57644d9cd4 (0/0 replicas created), flask-app-55fdcbcffc (0/0 replicas created), flask-app-65899dfc96 (0/0 replicas created)
NewReplicaSet: flask-app-595c9c957c (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 42m deployment-controller Scaled down replica set flask-app-55fdcbcffc to 1 from 3
Normal ScalingReplicaSet 39m deployment-controller Scaled up replica set flask-app-65899dfc96 to 1 from 0
Normal ScalingReplicaSet 39m deployment-controller Scaled down replica set flask-app-55fdcbcffc to 0 from 1
Normal ScalingReplicaSet 38m deployment-controller Scaled up replica set flask-app-65899dfc96 to 3 from 1
Normal ScalingReplicaSet 38m (x2 over 84m) deployment-controller Scaled up replica set flask-app-57644d9cd4 to 1 from 0
Normal ScalingReplicaSet 38m deployment-controller Scaled down replica set flask-app-65899dfc96 to 1 from 3
Normal ScalingReplicaSet 36m (x3 over 3h54m) deployment-controller Scaled down replica set flask-app-57644d9cd4 to 0 from 1
Normal ScalingReplicaSet 2m56s deployment-controller Scaled up replica set flask-app-595c9c957c to 1
Normal ScalingReplicaSet 2m55s deployment-controller Scaled down replica set flask-app-65899dfc96 to 0 from 1
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
- RollingUpdateStrategy: 25% max unavailable, 25% max surge
- ๋กค๋ง ์ ๋ฐ์ดํธ ์ ๋ต ์๋ฏธ. ์ต๋ 25%๊น์ง์ unavailable ํ๋๊ฐ ์์ ์ ์๊ณ , ์ต๋ 25%๊น์ง surge(์ถ๊ฐ์ ์ธ ํ๋)๊ฐ ์์ ์ ์์. ํ๋๋ฅผ ๊ต์ฒดํ๋ ๋์ ์ต์ํ์ ๊ฐ์ฉ์ฑ์ ์ ์งํ๋ ค๋ ์ค์
- ReplicaSets์ Scaling ์ด๋ฒคํธ
- OldReplicaSets ์น์ ์์ ์ด์ ์ ์คํ๋ ๋ ํ๋ฆฌ์นด์ (flask-app-57644d9cd4, flask-app-55fdcbcffc, flask-app-65899dfc96)์ด ๊ธฐ๋ก๋์ด ์์ผ๋ฉฐ, ์๋ก์ด ๋ ํ๋ฆฌ์นด์ (flask-app-595c9c957c)์ด ์์ฑ๋์์์ ํ์ธ
- Scaling up/down: Scaled down replica set flask-app-55fdcbcffc to 1 from 3, Scaled up replica set flask-app-65899dfc96 to 1 from 0 ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ๋ณต, ์ด๋ ํ๋๊ฐ ์ ์ง์ ์ผ๋ก ๊ต์ฒด๋๊ณ ์์์ ๋ํ๋
- NewReplicaSet
- NewReplicaSet: flask-app-595c9c957c (1/1 replicas created)
- ํ์ฌ ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ๋๋ ํ ์คํ ์ค์ธ ์๋ก์ด ๋ ํ๋ฆฌ์นด์ ์ด flask-app-595c9c957c๋ก ๋ณ๊ฒฝ๋์์์ ๋ํ๋
- ์๋ก ์์ฑ๋ ํ๋๊ฐ 1๊ฐ(1/1 replicas created)์์ ์ ์ ์๋ค.
- Conditions
- Progressing: True, Available: True
- Progressing: True๋ ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์งํ ์ค์ด๋ผ๋ ๋ป
- Available: True๋ ์ ๋ฐ์ดํธ ํ์ ์ต์ํ 1๊ฐ์ ๊ฐ์ฉ ํ๋๊ฐ ์คํ ์ค์ด๋ผ๋ ๋ป
'๐ณ ์ธํ๋ผ > Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฟ ๋ฒ๋คํฐ์ค ์ค์ ํ์ผ (0) | 2025.04.01 |
---|---|
์ฟ ๋ฒ๋คํฐ์ค ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฐ ํฌ์ค์ฒดํฌ (0) | 2025.03.22 |
์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ ํ๋ผ๋ฌ (0) | 2025.03.19 |
์ฟ ๋ฒ๋คํฐ์ค (1) | 2024.09.11 |
Flask๋ก ๋ง๋ ์น์ฌ์ดํธ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค๋ก ๋์ด๋ณด์
Flask ๋ด์ฉ
https://koreatstm.tistory.com/category/%F0%9F%90%BC%20%EB%B0%B1%EC%95%A4%EB%93%9C/Flask
'๐ผ ๋ฐฑ์ค๋/Flask' ์นดํ ๊ณ ๋ฆฌ์ ๊ธ ๋ชฉ๋ก
koreatstm.tistory.com
๋ฐฐํฌ
Dockerfile
# Base image
FROM python:3.9-slim
# Set working directory
WORKDIR /app
# Copy requirements and install dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Copy Flask app code
COPY . /app/
# Expose the port
EXPOSE 5001
# Start the Flask app
CMD ["python", "run.py"]
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-app
spec:
replicas: 1
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
app: flask-app
spec:
containers:
- name: flask-app
image: flask-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5001
spec๊ณผ template์ labels์ ์ฌ์ฉ๋๋ app์ด ์ผ์นํด์ผ ํ๋ค
Deployment์ spec ๋ถ๋ถ์ ์ ์๋ selector๋ ์ด๋ค Pod๋ค์ ๊ด๋ฆฌํ ์ง ์ง์ ํ๊ณ ์ด Pod๋ค์ template์์ ์ ์๋๋ค.
Deployment์ spec.selector๋ Pod์ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, Pod์ template.metadata.labels๋ ํด๋น Pod์ด ์ด๋ค ์๋น์ค์ ์ํ ์ง๋ฅผ ์ ์ํ๊ธฐ์ ์ผ์น ์์ผ์ผ ํ๋ค.
service.yaml
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: flask-app
ports:
- protocol: TCP
nodePort: 30001 # ํด๋ฌ์คํฐ ๋
ธ๋์ ํฌํธ (๋ก์ปฌ์์ ์ ๊ทผ ๊ฐ๋ฅํ ํฌํธ)
port: 80 # ์ธ๋ถ์์ ์ ๊ทผํ ํฌํธ
targetPort: 5001 # ์ปจํ
์ด๋ ๋ด๋ถ ํฌํธ
type: NodePort

- NodePort
- ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ํฌํธ
- ์ธ๋ถ(๋ก์ปฌ, ํด๋ผ์ฐ๋)์์ Kubernetes ํด๋ฌ์คํฐ์ ๋ ธ๋์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํฌํธ
- localhost:30001๋ก ์ ์ํ๋ฉด Kubernetes ๋ ธ๋์์ 30001๋ฒ ํฌํธ๊ฐ ์ธ๋ถ์ ์ฐ๊ฒฐ๋์ด ํด๋ฌ์คํฐ ๋ด๋ถ์ ์๋น์ค๋ก ์์ฒญ์ ์ ๋ฌ
- port
- Kubernetes ์๋น์ค(ํด๋ฌ์คํฐ ๋ด)๊ฐ ์ธ๋ถ์ ์์ฒญ์ ๋ฐ์ ํฌํธ
- ์ธ๋ถ์์ ๋ค์ด์ค๋ ์์ฒญ์ NodePort๋ฅผ ํตํด ์ด ์๋น์ค์ port๋ก ์ ๋ฌ
- ์ธ๋ถ์์ ๋ค์ด์จ ์์ฒญ์ ์๋น์ค์ port: 80์ผ๋ก ์ ๋ฌ
- targetPort
- ์๋น์ค์์ ๋ฐ์ ์์ฒญ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ (Pod)์ผ๋ก ์ ๋ฌํ๋ ํฌํธ
- Pod ๋ด์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ํฌํธ, ์๋น์ค๊ฐ ๋ฐ์ ์์ฒญ์ ์ด ํฌํธ๋ก ์ ๋ฌ
- ์๋น์ค๋ ์์ฒญ์ Pod ๋ด 5001๋ฒ ํฌํธ๋ก ์ ๋ฌ
- ์๋น์ค๋ ํ๋
- Service๋ ์ธ๋ถ์์ ์ ๊ทผํ๋ ๋จ์ผ ์ง์ ์ ์ญํ ์ ํฉ๋๋ค.
- ์๋น์ค๋ ๋ด๋ถ์์ ์ฌ๋ฌ Pod์ ์ฐ๊ฒฐ๋ ์ ์๋ค. ์ด Pod๋ค์ ๋ค์ํ ๋ ธ๋์ ๋ถํฌ๋ ์ ์์ผ๋ฉฐ, ์๋น์ค๋ ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์์ฒญ์ ์ ์ ํ Pod๋ก ์ ๋ฌ
- NodePort๋ฅผ ํตํด ์ธ๋ถ ์ ๊ทผ
- ์ธ๋ถ์์ NodePort๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ค. ๋ชจ๋ ๋ ธ๋์์ ๋์ผํ NodePort๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๋ ธ๋๊ฐ ์์ ๋ ์์ฒญ์ ์ด๋ ๋ ธ๋๋ก ๋ค์ด๊ฐ๋ ๋์ผํ ์๋น์ค๋ก ์ ๋ฌ
- ๋ถ๋ฐฐ
- ํด๋ฌ์คํฐ ๋ด์ ์ฌ๋ฌ Pod๊ฐ ์๋น์ค์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์์ฒญ์ด ์ค๋ฉด ์๋น์ค๋ ์ด๋ฅผ ์๋์ผ๋ก ๊ฐ Pod๋ก ๋ถ๋ฐฐ
- ์ด ๋ถ๋ฐฐ๋ Kubernetes์ ์๋น์ค ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด ์ด๋ฃจ์ด์ง๋ค.

์ ๋๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅ
๋กค๋ฐฑ

1. ์ฒ์ ๋ฐฐํฌ ์ํ: replicas๊ฐ 1๋ก ์ค์ ๋์ด ์์๊ณ , Deployment์์ 1๊ฐ์ ํ๋๊ฐ ์คํ๋๊ณ ์์๋ค.
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 34m
2. replicas๋ฅผ 3์ผ๋ก ๋๋ฆฐ ํ: kubectl scale ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ replicas ๊ฐ์ 3์ผ๋ก ๋ณ๊ฒฝ -> ์ด๋ก ์ธํด ์๋ก์ด ํ๋ 2๊ฐ๊ฐ ์์ฑ๋์์ผ๋ฉฐ, ์ด 3๊ฐ์ ํ๋๊ฐ ์คํ ์ค์ธ ์ํ๊ฐ ๋์๋ค.
- <flask-app-55fdcbcffc-pbcs5 (๊ธฐ์กด)>
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-8zfrv 1/1 Running 0 2s
flask-app-55fdcbcffc-9rsm7 1/1 Running 0 2s
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 34m
3. ๋กค๋ฐฑ (kubectl rollout undo): ๋กค๋ฐฑ์ ํ๋ฉด ์ด์ ๋ฒ์ ์ ๋ฐฐํฌ ์ํ๋ก ๋์๊ฐ๋ฉฐ ์ด ๊ณผ์ ์์ ๊ธฐ์กด ํ๋ 1๊ฐ์ ์๋ก์ด ํ๋ 2๊ฐ๊ฐ ์คํ ์ค์ธ ์ํ๋ก ๋๋์๊ฐ๊ณ ์ผ์์ ์ผ๋ก 4๊ฐ์ ํ๋๊ฐ ์คํ๋๋ค.
์ค์ํ ์ ์ ๊ธฐ์กด 3๊ฐ์ ํ๋๊ฐ ์ฌ์ ํ ์คํ๋๊ณ ์๊ณ , ๋กค๋ฐฑ์ผ๋ก ์๋ก ์์ฑ๋ 1๊ฐ์ ํ๋๊ฐ ์ถ๊ฐ๋์ด ์ด 4๊ฐ์ ํ๋๊ฐ ์คํ๋๋ค๋ ๊ฒ
- <flask-app-55fdcbcffc-pbcs5 (๊ธฐ์กด)>
- <flask-app-57644d9cd4-f4sq7 (์๋ก ์์ฑ๋ ๋กค๋ฐฑ ํ๋)>
NAME READY STATUS RESTARTS AGE
flask-app-55fdcbcffc-8zfrv 1/1 Running 0 29s
flask-app-55fdcbcffc-9rsm7 1/1 Running 0 29s
flask-app-55fdcbcffc-pbcs5 1/1 Running 3 (34m ago) 35m
flask-app-57644d9cd4-f4sq7 0/1 ContainerCreating 0 1s
๋กค๋ง ์ ๋ฐ์ดํธ
์ฟ ๋ฒ๋คํฐ์ค์ ๋ฉ์ธ ๊ธฐ๋ฅ์ธ ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์คํํด๋ณด์
๋ฉ์ธ ํ์ด์ง์ธ index.html์ "<h1>Welcome to Flask App</h1>" ์์ "<h1>ํ๋ผ์คํฌ ํ ์คํธ!</h1>"๋ก ๋ณ๊ฒฝํ๊ณ ํ ์คํธ ํ๊ฒ ๋ค.
{% extends 'base.html' %}
{% block title %}Home - Flask App{% endblock %}
{% block content %}
<h1>ํ๋ผ์คํฌ ํ
์คํธ!</h1>
<p>Click below to see the categories, products, or users:</p>
<ul>
<li><a href="{{ url_for('view_categories.get_categories') }}">View Categories</a></li>
<li><a href="{{ url_for('view_products.get_products') }}">View Products</a></li>
<li><a href="{{ url_for('view_users.get_users') }}">View Users</a></li>
</ul>
{% endblock %}
โ flask git:(main) โ docker build -t flask-app:v2 .
โ flask git:(main) โ cd kubernetes
โ kubernetes git:(main) โ kubectl apply -f deployment.yaml
deployment.apps/flask-app configured
โ kubernetes git:(main) โ kubectl rollout status deployment/flask-app
deployment "flask-app" successfully rolled out
๋์ปค์ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ v2๋ก ์ค์ ํด์ ๊ตฌ๋ถํ ๋ค, deployment.yaml์์ ํ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ ๋์ปค ์ด๋ฏธ์ง์ ๋ฒ์ ์ v2๋ก ๋ณ๊ฒฝํ๊ณ
ํด๋ฌ์คํฐ์ ์ ์๋ ๋ฐฐํฌ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ช ๋ น์ดํ๋ฉด ์ง์ ๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ํ๊ฒฝ ์ค์ ์ ๋ง๊ฒ ํ๋๊ฐ ์์ฑ๋๋ค.
successfully rolled out์ผ๋ก ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์ ๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅ
์กฐ๊ธ ๋ ์ธ์ธํ๊ฒ ์ดํด๋ณด์
โ kubernetes git:(main) โ kubectl describe deployment flask-app
Name: flask-app
Namespace: default
CreationTimestamp: Mon, 31 Mar 2025 12:41:38 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 7
Selector: app=flask-app
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=flask-app
Containers:
flask-app:
Image: flask-app:v2
Port: 5001/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Node-Selectors: <none>
Tolerations: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: flask-app-57644d9cd4 (0/0 replicas created), flask-app-55fdcbcffc (0/0 replicas created), flask-app-65899dfc96 (0/0 replicas created)
NewReplicaSet: flask-app-595c9c957c (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 42m deployment-controller Scaled down replica set flask-app-55fdcbcffc to 1 from 3
Normal ScalingReplicaSet 39m deployment-controller Scaled up replica set flask-app-65899dfc96 to 1 from 0
Normal ScalingReplicaSet 39m deployment-controller Scaled down replica set flask-app-55fdcbcffc to 0 from 1
Normal ScalingReplicaSet 38m deployment-controller Scaled up replica set flask-app-65899dfc96 to 3 from 1
Normal ScalingReplicaSet 38m (x2 over 84m) deployment-controller Scaled up replica set flask-app-57644d9cd4 to 1 from 0
Normal ScalingReplicaSet 38m deployment-controller Scaled down replica set flask-app-65899dfc96 to 1 from 3
Normal ScalingReplicaSet 36m (x3 over 3h54m) deployment-controller Scaled down replica set flask-app-57644d9cd4 to 0 from 1
Normal ScalingReplicaSet 2m56s deployment-controller Scaled up replica set flask-app-595c9c957c to 1
Normal ScalingReplicaSet 2m55s deployment-controller Scaled down replica set flask-app-65899dfc96 to 0 from 1
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
- RollingUpdateStrategy: 25% max unavailable, 25% max surge
- ๋กค๋ง ์ ๋ฐ์ดํธ ์ ๋ต ์๋ฏธ. ์ต๋ 25%๊น์ง์ unavailable ํ๋๊ฐ ์์ ์ ์๊ณ , ์ต๋ 25%๊น์ง surge(์ถ๊ฐ์ ์ธ ํ๋)๊ฐ ์์ ์ ์์. ํ๋๋ฅผ ๊ต์ฒดํ๋ ๋์ ์ต์ํ์ ๊ฐ์ฉ์ฑ์ ์ ์งํ๋ ค๋ ์ค์
- ReplicaSets์ Scaling ์ด๋ฒคํธ
- OldReplicaSets ์น์ ์์ ์ด์ ์ ์คํ๋ ๋ ํ๋ฆฌ์นด์ (flask-app-57644d9cd4, flask-app-55fdcbcffc, flask-app-65899dfc96)์ด ๊ธฐ๋ก๋์ด ์์ผ๋ฉฐ, ์๋ก์ด ๋ ํ๋ฆฌ์นด์ (flask-app-595c9c957c)์ด ์์ฑ๋์์์ ํ์ธ
- Scaling up/down: Scaled down replica set flask-app-55fdcbcffc to 1 from 3, Scaled up replica set flask-app-65899dfc96 to 1 from 0 ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ๋ณต, ์ด๋ ํ๋๊ฐ ์ ์ง์ ์ผ๋ก ๊ต์ฒด๋๊ณ ์์์ ๋ํ๋
- NewReplicaSet
- NewReplicaSet: flask-app-595c9c957c (1/1 replicas created)
- ํ์ฌ ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ๋๋ ํ ์คํ ์ค์ธ ์๋ก์ด ๋ ํ๋ฆฌ์นด์ ์ด flask-app-595c9c957c๋ก ๋ณ๊ฒฝ๋์์์ ๋ํ๋
- ์๋ก ์์ฑ๋ ํ๋๊ฐ 1๊ฐ(1/1 replicas created)์์ ์ ์ ์๋ค.
- Conditions
- Progressing: True, Available: True
- Progressing: True๋ ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์งํ ์ค์ด๋ผ๋ ๋ป
- Available: True๋ ์ ๋ฐ์ดํธ ํ์ ์ต์ํ 1๊ฐ์ ๊ฐ์ฉ ํ๋๊ฐ ์คํ ์ค์ด๋ผ๋ ๋ป
'๐ณ ์ธํ๋ผ > Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฟ ๋ฒ๋คํฐ์ค ์ค์ ํ์ผ (0) | 2025.04.01 |
---|---|
์ฟ ๋ฒ๋คํฐ์ค ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฐ ํฌ์ค์ฒดํฌ (0) | 2025.03.22 |
์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ ํ๋ผ๋ฌ (0) | 2025.03.19 |
์ฟ ๋ฒ๋คํฐ์ค (1) | 2024.09.11 |