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. AppMemory 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

* pod2개 더 생성되어 총 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

+ Recent posts