카테고리 없음

[Project] Docker 컨테이너 플랫폼 구성, Kubernetes 오케스트레이션

cumo 2025. 4. 25. 19:57

1.프로젝트 개요

해당 프로젝트는 AWS EC2 인스턴스를 활용하여 도커 ,K8s 환경을  각 각 구축한 후 차이와 작동을 확인하고자 하였다

2. 요구사항 

Docker 환경

  • Docker 최신 버전 설치
  • httpd / nginx / tomcat 컨테이너 실행
  • 포트 포워딩 및 index.html 노출 확인
  • /httpddata, /nginxdata 마운트 설정

Kubernetes 환경

  • EC2 3대를 활용한 클러스터 구성:
    Control Plane, Worker Node 1, Worker Node 2
  • nginx, httpd 파드 구성 및 서비스 생성 (NodePort)
  • NFS 서버 구성 및 PV/PVC 마운트 → Pod에 연결

NFS 

  • NFS Server / Client 설치
  • 공유 디렉터리 설정
  • 마운트 및 export 설정

3.진행

3.1 공동으로 사용할 NFS 구성

//NFS Server
# NFS 설치
dnf -y install nfs-kernel-server

# 공유 디렉토리 생성
sudo mkdir -p /srv/nfs/webdata
sudo chown nobody:nogroup /srv/nfs/webdata

# export 설정
echo "/srv/nfs/webdata *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server


//Docker Server

sudo apt install nfs-common -y

# NFS 디렉토리 마운트
sudo mkdir -p /mnt/nfs/webdata
sudo mount -t nfs <NFS_SERVER_IP>:/srv/nfs/webdata /mnt/nfs/webdata

3. 2. Docker 를 통한 웹 배포

Docker 아키텍처 구성도는 EC2 인스턴스 내 Docker 엔진을 통해 3개의 컨테이너로

 

개발자는 소스코드를 Dodkcer에 전달을 통해 컨테이너를 생성하고 각 컨테이너에 적절한 역할을 배치하였다

Docker Server가 되는 EC2는 Private에 위치하여 Bastion Sever만을 통해 개발자가 접근이 가능하며

각 container로 접근을 할 수 있는 ALB 로드밸런서 구성을 통해 각 각의 웹 서비스를 배포하도록 구성

아키텍쳐 구성도

환경 구성 및 컨테이너 실행

Docker를 각각의 포트로 컨테이너를 진행시에는 방화벽( 보안그룹 ) 을 통해 포트를 통해 외부에서 접속 가능하도록 하여야 하며

Image의 경우 Dockerhub를 통해 전달 받을 수 있다 .

# Docker 설치
dnf -y install docker
systemctl enable --now docker

# 이미지 설치
docker pull httpd
docker pull nginx
docker pull tomcat

FROM httpd:latest

# 기본 index.html 교체를 위한 COPY (선택)
COPY ./index.html /usr/local/apache2/htdocs/

# 컨테이너 실행
docker run -d \
  --name httpd-nfs \
  -p 8080:80 \
  -v /mnt/nfs/webdata:/usr/local/apache2/htdocs \
  httpd:latest

# 컨테이너 실행
docker run -d --name httpd -v /mnt/nfs/webdata:/usr/local/apache2/htdocs/ -p 8084:80 httpd
docker run -d --name nginx -v /mnt/nfs/webdata::/usr/share/nginx/html -p 8083:80 nginx
docker run -d --name tomcat -p 8081:8080 tomcat

 

쿠버네티스

아키텍처 구성도

 

1. docker로 컨테이너 별 구동의 사용의 한계를 느끼고 Multi-Node 환경에서의 가용성을 위해 쿠버네티스를 사용

    쿠버네티스는 Private 1, private2에 위치한 control plane , Node 1 , Node2 로 구성

 

 

2. private subnet에 존재하는 plane node ,node 1 node2에 nginx, httpd를 사용하여 웹 서버를 구성하고

   외부에서 접근 가능하도록 로드밸런서로 노드 포트를 엑세스 

 

SVC 목록
HTTP Deployment

#단일 NGINX POD 생성
kubectl run kubectl run nginx --image nginx --port=80

''

PVC 마운트

#NFS 마운트 PV 생성
apiVersion: v1
kind: PersistentVolume
metadata:
  name: httpd-nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: [Server IP]
    path: /root/nfsmount

#PVC 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: httpd-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  volumeName: httpd-nfs-pv
~

 

마운트 된 HTTP 구성

 

HTTP Deployment 생성

kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nfs-volume
          mountPath: /usr/local/apache2/htdocs    # httpd 웹 루트에 마운트
      volumes:
      - name: nfs-volume
        persistentVolumeClaim:
          claimName: httpd-nfs-pvc                # 앞에서 만든 PVC 이름

 

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  selector:
    app: httpd
  ports:
  - name: http
    protocol: TCP
    port: 80               # 클러스터 내부에서 접근할 포트
    targetPort: 80         # 컨테이너 포트 (httpd 포트)
  type: NodePort
~
~