개요
이 프로젝트는 Kubernetes를 사용하여 다음 서비스들을 통합한 마이크로서비스 환경을 제공한다:
- 웹 서버: Nginx (HTTP/HTTPS, SSL/TLS 지원)
- 데이터베이스: MySQL
- CMS: WordPress
- 데이터베이스 관리: phpMyAdmin
- 파일 전송: FTPS (FTP over SSL)
- 모니터링 스택: InfluxDB, Grafana, Telegraf
모든 서비스는 Kubernetes Pod로 배포되며, PersistentVolume을 사용하여 데이터 영속성을 보장한다.
아키텍처
┌─────────────────────────────────────────────────────────┐
│ Minikube Cluster │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Nginx │───▶│ WordPress│───▶│ MySQL │ │
│ │ (Ingress)│ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ├───▶ phpMyAdmin ────┐ │
│ │ │ │
│ ├───▶ FTPS │ │
│ │ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Telegraf │───▶│ InfluxDB │◀───│ Grafana │ │
│ │ │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
서비스 구성
1. Nginx
- 역할: 리버스 프록시 및 웹 서버
- 포트:
- HTTP: 80
- HTTPS: 443
- SSH: 30022 (NodePort)
- 기능:
- SSL/TLS 인증서 지원
- Ingress Controller로 사용
- SSH 서버 포함
2. MySQL
- 역할: 관계형 데이터베이스
- 포트: 3306 (ClusterIP)
- 영속성: PersistentVolume 사용 (1Gi)
- 용도: WordPress 데이터 저장
3. WordPress
- 역할: 콘텐츠 관리 시스템
- 포트: 5050 (NodePort)
- 영속성: PersistentVolume 사용 (1Gi)
- 연결: MySQL 서비스와 연결
4. phpMyAdmin
- 역할: MySQL 웹 기반 관리 도구
- 포트: 5000 (NodePort)
- 연결: MySQL 서비스와 연결
5. FTPS
- 역할: SSL/TLS를 통한 파일 전송 서버
- 포트:
- 21 (FTP 제어)
- 20 (FTP 데이터)
- 30020-30021 (Passive 모드)
- 프로토콜: vsftpd 사용
6. InfluxDB
- 역할: 시계열 데이터베이스
- 포트: 8086 (ClusterIP)
- 영속성: PersistentVolume 사용 (1Gi)
- 용도: 모니터링 메트릭 저장
7. Grafana
- 역할: 모니터링 대시보드
- 포트: 3000 (NodePort)
- 연결: InfluxDB와 연결
- 인증: 익명 접근 활성화
8. Telegraf
- 역할: 메트릭 수집 에이전트
- 기능:
- Kubernetes 클러스터 메트릭 수집
- InfluxDB로 메트릭 전송
- RBAC 권한 사용 (cluster-admin)
사전 요구사항
- Docker: 컨테이너 런타임
- Minikube: 로컬 Kubernetes 클러스터
- kubectl: Kubernetes CLI 도구
- VirtualBox (또는 다른 VM 드라이버)
42 Mac 사용자
42 Mac 환경에서는 다음 환경 변수를 설정해야 한다:
export MINIKUBE_HOME="/sgoinfre/goinfre/Perso/[your-id]/ft_service/minikube/"
설치 및 실행
1. 프로젝트 클론
git clone <repository-url>
cd ft_services
2. 서비스 시작
./setup.sh
이 스크립트는 다음 작업을 수행한다:
- Docker와 Minikube 설치 확인
- Minikube 클러스터 시작 (VirtualBox 드라이버 사용)
- CPU: 3 cores
- 메모리: 3000MB
- 디스크: 30000MB
- NodePort 범위: 1-31000
- Ingress Controller 활성화
- Metrics Server 활성화
- Minikube IP를 설정 파일에 주입
- 커스텀 Docker 이미지 빌드:
my-nginxmy-ftpsmy-mysqlmy-phpmyadminmy-wordpressmy-grafana
- Kubernetes 리소스 배포 (Kustomize 사용)
3. 서비스 삭제
./setup.sh delete
4. 서비스 재배포
./setup.sh apply
접근 방법
Minikube IP 확인
minikube ip
서비스 접근
각 서비스는 다음 포트로 접근할 수 있다:
| 서비스 | 포트 | URL |
|---|---|---|
| Nginx (HTTP) | 80 | http://$(minikube ip) |
| Nginx (HTTPS) | 443 | https://$(minikube ip) |
| WordPress | 5050 | http://$(minikube ip):5050 |
| phpMyAdmin | 5000 | http://$(minikube ip):5000 |
| Grafana | 3000 | http://$(minikube ip):3000 |
| FTPS | 21 | ftp://$(minikube ip):21 |
| SSH | 30022 | ssh $(user-id)@$(minikube ip) -p 30022 |
SSH 접속
minikube ip # IP 주소 확인
ssh $(user-id)@$(minikube_ip) -p 30022
기본 인증 정보 (kustomization.yaml에서 확인):
- SSH 사용자명:
wpark - SSH 비밀번호:
1234 - MySQL 사용자명:
root - MySQL 비밀번호:
1234 - FTPS 사용자명:
wpark - FTPS 비밀번호:
1234
⚠️ 보안 주의: 프로덕션 환경에서는 반드시 기본 비밀번호를 변경해야 한다!
주요 기능
1. Kubernetes 리소스 관리
프로젝트는 Kustomize를 사용하여 Kubernetes 리소스를 관리한다:
- Secret 생성: SSH, MySQL, FTPS 인증 정보
- ConfigMap 생성: Telegraf 설정 파일
- 리소스 배포: 모든 서비스의 Deployment, Service, PVC 등
2. 데이터 영속성
다음 서비스들은 PersistentVolume을 사용하여 데이터를 영속적으로 저장한다:
- MySQL:
/data/mysql - WordPress:
/var/www/html - InfluxDB:
/var/lib/influxdb
3. 모니터링
- Telegraf: Kubernetes 클러스터 메트릭 수집
- InfluxDB: 시계열 데이터 저장
- Grafana: 시각화 대시보드
4. SSL/TLS 지원
- Nginx는 SSL 인증서를 사용하여 HTTPS 연결 지원
- FTPS는 SSL/TLS를 통한 암호화된 파일 전송 지원
Kubernetes 기본 개념
Minikube란?
- Minikube는 로컬에서 Kubernetes를 쉽게 실행할 수 있게 해주는 도구다.
- Minikube는 노트북의 VM 내부에 단일 노드 Kubernetes 클러스터를 실행한다.
- Kubernetes를 시도하거나 일상적인 개발에 사용하기에 적합하다.
주요 명령어:
minikube start # 클러스터 시작
minikube dashboard # 웹 대시보드 열기
minikube ip # 클러스터 IP 확인
minikube service list # 서비스 목록 확인
minikube ssh # 클러스터에 SSH 접속
Kubernetes란?
- Kubernetes는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오케스트레이션 플랫폼이다.
주요 명령어:
kubectl get pods # Pod 목록 확인
kubectl get services # Service 목록 확인
kubectl logs [pod-id] # Pod 로그 확인
kubectl exec -it [pod-id] -- /bin/bash # Pod에 접속
Node (노드)
- Node는 Kubernetes의 워커 머신이다.
- Node는 VM 또는 물리적 머신일 수 있으며, 클러스터에 따라 다르다.
- 각 Node는 Pod를 실행하는 데 필요한 서비스를 가지고 있으며, 마스터 컴포넌트에 의해 관리된다.
- Node의 서비스에는 Docker, kubelet, kube-proxy가 포함된다.
Pod (파드)
- Kubernetes는 애플리케이션 인스턴스를 호스팅하기 위해 Pod를 생성한다.
- Pod는 고유한 클러스터 IP 주소를 가진다 (무작위로 할당됨).
- Pod 내의 컨테이너는 IP 주소와 포트 공간을 공유하며, 항상 같은 Node에 위치하고 함께 스케줄링되며, 같은 컨텍스트에서 실행된다.
이 프로젝트의 Pod:
- telegraf
- FTPS
- grafana
- influxdb
- mysql
- nginx
- phpmyadmin
- wordpress
총 8개의 Pod가 "default" 네임스페이스에 배포된다.
Service (서비스)
- Service는 Pod의 논리적 집합과 이들에 접근하는 정책을 정의하는 추상화다.
- Service가 타겟으로 하는 Pod 집합은 일반적으로 selector에 의해 결정된다.
Service 타입:
-
ClusterIP (기본 설정)
- 클러스터 내부에서만 접근 가능
-
NodePort
- VM(Node)에 포트를 열어 외부 접근 가능
-
LoadBalancer
- LoadBalancer로 노출된 각 서비스는 자체 IP 주소를 받는다.
더 자세한 설명: Kubernetes Service Types 비교
파일 구조
ft_services/
├── README.md
├── setup.sh # 배포 스크립트
└── srcs/
├── kustomization.yaml # Kustomize 설정
├── ingress.yaml # Ingress 리소스
├── nginx/ # Nginx 서비스
│ ├── Dockerfile
│ ├── entrypoint
│ ├── nginx.conf
│ ├── ssh/ # SSH 키 및 설정
│ └── ssl/ # SSL 인증서
├── mysql/ # MySQL 서비스
│ ├── Dockerfile
│ ├── entrypoint
│ └── my.cnf
├── wordpress/ # WordPress 서비스
│ ├── Dockerfile
│ ├── entrypoint
│ ├── nginx.conf
│ └── wordpress_dump.sql
├── phpmyadmin/ # phpMyAdmin 서비스
│ ├── Dockerfile
│ ├── entrypoint
│ └── nginx.conf
├── ftps/ # FTPS 서비스
│ ├── Dockerfile
│ ├── entrypoint
│ ├── vsftpd.conf
│ └── vsftpd_sub.conf
├── influxdb.yaml # InfluxDB 리소스
├── grafana/ # Grafana 서비스
│ ├── Dockerfile
│ └── grafana.db
└── telegraf/ # Telegraf 설정
├── telegraf.conf
└── telegraf-target.conf
문제 해결
Pod가 실행되지 않는 경우
kubectl get pods # Pod 상태 확인
kubectl describe pod [pod-name] # Pod 상세 정보 확인
kubectl logs [pod-name] # 로그 확인
서비스에 접근할 수 없는 경우
minikube service list # 서비스 목록 확인
minikube service [service-name] # 서비스 URL 확인
이미지 빌드 문제
eval $(minikube docker-env) # Minikube Docker 환경 설정
docker images # 이미지 목록 확인