티스토리 뷰

반응형

쿠버네티스 실습: YAML 매니페스트로 Nginx 배포하기

앞선 글에서는 kubectl create 명령으로 DeploymentService를 직접 만들었습니다. 하지만 운영 환경에서는 이런 방식보다는 YAML 매니페스트 파일을 작성해 선언적으로 리소스를 관리하는 게 표준입니다.

이번 글에서는 동일한 Nginx 배포를 YAML로 정의하고, 적용/수정/삭제하는 과정을 실습합니다.


1) 왜 YAML 매니페스트인가?

  • kubectl create는 임시성입니다. 명령으로 만든 리소스를 수정하려면 다시 긴 옵션을 입력해야 합니다.
  • YAML은 **쿠버네티스 오브젝트의 상태(Desired State)**를 코드로 기록합니다.
  • Git에 보관할 수 있어 **GitOps, IaC(인프라 코드화)**를 구현할 수 있습니다.

즉, 운영자 입장에서는 리소스를 사람이 기억하는 대신 코드로 관리하는 게 핵심입니다.


2) Deployment 매니페스트 작성

nginx-deployment.yaml 파일을 작성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-nginx
  labels:
    app: hello-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80

설명

  • apiVersion: 쿠버네티스 API 그룹. Deployment는 apps/v1.
  • kind: 리소스 종류. 여기서는 Deployment.
  • metadata: 리소스 이름(hello-nginx)과 라벨.
  • replicas: 동일 Pod 개수(=2).
  • selector: 어떤 라벨을 가진 Pod를 관리할지 정의.
  • template: Pod 템플릿. (여기서 nginx:1.27 이미지와 80포트 노출)

3) Service 매니페스트 작성

반응형

nginx-service.yaml 파일을 작성합니다.

apiVersion: v1
kind: Service
metadata:
  name: hello-nginx-svc
spec:
  type: NodePort
  selector:
    app: hello-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

설명

  • kind: Service → Pod 묶음을 외부에서 접근할 수 있는 고정 엔드포인트 제공.
  • type: NodePort → 로컬 환경에서 외부 접근을 허용.
  • selector → 라벨이 app=hello-nginx인 Pod를 찾음.
  • ports
    • port: 서비스 내부 포트(고정)
    • targetPort: Pod 컨테이너가 열고 있는 포트(nginx:80)
    • nodePort: 노드에서 열릴 실제 포트(30080)

4) 리소스 생성하기

kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml

적용 확인:

kubectl get pods
kubectl get svc

예상 출력:

NAME                           READY   STATUS    RESTARTS   AGE
hello-nginx-7d59c7cfcf-abc12   1/1     Running   0          20s
hello-nginx-7d59c7cfcf-def34   1/1     Running   0          20s

NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hello-nginx-svc   NodePort   10.96.245.143   <none>        80:30080/TCP   20s

5) 서비스 접속 검증

방법 A (자동 URL 제공)

minikube service hello-nginx-svc

방법 B (수동 접속)

curl -I http://$(minikube ip):30080

정상 응답 예시:

HTTP/1.1 200 OK
Server: nginx/1.27.x

6) 수정과 롤링 업데이트

Deployment에서 replicas: 2를 replicas: 3으로 수정한 뒤, 다시 적용합니다.

kubectl apply -f nginx-deployment.yaml
kubectl get pods

Pod가 자동으로 1개 더 추가되는 걸 확인할 수 있습니다.

롤링 업데이트 동작 구조

  • 새 ReplicaSet을 생성 → 새 Pod 띄우기 → 기존 Pod 줄이기
  • 다운타임 없이 새로운 버전 배포 가능

7) 삭제(정리)

kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

8) 정리

  • kubectl create는 빠르게 체험용,
  • YAML 매니페스트(apply -f)는 재현 가능하고 운영 친화적.
  • Deployment와 Service를 함께 정의하면 언제든지 클러스터에 동일한 앱을 재배포할 수 있다.

다음 글에서는 ConfigMap과 Secret을 활용해 Nginx에 사용자 정의 설정 파일을 주입하는 실습을 진행하겠습니다.


 

쿠버네티스,YAML매니페스트,Minikube,DevOps,컨테이너,Nginx배포,NodePort,Pod,ReplicaSet,서비스노출

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함
반응형