서론
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 도구입니다. 쿠버네티스를 효과적으로 사용하기 위해서는 YAML 파일을 작성하는 방법을 잘 이해하는 것이 중요합니다. YAML 파일은 쿠버네티스 리소스를 정의하고 구성하는 데 사용됩니다. 이번 포스팅에서는 YAML 파일의 구조와 작성 방법을 초보자도 쉽게 이해할 수 있도록 상세히 설명합니다.
본론
YAML 파일 개요
YAML이란?
YAML(YAML Ain't Markup Language)은 사람이 읽기 쉬운 데이터 직렬화 형식입니다. 주로 설정 파일과 데이터 교환에 사용됩니다. YAML은 JSON과 유사하지만 더 간결하고 직관적인 문법을 제공합니다. 쿠버네티스에서는 리소스를 정의하기 위해 YAML 파일을 사용합니다.
쿠버네티스에서 YAML 파일의 역할
쿠버네티스에서 YAML 파일은 클러스터 내의 다양한 리소스를 정의하고 구성하는 데 사용됩니다. YAML 파일을 통해 파드, 디플로이먼트, 서비스 등의 리소스를 생성, 업데이트 및 삭제할 수 있습니다. YAML 파일은 쿠버네티스 API 서버에 의해 해석되어 리소스가 생성됩니다.
YAML 파일의 기본 구조
YAML 파일은 키-값 쌍으로 데이터를 표현하며, 들여쓰기를 통해 계층 구조를 나타냅니다. 쿠버네티스 리소스 YAML 파일의 기본 구조는 다음과 같습니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
이 기본 구조를 통해 YAML 파일의 주요 구성 요소를 설명하겠습니다.
apiVersion
apiVersion은 리소스를 정의하는 API의 버전을 나타냅니다. 쿠버네티스는 여러 API 버전을 지원하며, 각 리소스 유형마다 사용할 수 있는 API 버전이 다릅니다. 예를 들어, 파드(Pod) 리소스는 v1 API 버전을 사용합니다.
kind
kind는 생성할 리소스의 유형을 나타냅니다. 예를 들어, 파드, 디플로이먼트, 서비스 등이 있습니다. 위 예시에서는 Pod 리소스를 정의하고 있습니다.
metadata
metadata는 리소스의 메타데이터를 포함합니다. 여기에는 리소스의 이름(name), 네임스페이스(namespace), 라벨(labels) 등이 포함됩니다. name은 클러스터 내에서 리소스를 식별하는 고유한 이름입니다.
spec
spec은 리소스의 원하는 상태를 정의합니다. spec은 리소스 유형에 따라 다른 속성을 가집니다. 예를 들어, 파드의 경우 컨테이너 목록(containers)과 각 컨테이너의 이미지(image), 포트(ports) 등을 정의합니다.
다양한 쿠버네티스 리소스의 YAML 파일 작성법
파드 (Pod) YAML 파일
파드는 쿠버네티스의 기본 실행 단위로, 하나 이상의 컨테이너를 포함합니다. 다음은 파드 YAML 파일의 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.14.2
ports:
- containerPort: 80
이 예시에서 metadata 섹션은 파드의 이름과 라벨을 정의합니다. spec 섹션은 컨테이너 목록을 포함하며, 각 컨테이너의 이름, 이미지 및 포트를 정의합니다.
디플로이먼트 (Deployment) YAML 파일
디플로이먼트는 파드와 레플리카셋을 관리하는 상위 리소스입니다. 디플로이먼트를 사용하면 애플리케이션의 배포와 업데이트를 쉽게 수행할 수 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.14.2
ports:
- containerPort: 80
이 예시에서 replicas는 원하는 파드의 수를 정의합니다. selector는 디플로이먼트가 관리할 파드를 선택하는 라벨을 정의합니다. template 섹션은 생성할 파드의 템플릿을 정의합니다.
서비스 (Service) YAML 파일
서비스는 파드의 집합에 대한 네트워크 접근을 제공하는 리소스입니다. 서비스는 클러스터 내부와 외부에서 접근할 수 있는 안정적인 네트워크 엔드포인트를 제공합니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
이 예시에서 selector는 서비스가 노출할 파드를 선택하는 라벨을 정의합니다. ports 섹션은 서비스의 포트를 정의하며, type은 서비스의 유형을 정의합니다.
고급 YAML 파일 작성법
ConfigMap과 Secret
ConfigMap과 Secret은 애플리케이션의 설정과 비밀 정보를 관리하는 리소스입니다. ConfigMap은 비밀이 아닌 설정 데이터를, Secret은 비밀 데이터를 저장합니다.
ConfigMap 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
database_url: "mongodb://localhost:27017"
feature_enabled: "true"
Secret 예시
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
password: cGFzc3dvcmQ= # "password"를 base64로 인코딩한 값
Ingress
Ingress는 클러스터 외부에서 내부 서비스로의 HTTP 및 HTTPS 트래픽을 관리합니다. Ingress는 경로 기반 라우팅을 지원하여, 특정 URL 패턴에 따라 트래픽을 다른 서비스로 라우팅할 수 있습니다.
Ingress 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
이 예시에서 rules 섹션은 Ingress 규칙을 정의합니다. host는 도메인 이름을, paths는 트래픽을 라우팅할 경로와 백엔드를 정의합니다.
PersistentVolume과 PersistentVolumeClaim
PersistentVolume(PV)과 PersistentVolumeClaim(PVC)은 클러스터 내의 스토리지 리소스를 관리하는 데 사용됩니다. PV는 클러스터에서 관리하는 스토리지 리소스이고, PVC는 파드가 스토리지를 요청하는 방식입니다.
PersistentVolume 예시
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
PersistentVolumeClaim 예시
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
YAML 파일 작성 시 주의사항
- 들여쓰기: YAML은 들여쓰기에 민감합니다. 들여쓰기를 일관되게 유지하는 것이 중요합니다.
- 스페이스: 들여쓰기는 공백(space)을 사용해야 합니다. 탭(tab)을 사용하면 오류가 발생할 수 있습니다.
- 주석: 주석은
#기호를 사용하여 작성할 수 있습니다. - 문법 검사: YAML 파일 작성 후
kubectl apply --dry-run=client -f 파일명.yaml명령어를 사용하여 문법을 검토할 수 있습니다.
결론
이번 포스팅에서는 쿠버네티스 YAML 파일의 구조와 작성 방법에 대해 설명했습니다. YAML 파일은 쿠버네티스에서 리소스를 정의하고 구성하는 데 필수적인 역할을 합니다. 다양한 리소스의 YAML 파일 예시를 통해 각 구성 요소의 역할과 작성 방법을 이해할 수 있었습니다. 이를 바탕으로 실무에서 YAML 파일을 작성하고 관리하는 데 도움이 되기를 바랍니다.