DM Log

[CI/CD #5] Docker Desktop Kubernetes 사용 본문

개발공부/Infra

[CI/CD #5] Docker Desktop Kubernetes 사용

Dev. Dong 2025. 11. 1. 13:36

인프라 패러다임의 변화

전통적 배포 방식

과거에는 하나의 물리 서버 위에 하나의 애플리케이션만을 설치 운영 방식이 일반적

  • 서버 자원이 비효율적으로 사용
  • 애플리케이션 간 환경 충돌 발생
  • 유지 보수 및 배포 작업 복잡

애플리케이션마다 별도의 서버를 운영해야 하므로 비용과 관리 부담이 커지는 문제

서버 가상화

Hypervisor를 이용해 하나의 물리 서버 위에 여러 개의 가상 머신을 구동

  • 구성 요소:
    • Hypervisor: 하드웨어 자원을 분리해 여러 가상 머신에 할당
    • VM(가상 머신): 각자 독립적인 OS를 포함해 완전한 시스템처럼 동작
  • 장점:
    • 하나의 서버에서 여러 서비스 운영 가능
    • 각 애플리케이션이 독립된 OS 위에서 동작하므로 보안 격리 우수
  • 단점
    • VM이 별도의 OS를 포함하므로 자원 사용량이 큼
    • 부팅 속도 느림, 배포 단위가 큼

컨테이너 가상화

VM의 단점을 보완한 기술로 호스트 OS의 커널을 공유하며, 애플리케이션 실행에 필요한 최소한의 환경만을 패키징

  • 특징:
    • 애플리케이션 간에 운영체제를 공유
    • 독립된 실행 환경(파일 시스템, 네트워크, 프로세스 공간)을 제공
    • 가볍고 빠른 배포 가능
  • 장점:
    • VM보다 훨씬 가볍고 빠름
    • 이식성이 높아 어디서나 동일 환경 보장
    • 개발, 테스트, 운영 환경 일관성 확보

Kubernetes

 

Kubernetes(K8s) 는 구글에서 개발하고 현재 CNCF에서 관리하는 오픈 소스 컨테이너 오케스트레이션 플랫폼

컨테이너화된 애플리케이션을 자동으로 배포, 스케일링, 관리해주는 시스

주요기능

  • 컨테이너의 자동 배포 및 롤백
  • 트래픅에 따른 자동 스케일링
  • 서비스 디스커버리
  • 셀프 힐링 기능 (장애 컨테이너 자동 재시작)

Kubernetes Cluster 구조

Kubernetes는 여러 구성 요소로 이루어진 클러스터(Cluster) 형태로 동작

구성 요소

  • Pod : 컨테이너의 실행 단위, 하나 이상의 컨테이너 포함
  • Node : Pod가 실제로 동작하는 서버 (물리/가상 머신)
  • Service : Pod 집합에 대한 네트워크 접근을 추상화한 객체

Kubernetes 설치

Docker Desktop setting 메뉴 에서 Kubernetes 에서 Enable Kubernetes 체크 한후 Apply& restart

K8s 기본 명령어

  • 노드 확인: kubectl get nodes
  • 피드 확인: kubectl get pos / kubectl get pods -o wide
  • 디플로이먼트 확인: kubectl get deployments
  • 서비스 확인: kubectl get services
  • Nginx 서버 실행: kubectl run sample-nginx --image=nginx --port=80
  • 컨테이너 정보 확인: kubectl describe pod/sample-nginx
  • 파드 삭제: kubectl delete pod/sample-nginx-XXXXX-XXXXX
  • Scale 변경 (2개로 변경): kubectl scale deployment sample-nginx --replicas=2
  • Script 실행: kubectl apply -f sample1.yml
  •  
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  • 파드에 터널링으로 접속: kubectl exec -it nginx-deployment-XXXX-XXXX -- /bin/bash
  • 파드 포트 노출: kubectl expose deployment nginx-deployment --port=80 --type=NodePort