※ k8s에 Web Application 배포 시 세팅해야 하는 기본(주요) 리소스
- 웹 서비스를 완성하는 4대 핵심 리소스 : 앱 관리(Deployment), 내부 연결(Service), 부하 대응(HPA), 도메인 접속(Ingress)
> k8s 설정 yml에서 kind에 들어가는 속성
- Deployment : 컨테이너를 몇 개 띄울지 결정하고, 앱이 죽으면 다시 살리며, 업데이트 시 중단 없이 교체해주는 컨트롤러
- Service : 파드는 IP가 수시로 변하므로, 서비스라는 고정된 이름을 통해 파드들이 서로 통신하거나 외부에서 접속할 수 있게 연결
- HPA (Horizontal Pod Autoscaler) : CPU나 메모리 사용량이 설정치를 넘어가면 Deployment의 replicas를 자동으로 늘려 서버 다운을 방지
- Ingress: 여러 서비스를 하나의 공인 IP로 묶고, 도메인(예: api.test.com)이나 주소 경로(예: /login)에 따라 트래픽을 분산하며 SSL 보안 인증서를 적용
※ 리소스 구분
| 리소스명 (kind) | 핵심 역할 | 실무 비유 |
| Deployment | 앱 생성 및 버전 관리 | 본체 (Server) |
| Service | 고정 주소(IP/Port) 제공 | 내부 입구 (Gateway) |
| HPA | 부하에 따른 자동 확장 | 보험 (Autoscaling) |
| Ingress | 도메인 연결 및 경로 설정 | 간판/문지기 (Domain/L7) |
1. App 배포 환경 구성 및 배포
- k8s dashboard 접속 > Namespace [default] > [+] 버튼 > [입력을 통해 생성] > yaml 파일 붙여넣기 > 업로드
- 아래는 테스트용으로 썼던 yml. (나중엔 내가 개발한 APP으로 image 빌드 후 배포해보자)
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-1-2-2-1
spec:
selector:
matchLabels:
app: '1.2.2.1'
replicas: 2
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: '1.2.2.1'
spec:
containers:
- name: app-1-2-2-1
image: 1pro/app
imagePullPolicy: Always
ports:
- name: http
containerPort: 8080
startupProbe:
httpGet:
path: "/ready"
port: http
failureThreshold: 20
livenessProbe:
httpGet:
path: "/ready"
port: http
readinessProbe:
httpGet:
path: "/ready"
port: http
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: app-1-2-2-1
spec:
selector:
app: '1.2.2.1'
ports:
- port: 8080
targetPort: 8080
nodePort: 31221
type: NodePort
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-1-2-2-1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app-1-2-2-1
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 40

2. App에 지속적으로 트래픽 보내기 (Traffic Routing 테스트)
# k8s-master에서 2초마다 트래픽 요청
[root@k8s-master ~]# while true; do curl http://192.168.56.30:31221/hostname; sleep 2; echo ''; done;

3. App에 Memory Leak 나게 하기 (Self-Healing 테스트)
# k8s-master에서 실행
[root@k8s-master ~]# curl 192.168.56.30:31221/memory-leak
* 결과 : pod 1개가 restart함
4. App에 부하주기 (AutoScaling 테스트)
# k8s-master에서 요청
[root@k8s-master ~]# curl 192.168.56.30:31221/cpu-load
* pod가 2개 더 생성되어 총 4개가 됨
>> YAML에 설정한 HPA(Horizontal Pod Autoscaler)가 CPU 부하를 감지하고, 서비스 안정성을 위해 파드 개수를 자동으로 늘린 것.
>> [상세 원인 분석]
- 부하 발생: /cpu-load 경로로 접속하면 해당 파드의 CPU 사용량이 강제로 급증
- 임계치 초과: 앞서 작성한 YAML에서 CPU 사용량이 40%를 넘으면 확장하도록 설정함
- 자동 확장: 쿠버네티스가 "현재 2개로는 부하를 감당하기 어렵다"고 판단하여, 설정된 최대치인 4개(maxReplicas: 4)까지 파드를 2개 더 생성한 것
5. App 이미지 업데이트 (RollingUpdate 테스트)
- Namespace: default > 디플로이먼트 > ... > 편집
spec:
containers:
- name: app-1-2-2-1
image: 1pro/app-update # 수정
- Script 실행 시
[root@k8s-master ~]# kubectl set image -n default deployment/app-1-2-2-1 app-1-2-2-1=1pro/app-update
* 결과 : 업데이트 된 이미지가 적용된 pod가 올라올 동안, 이전 pod도 유지됨

※ update 중지 script
[root@k8s-master ~]# kubectl rollout undo -n default deployment/app-1-2-2-1
※ object 삭제 script
[root@k8s-master ~]# kubectl delete -n default deploy app-1-2-2-1
[root@k8s-master ~]# kubectl delete -n default svc app-1-2-2-1
[root@k8s-master ~]# kubectl delete -n default hpa app-1-2-2-1
'Cloud & Infra > K8S' 카테고리의 다른 글
| [K8S] K8S object 이해 (0) | 2026.03.16 |
|---|---|
| [K8S] K8S에서 Prometheus, Loki, Grafana 설치하기 (0) | 2026.03.11 |
| [K8S] K8S 구성요소(컴포넌트)와 인터페이스 규격 (0) | 2026.03.10 |
| [K8S] 로컬에 K8S 환경 구축하기 (0) | 2026.03.10 |
