본문 바로가기
한화시스템 Beyond SW Camp/데브옵스

[Kubernetes] Pod, Service, Volume, ConfigMap 생성

by taeh00n 2025. 3. 18.

매니페스트, 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 두 가지 설정 값이 환경 변수로 컨테이너에게 전달된다.