YAML 파일 작성 법 및 세부 내용 설명 updated_at: 2025-06-19 15:02

yaml

앞에서 설명드린 "간단한 웹서버 구축"에서 간단한 yaml 파일을 작성하였는데 이 번장에서는 각각의 상세 내용을 설명 드리겠습니다.

Yaml 파일 기본 구조

apiVersion : 
kind : 
metadata : 
spec : 

Pod API

apiVersion : v1 설정(apps/v1, autoscaling/v1..)
kind : 오브젝트를 지정(Deployment, Pod, Service, Ingress, Job..)
metadata : 오브젝트의 정보를 입력, 
  name: 필수 값(namespace 상에서 유일한 값)
  namespace: default,
  labels: 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value쌍
spec : 
  initContainers : 초기화 전용 컨테이너의 명세를 기술
  nodeSelector : Pod가 배포될 노드의 이름을 지정
  volumes : Pod 내 컨테이너 간에 공유할 수 있는 볼륨을 지정
  containers : 컨테이너의 명세를 배열(대쉬'-')로 기술
    image : 컨테이너 생성시 사용할 이미지
    name : 컨테이너 이름
    livenessProbe : 컨테이너 내의 프로그램이 정상적으로 동작 중인지 검사하는 프로브
    readinessProbe : 컨테이너 내의 프로그램이 사용자의 요청을 받을 준비가 되었는지 검사하는 프로브
    ports : 외부 요청을 전달하기 위한 포트 목록
    resources : CPU와 메모리 제한
    volumeMounts : 파드에 정의한 볼륨을 컨테이너의 마운트할 경로
    command : 컨테이너 생성 시 마지막에 실행할 명령어
    args : command의 매개변수
    env : 환경변수 설정

apiVersion

이 오브젝트를 생성하기 위해서 사용할 쿠버네티스 API 버전을 명세합니다.

- apps/v1

쿠버네티스의 common API 모음입니다.
Deployment, RollingUpdate, ReplicaSet을 포함합니다.

- autoscaling/v1

pod의 autoscale 기능을 포함하는 API, 현재는 CPU metric을 사용한 scaling만 가능합니다

kind

어떤 종류의 오브젝트를 생성하고자 하는지, 생성할 k8s obejct 타입

리소스 타입 주요 용도 특징 상세보기
Pod 컨테이너 실행 단위 가장 기본 단위, 관리 기능 없음 [Pod]
Deployment 무상태 앱 자동화 관리 롤링 업데이트, 복구, 스케일링 지원 [Deployment]
Service 고정된 가상 IP생성 Pod 앞단에 고정된 가상 IP를 만들어 일관된 접근 방식을 제공 [Service]
StatefulSet 상태 저장 앱 관리 고유 ID, 저장소 보장, 순차적 배포 [StatefulSet]
ReplicaSet Pod 개수 유지 직접 잘 안 씀, Deployment 내부 사용 [ReplicaSet]
DaemonSet 노드마다 하나씩 배포 로그 수집, 모니터링 등 데몬용 [DaemonSet]
Job 일회성 작업 성공/실패 상태 추적, 자동 종료 [Job]
CronJob 주기적 작업 Job + 스케줄 기능 [CronJob]

- Service

ExternalIP

쿠버네티스상의 파드에서 외부의 애플리케이션에 접속하는 하이브리드 구성의 애플리케이션을 개발할 때 유용합니다.

- Ingress

클러스터 외부에서의 요청을 K8s 클러스터 내부의 애플리케이션에 연결하기 위한 API 오브젝트입니다.

  • 공개 URL과 애플리케이션 매핑
  • 복수의 도메인 이름을 가지는 가상 호스트 기능
  • 클라이언트의 요청을 여러 파드에 분산
  • SSL/TLS 암호화 통신 HTTPS
  • 세션 어피니티
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-ingress // ingress 오브젝트 이름
  annotations:
    kubernetes.io/ingress.class: 'nginx' // 인그레스 컨트롤러 설정
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: // dns명과 백엔드 서비스를 대응시키는 규칙 목록, 규칙에 맞지 않는 요청은 디폴트 백엔드라는 파드에 전송
  - host: abc.sample.com
    http:
      paths:
      - path: /
        backend:
          serviceName: helloworld-svc
          servicePort: 8080
      - path: /apl2
        backend: // 대응하는 서비스명과 포트번호
          serviceName: nginx-svc
          servicePort: 9080
  - host: xyz.sample.com
    http:
      paths:
      - path: /
        backend:
          serviceName: java-svc
          servicePort: 9080

- Job

Job Controller에서 Job 이란 배치 처리라고 불리며, 한 묶음의 프로그램을 실행하는 걸 말합니다.

특징
  • 지정한 실행 횟수와 병행 개수에 따라 한 개 이상의 파드를 실행
  • 파드 내에 있는 모든 컨테이너가 정상 종료한 경우에 파드를 정상 종료한 것으로 취급
  • 잡에 기술한 파드의 실행 횟수를 전부 정상 종료하면, 잡은 종료
  • 노드 장애등에 의해 파드가 제거된 경우, 다른 노드에서 파드를 재실행합니다.
  • 잡에 의해 실행된 파드는 잡이 삭제될 떄까지 유지, 잡을 삭제하면 모든 파드가 삭제
CronJob

크론잡은 지정된 시각에 Job을 만듭니다. 생성된 다의 개수가 정해진 수를 넘어가면, 가비지 수집 컨트롤러가 파드를 삭제합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: normal-end
spec: // kind(여기서는 Job)의 세부 사양
  template: // 구동하는 파드에 대해 기술하는 파드 템플릿
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["/bin/sh",  "-c", "sleep 5; exit 0"]
      restartPolicy: Never
  completions: 6 // 총 실행 횟수
  parallelism: 2 // 동시 실행을 하는 파드의 개수

- ConfigMap

metadata

오브젝트의 이름을 부여합니다. 오브젝트를 구분지어줄 데이터입니다

  • name : namespace 상에서 유일한 값
  • namespace : (defulat: default)
  • labels : 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value쌍

spec

생성할 오브젝트의 구체적 내용을 정의하는 spec, spec에 대한 포맷은 k8s object종류마다 다릅니다.

replicas

selector

template

yaml 파일 예시

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: python-sample-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: python-sample-app
  replicas: 1
  template:
    metadata:
      labels:
        app: python-sample-app
    spec:
      containers:
      - name: python-sample
        image: dockerimage주소:태그
        imagePullPolicy: IfNotPresent # ? docker hub에 없을 경우 local 에서 참조
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        ports:
        - containerPort: 8000

Namespace

namespace란 쿠버네티스 오브젝트를 묶는 하나의 가상공간 또는 그룹을 말합니다.

Create

kubectl apply -f test-namespace.yaml
kubectl create namespace test
apiVersion: v1
kind: Namespace
metadata:  
  name: test  
spec:  
  limits:  
  - default:
      cpu: 1
  defaultRequest:
    cpu: 0.5
    type: Container
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글