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

[Kubernetes 실습 #3] kubectl 명령어의 한계와 웹 기반 관리 시스템 구상

by soy-ul 2025. 8. 10.
반응형

 

 

이전 글에서 Podman으로 컨테이너 이미지를 생성하고 Kubernetes에 배포하는 과정을 다뤘습니다. 하지만 매번 터미널에서 kubectl 명령어를 입력하는 것이 번거로웠습니다.

 

그래서 웹 인터페이스로 K8s 클러스터를 관리할 수 있는 자동화 시스템을 개발하였습니다. 

우선 어떤 부분들에 아쉬움을 느껴서 웹 페이지를 생성하게 되었는지 알려드리겠습니다. 

그리고 다음부터 'Kubernetes Pod 자동화 웹 페이지 구성'에 관하여 단계별로 글을 작성해보겠습니다! 


1. 기존 방식의 문제점

🔹  터미널 기반 관리의 한계

매번 반복되는 작업들

  • SSH로 마스터 노드 접속
  • kubectl 명령어 직접 입력
  • YAML 파일 vi 에디터로 수정
  • 배포 상태 확인을 위한 여러 명령어 실행

협업 시 발생하는 문제들

  • 팀원마다 다른 kubectl 명령어 숙련도
  • 터미널 접근 권한 관리의 복잡성
  • 실시간 클러스터 상태 공유 어려움
  • 배포 과정에서 발생하는 휴먼 에러

🔹  구체적인 불편 사례

# 매번 이런 과정을 반복해야 했습니다
ssh root@192.168.0.10
kubectl get pods -o wide
kubectl get deployments
kubectl get services
vi myapp-deployment.yaml  # 복잡한 YAML 편집
kubectl apply -f myapp-deployment.yaml
kubectl get pods --watch     # 배포 상태 실시간 모니터링

특히 YAML 파일에서 특수문자가 포함된 명령어를 편집할 때 문제가 자주 발생했습니다:

command: ["/bin/bash", "-c", "/app/procstart.sh && tail -f /dev/null"]

 

2. 해결 목표 설정

🔹  핵심 목표

1. 웹 기반 클러스터 관리

  • 브라우저만으로 K8s 리소스 관리
  • 직관적인 UI/UX 제공
  • 실시간 상태 모니터링

2. 배포 프로세스 자동화

  • 원클릭 배포 시스템
  • YAML 템플릿 자동 생성
  • 이미지 기반 간편 배포

3. 팀 협업 개선

  • kubectl 명령어 학습 부담 제거
  • 웹 인터페이스로 접근성 향상
  • 표준화된 배포 프로세스 확립

🔹  기대 효과

  • 작업 시간 단축: 10분 → 2분 (80% 단축)
  • 실수 방지: GUI 기반 직관적 조작
  • 협업 효율성: 누구나 쉽게 접근 가능한 인터페이스

3. 시스템 아키텍처 설계

🔹  전체 구조도

┌─────────────────┐    HTTP/REST  ┌─────────────────┐    SSH   ┌─────────────────┐
│   Frontend      │ ────────────> │   Backend       │ ───────> │  K8s Cluster    │
│   (Vanilla JS)  │               │   (Node.js)     │          │  (kubectl)      │
│                 │               │                 │          │                 │
│ • SPA 구조       │               │ • Express API   │          │ • Master Node   │
│ • 실시간 UI       │               │ • SSH Clientb   │          │ • Worker Nodes  │
│ • 상태 관리       │               │ • 캐싱 시스템      │          │ • Podman Reg    │
└─────────────────┘               └─────────────────┘          └─────────────────┘

🔹  기술 스택 선정 이유

Backend: Node.js + Express

  • SSH 연결을 통한 원격 kubectl 실행 지원
  • RESTful API 설계로 확장성 확보
  • 비동기 처리로 높은 성능

Frontend: Vanilla JavaScript

  • 프레임워크 없는 순수 구현으로 가벼운 구조
  • 학습 비용 최소화
  • 빠른 개발 및 유지보수

인프라 구성

  • K8s 클러스터 (Master: 192.168.0.10)
  • Podman Registry (이미지 저장소)
  • 로컬 개발 환경 (localhost:3000)

4. 주요 기능 기획

🔹  대시보드 구성

5개 탭 기반 인터페이스

  • Overview: 전체 클러스터 상태 한눈에 보기
  • Deployments: 배포 관리 및 스케일링
  • Services: 서비스 모니터링 및 포트 관리
  • Pods: 개별 포드 상태 추적 및 로그 확인
  • YAML Editor: 브라우저에서 직접 YAML 편집

🔹  핵심 기능

실시간 모니터링

  • 5초 간격 자동 새로고침
  • 상태별 컬러 코딩 (Running: 초록, Pending: 노랑, Failed: 빨강)
  • 리소스 사용량 실시간 표시

원클릭 배포

  • 이미지 선택만으로 자동 YAML 생성
  • 배포 전 배포 및 서비스 정보 설정 검증
  • 롤백 기능 제공

벌크 작업

  • 다중 선택으로 여러 리소스 동시 관리
  • Shift+Click 범위 선택
  • Ctrl+Click 개별 토글

5. 개발 환경 준비

🔹  프로젝트 구조

k8s-web-manager/
├── server.js              # Express 서버
├── lib/
│   └── k8s-client.js      # Kubernetes API 클라이언트
├── public/
│   ├── index.html         # 메인 웹 페이지
│   ├── script.js          # Frontend JavaScript
│   └── style.css          # 스타일시트
└── package.json           # 의존성 관리

🔹  개발 환경 설정

# 프로젝트 초기화
mkdir k8s-web-manager
cd k8s-web-manager
npm init -y

# 필요한 패키지 설치
npm install express
npm install node-ssh    # SSH 클라이언트
npm install cors        # CORS 설정

🔹  다음 작업

다음 글에서는 실제 개발 과정을 다뤄보겠습니다:

  • SSH 기반 kubectl 명령어 실행 구현
  • RESTful API 설계 및 구현
  • 캐싱 시스템으로 성능 최적화
  • 에러 처리 및 재시도 로직

핵심 코드 :

// SSH를 통한 kubectl 명령어 실행
async executeCommand(command) {
    const sshCommand = `sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@192.168.0.10 "${command}"`;
    return new Promise((resolve, reject) => {
        exec(sshCommand, { timeout: 30000 }, (error, stdout) => {
            if (error) reject(error);
            else resolve(stdout);
        });
    });
}

 

반응형