[Project] Docker 컨테이너 플랫폼 구성, Kubernetes 오케스트레이션
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를 사용하여 웹 서버를 구성하고
외부에서 접근 가능하도록 로드밸런서로 노드 포트를 엑세스
#단일 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
~
~