-
Kubernetes(K8S): 로컬에서 간단한 웹 서버 배포Software engineer/Infra 2024. 10. 26. 16:49

Kubernetes logo Kubernetes(K8S)를 사용하여 서버 리소스를 오케스트레이션하는 방법을 알아보겠습니다. Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈소스 플랫폼으로, 여러 서버에서 다양한 애플리케이션을 효율적으로 운영할 수 있도록 도와줍니다. 주요 개념과 예제를 통해 K8S 오케스트레이션을 이해해 보겠습니다.
1. Kubernetes란?
Kubernetes(K8S)는 Google에서 개발한 컨테이너 오케스트레이션 플랫폼입니다. 애플리케이션을 컨테이너에 배포한 후, 다양한 리소스 관리를 자동화하여 애플리케이션의 확장성, 가용성, 복원력을 높이는 데 도움을 줍니다. 특히, Kubernetes는 여러 서버에서 리소스를 효율적으로 관리하여 애플리케이션이 고가용성을 유지할 수 있게 해줍니다.
- 자동화된 배포 및 스케일링: Kubernetes는 필요한 수의 인스턴스를 자동으로 배포하고 확장할 수 있습니다.
- 셀프 힐링: 오류가 발생한 컨테이너를 자동으로 재시작하고, 실패한 노드를 대체하여 서비스의 안정성을 유지합니다.
- 로드 밸런싱 및 트래픽 관리: 클러스터에 들어오는 트래픽을 컨테이너에 분산하여 서버 부하를 효율적으로 분배합니다.
2. Kubernetes의 핵심 개념


출처: https://kubernetes.io/ 1) 클러스터(Cluster)
클러스터는 Kubernetes의 기본 단위로, 여러 대의 노드가 모여 애플리케이션을 실행하는 구조입니다. 일반적으로 마스터 노드와 워커 노드로 나뉘며, 마스터 노드는 클러스터를 관리하고, 워커 노드는 애플리케이션의 실제 작업을 수행합니다.
2) 노드(Node)
노드는 클러스터 내의 각 서버를 의미하며, 워커 노드는 실제 컨테이너가 배포되는 공간입니다. 각 노드에는 컨테이너 런타임(Docker 등)과 Kubernetes 에이전트가 설치되어 있습니다.
3) 파드(Pod)
파드는 Kubernetes의 가장 작은 배포 단위로, 하나 이상의 컨테이너를 그룹화하여 운영합니다. 일반적으로 하나의 애플리케이션 컨테이너와 필요한 사이드카 컨테이너를 함께 배포할 때 사용합니다.
4) 디플로이먼트(Deployment)
디플로이먼트는 애플리케이션 배포와 관리를 자동화하는 객체입니다. 디플로이먼트를 통해 애플리케이션을 스케일링하고, 파드를 업데이트하며, 실패한 파드를 복구할 수 있습니다.
5) 서비스(Service)
서비스는 파드가 생성 및 삭제되더라도 지속적인 네트워크 접근을 제공하는 엔드포인트 역할을 합니다. 로드 밸런싱과 클러스터 외부에서의 접근을 관리할 때 유용합니다.
3. Kubernetes에서 Node.js 컨테이너로 간단한 웹 서버 배포하기
Node.js 애플리케이션 설정
먼저, 간단한 Node.js 애플리케이션을 만들어 OK 응답을 반환하는 서버를 준비합니다.
> server.js 파일 작성
// server.js const http = require('http'); const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('OK\n'); }); server.listen(3000, () => { console.log('Server running on port 3000'); });> package.json 파일 생성
{ "name": "simple-k8s-server", "version": "1.0.0", "description": "Simple Node.js server for Kubernetes deployment", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": {} }Docker 이미지 생성
위에서 만든 Node.js 애플리케이션을 Docker 이미지로 패키징합니다.
> Dockerfile 생성
# Dockerfile FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["npm", "start"]Docker 이미지 빌드 및 테스트
Docker가 설치된 환경에서 다음 명령어를 통해 이미지를 빌드하고 테스트합니다.
# Docker 이미지 빌드 docker build -t simple-k8s-server . # 이미지 실행 테스트 docker run -p 3000:3000 simple-k8s-server브라우저에서 http://localhost:3000 에 접속하면 OK 응답이 출력되는지 확인합니다. 정상적으로 동작하면 Docker Hub 또는 로컬 레지스트리에 이미지를 업로드합니다.
Kubernetes에 파드 및 서비스 배포
이제 Kubernetes 클러스터에서 Node.js 컨테이너를 실행하도록 설정합니다.
Pod 설정 (node-pod.yaml)
Node.js 컨테이너가 포함된 파드를 정의합니다.
> node-pod.yaml 파일 생성
apiVersion: v1 kind: Pod metadata: name: node-pod labels: app: node-app # 서비스의 selector와 일치하는 라벨 spec: containers: - name: node-server image: simple-k8s-server:latest # Docker Hub에 푸시한 이미지 이름 사용 ports: - containerPort: 3000Service 설정 (node-service.yaml)
로컬 네트워크에서 접근 가능하도록 NodePort 타입의 서비스를 설정합니다.
> node-service.yaml 파일 생성
apiVersion: v1 kind: Service metadata: name: node-service spec: type: NodePort selector: app: node-app # 파드의 라벨과 일치해야 합니다 ports: - protocol: TCP port: 3000 targetPort: 3000 nodePort: 30001 # 로컬에서 접근할 포트 (30001)Kubernetes에 적용
kubectl 명령어를 사용해 파드와 서비스를 생성합니다.
kubectl apply -f node-pod.yaml kubectl apply -f node-service.yaml접속 확인
minikube 명령어를 통해 접속 URL 확인 합니다.
minikube service node-service -n default> 결과
|-----------|--------------|-------------|---------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|--------------|-------------|---------------------------| | default | node-service | 3000 | http://192.168.49.2:30001 | |-----------|--------------|-------------|---------------------------| 🏃 node-service 서비스의 터널을 시작하는 중 |-----------|--------------|-------------|------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|--------------|-------------|------------------------| | default | node-service | | http://127.0.0.1:54847 | |-----------|--------------|-------------|------------------------| 🎉 Opening service default/node-service in default browser... ❗ darwin 에서 Docker 드라이버를 사용하고 있기 때문에, 터미널을 열어야 실행할 수 있습니다'Software engineer > Infra' 카테고리의 다른 글
AWS EC2 Free Tier 기반 부하 테스트 (1) 2024.12.06 Kubernetes(K8S): 멀티 Pod 배포 (4) 2024.10.26 [Docker] image를 삭제하는 방법들! (4) 2023.11.02 [RDS] 파라미터 그룹 (2) 2023.10.06 [EC2] 웹서버 설치 및 정적페이지 호스팅(w/ Apache web server) (1) 2023.09.25