매니페스트, YAML 파일
쿠버네티스에서 파드, 서비스, 디플로이먼트 등을 생성하고 관리하는 설정 파일을 매니페스트라 부른다.
이때 매니페스트는 특정 형식을 지켜 작성해야 하는데 주로 YAML 형식으로 작성한다.
Pod(파드)
Pod : 컨테이너를 하나 이상 모아놓은 것(쿠버네티스에서 가장 작은 배포 단위)
파드 기본 템플릿
apiVersion: v1
kind: Pod
metadata:
name: <파드_이름> # 파드의 이름
labels:
app: <라벨_이름> # 선택적으로 라벨 추가 가능
spec:
containers:
- name: <컨테이너_이름> # 컨테이너 이름
image: <컨테이너_이미지> # 사용할 컨테이너 이미지
ports:
- containerPort: <포트_번호> # 컨테이너가 사용할 포트
resources: # 선택적으로 리소스 제한 설정 가능
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
예시. nginx 컨테이너 실행하는 파드 생성
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
metadata : 파드 식별 정보 포함하는 부분
- name : 파드의 고유한 이름 (중복 불가)
- labels : 특정 기준으로 파드 그룹화 (분류 태그)
Service(서비스)
Service : 변화하는 파드의 IP에 영향을 받지 않고, 지속적으로 네트워크 접근을 제공하는 것
서비스 기본 템플릿
apiVersion: v1
kind: Service
metadata:
name: <서비스_이름> # 서비스의 이름을 설정
spec:
selector:
app: <라벨_이름> # 특정 라벨을 가진 파드를 선택
ports:
- port: <서비스_포트> # 서비스에서 개방할 포트
targetPort: <파드_포트> # 파드에서 사용하는 포트
type: ClusterIP # 기본값, 외부에서는 접근 불가
예시. app: nginx 라벨을 가진 파드를 선택하는 서비스 생성
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- port: 80
name: "p80"
targetPort: 80
type: NodePort
- type: NodePort (외부에서 접근 가능) : 클러스터 외부에서 접근 가능하도록 노드의 포트 개방 (노드IP:3xxxx로 접근)
- type: ClusterIP (내부에서만 접근 가능) : 클러스터 내부에서만 접근 가능 (클러스터 내부 10.96.xx.xx:80로 접근)
- type: LoadBalancer (외부 IP 제공) : 클라우드 환경에서 사용 가능
Volume(볼륨)
Volume : 컨테이너 데이터를 저장하고 공유할 수 있도록 하는 일종의 스토리지
볼륨은 보통 파드를 생성할 때 함께 정의된다.
예시. emptyDir
일시적인 데이터를 저장하는데 사용하는 빈 디렉터리 (파드 삭제 시 사라지는 임시 볼륨), 컨테이너가 죽어도 empty는 남아있다.
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
spec:
containers:
- name: container1
image: 이미지이름
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: container2
image: 이미지이름2
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name : empty-dir
emptyDir: {}
container1에서는 empty-dir 볼륨을 /mount1 경로에 마운트
container2에서는 empty-dir 볼륨을 /mount2 경로에 마운트
예시. hostPath
노드의 로컬 파일 시스템을 파드에 마운트 하는 방식. 파드 내의 컨테이너에서 저장하는 파일이 노드의 특정 디렉터리에 저장된다. => 파드가 삭제되어도 파일은 노드에 남아 있음
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
nodeSelector:
kubernetes.io/hostname: 노드이름
containers:
- name: container
image: 이미지이름
volumeMounts:
- name: host-path
mountPath: /mount1
volumes:
- name : host-path
hostPath:
path: /node-vol
type: DirectoryOrCreate
host-path라는 이름의 볼륨을 컨테이너의 /mount1 경로에 마운트
volumeMounts.name: host-path => 컨테이너 내에서 host-path라는 이름의 볼륨을 마운트
volumes.name: host-path => 파드 내에서 host-path라는 이름의 볼륨을 정의. 이 볼륨은 hostPath 타입이고 노드의 /node-vol 디렉토리와 연결
ConfigMap(컨피그맵)
ConfigMap : 애플리케이션 설정 데이터를 저장하고 관리하는 객체(설정 파일, 환경 변수 등)
컨피그맵을 사용하면 애플리케이션 설정을 파드 외부에 분리
ConfigMap 생성
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-dev
data:
SSH: 'false'
User: dev
data 부분에 설정 값들이 저장
ConfigMap 파드에서 사용
apiVersion: v1
kind: Pod
metadata:
name: pod-9
spec:
containers:
- name: container
image: ddarahakit2024/backend:1.0
envFrom:
- configMapRef:
name: cm-dev # 위에서 생성한 ConfigMap 이름
envFrom을 사용하여 ConfigMap을 환경 변수로 불러온다.
SSH와 User 두 가지 설정 값이 환경 변수로 컨테이너에게 전달된다.
'한화시스템 Beyond SW Camp > 데브옵스' 카테고리의 다른 글
[Jenkins] Jenkins 설치, GitHub 웹훅을 사용한 자동 배포 (1) | 2025.03.19 |
---|---|
[Kubernetes] Deployment (0) | 2025.03.18 |
[Kubernetes] 개념 및 환경 구축 (0) | 2025.03.18 |
[Docker] Dockerfile로 자동 빌드&디버깅 (Edit Configuration) (0) | 2025.03.13 |
[Docker] 가상머신에 도커 설치하기 (0) | 2025.03.11 |