본문 바로가기
기술 공부/Cloud&Container

[Kubernetes 실습 #2] Podman 이미지로 Kubernetes 배포 및 서비스 구성하기

by soy-ul 2025. 7. 20.
반응형

이번 글에서는 이전 글에서 생성한 Podman 컨테이너 이미지를 Kubernetes 환경에서 테스트 이미지로 활용해보았습니다. 

Kubernetes 환경에서 배포를 진행하기 위해 작성한 YAML 파일을 소개하며 실제로 배포 및 서비스 구성하였으며, 실습을 통해 구성한 요소들에 대한 개념을 설명한 후, 실습 과정이 나타나 있습니다. 

🔹 Kubernetes 구성요소 개념

1. Pod

  • Kubernetes에서 가장 기본적인 배포 단위로, Pod는 컨테이너를 담는 껍데기
  • 같은 Pod의 컨테이너끼리는 localhost로 통신이 가능
  • 하나 이상의 컨테이너 그룹으로, 동일한 노드에서 실행
  • 컨테이너 간 스토리지와 네트워크 리소스를 공유
  • 같은 Pod 안의 컨테이너들은 같은 네트워크 네임스페이스(IP, 포트)와 볼륨을 공유한다. 

2. Container

  • 실제 실행되는 애플리케이션 단위
  • Pod 내에 포함됨
  • Docker 또는 Podman 등의 런타임 위에서 실행되며, 하나의 이미지로부터 생성된다.

3. Deployment

  • Pod를 관리하고, 원하는 상태(desired state)를 유지시켜 주는 컨트롤러
  • Pod 생성, 업데이트, 롤백 등을 자동화 
  • 지정된 수의 Pod(replica 개수)를 항상 유지하고, 장애 시 자동 복구

4. Service

  • 클러스터 내부 또는 외부에서 Pod에 접근할 수 있게 하는 리소스
  • Pod들의 IP가 바뀌어도 항상 일정한 접근 경로를 보장해주는 네트워크 프록시 역할
  • Pod에 대해 네트워크 추상화를 제공
  • IP 주소 및 DNS 이름을 통해 접근 가능
  • ClusterIP, NodePort, LoadBalancer 등의 타입 제공
    • ClusterIP : 클러스터 내부 통신용(default)
    • NodePort : 외부에서 클러스터 노드 IP:Port으로 접근이 가능(=포트포워딩)  *이번 테스트에서 사용한 네트워크 유형*
    • LoadBalancer : 클라우드 환경에서 로드밸런서 생성
  • 외부에서 pod으로 접속하기 위해서는 NodePort나 LoadBalancer 사용해야 한다. 

 

🔹 환경 및 구성

  • Kubernetes 클러스터 (1 마스터, 2 워커 노드)
  • Podman으로 생성한 컨테이너 이미지
  • 로컬 컨테이너 이미지 저장소 (Local Registry)

1. Kubernetes 배포(Deployment) 구성

Podman을 통해 만들어진 이미지를 기반으로 Kubernetes에 배포를 수행합니다. 아래는 Kubernetes Deployment YAML 파일 예시입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3  # 3개 pod가 항상 유지
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: 192.168.0.10:5000/myapp-env:init # 로컬 레지스트리 이미지
        imagePullPolicy: Always
        command: ["/bin/bash", "-c", "/app/procstart.sh && tail -f /dev/null"]
        ports:
        - containerPort: 22
  • replicas: 컨테이너 복제본 개수 지정
  • image: Podman을 통해 로컬 레지스트리에 등록한 이미지 사용
  • imagePullPolicy: 항상 최신 이미지를 가져오도록 설정

2. Kubernetes 서비스(Service) 구성

생성한 Pod에 외부에서 접근할 수 있도록 NodePort 타입의 서비스를 설정합니다.

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
  - name: ssh
    port: 22
    targetPort: 22
    nodePort: 30022  # Host에서 실제 오픈할 포트(포트포워딩)
  • type: NodePort: 외부에서 노드의 포트를 통해 접근 가능하도록 설정
  • nodePort: Kubernetes가 자동으로 할당하는 포트 번호

3. Kubernetes 리소스 배포

구성한 YAML 파일을 사용하여 Kubernetes 클러스터에 리소스를 생성합니다.

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

배포된 리소스 상태는 다음 명령어로 확인할 수 있습니다.

kubectl get deployments
kubectl get pods -o wide
kubectl get services

배포된 pod 접속은 아래 명령어로 가능합니다. 

# pod 접속
kubectl exec -it [Pod ID] -- /bin/bash

# 실행 중인 Pod의 컨테이너 로그 조회
# 자동 실행 쉘 스크립트(/app/processstart.sh) 정상 실행 확인
kubectl logs [Pod ID]

# 만약 Pod 실행이 비정상일 경우 아래 명령어로 상세 정보 확인 가능
kubectl describe pod [Pod ID]

 

🔹 마무리

이렇게 Podman으로 생성한 로컬 컨테이너 이미지를 Kubernetes 환경에서 손쉽게 배포하고 서비스를 구성할 수 있었습니다. 

다음에는 Kubernetes 구성요소들에 대해 개념을 더 익히고 새로운 리소스 자동화 방식들을 알아보겠습니다!

반응형