Skip to main content

웹 페이지 배포

쿠버네티스 클러스터는 이미 생성 되어 있는 관계로 바로 간단한 웹 페이지를 쿠버네티스 클러스터에 배포 및 테스트 해 보겠다. 

제일 먼저 준비 해야 될 것은 물론 배포 해야 될 웹 페이지다. 일단 기존에 테스트 용으로 만든 장고 웹 사이트를 배포 해 보겠다.

먼저, 웹 애플리케이션을 K8s 클러스터에 배포하기 위해서는 애플리케이션의 컨테이너 이미지를 준비해야 한다. 일반적으로 Docker와 같은 컨테이너 플랫폼을 사용하여 애플리케이션을 컨테이너화 하고 이미지를 빌드 한다. 빌드 된 이미지는 컨테이너 레지스트리에 저장되어 클러스터 내에서 사용할 수 있게 된다.

웹 사이트의 소스 코드를 받은 후 Dockerfile을 추가 하였다. Dockerfile은 도커 이미지를 생성하기 위한 설정 파일이다. 이 파일에는 도커 이미지를 구성하는데 필요한 모든 단계와 명령어가 포함된다. Dockerfile을 작성하여 도커 이미지를 생성하면, 도커를 사용하여 해당 이미지를 기반으로 컨테이너를 실행할 수 있다.

# 파이썬 이미지 받기
FROM python:3.11

# 환경 변수 지정
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

# 워킹 디렉터리 지정
WORKDIR /app

# 의존성 설치
COPY requirements.txt .
RUN pip install -r requirements.txt

# 컨테이너 안에 소스 코드 복사
COPY . .

# 장고 사이트가 실행 되기 위해 포트 열기
EXPOSE 8000

# 웹 사이트가 실행 하기 위해 초기 명령어
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]


마지막으로 이 Dockerfile을 빌드 및 Docker 레지스트리에 Push 해준다

# Dockerfile을 사용하여 커스텀 이미지 생성
docker build -t django:v2 ./

# 생성된 이미지 태그 달기
docker tag django:v1 waji97/django:v2

# 태그 된 이미지 레지스트리에 업로드
docker push waji97/django:v2


이제 배포를 위해 매니페스트 YAML 파일을 작성 해야 된다. 파일 안에 먼저 Deployment 리소스를 사용하여 애플리케이션의 Replica을 지정 하고 어떤 이미지를 사용 하여 파드를 실행 시킬지 지정 한다. 그 후 Service 리소스 중 Nodeport 서비스를 사용하여 배포 된 웹 사이트를 접근 할 수 있게 포트 번호를 맞춰 준다. 

# 매니페스트 파일 작성 및 적용을 위해 같은 경로 이동
mkdir myapp
cd myapp

# 매니페스트 파일 생성
vi my-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: waji97/django:v2 			# 방금 업로드한 웹 사이트 이미지
          ports:
            - containerPort: 8000 			
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000						

이렇게 YAML파일 지정 후 이 파일을 적용 시킨다

kubectl apply -f my-app.yaml
deployment.apps/my-app created
service/my-app-service created

 

적용 후 생성 되는 Pod, Deployment 그리고 Service를 확인 할 수 있다

# Pod 확인
kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
my-app-74dd96c584-9plfb   1/1     Running   0          30s
my-app-74dd96c584-lf97s   1/1     Running   0          30s
my-app-74dd96c584-tvl2n   1/1     Running   0          30s

# Service 확인
kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        18d
my-app-service   NodePort    10.110.204.183   <none>        80:30001/TCP   50s   

# Deployment 확인
kubectl get deployment
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-app   3/3     3            3           40s

 

이제 결과를 확인 하기 위해 노드 중 아무 IP 주소에 30001 포트로 이동

image.png

웹 사이트 접속이 문제 없이 된다는 걸 확인 할 수 있다.

 

💡 만약에 웹 페이지를 수정 하거나, 새로운 웹 페이지의 이미지가 업로드 될 시, Deployment 리소스 덕분에 업데이트가 쉽게 가능하다. 웹 페이지를 배포한 매니페스트 파일 속에서 내가 원하는 이미지 이름을 수정 후 매니페스트 파일을 다시 적용 시키면 웹 사이트가 자동으로 새로운 이미지에 맞게 바뀐다.

간단한 테스트를 해 보았다

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          #image: waji97/django:v2 			# 기존 업로드한 웹 사이트 이미지
          image: waji97/ecommerce:v2  		# 새로 업로드한 웹 사이트 이미지
          ports:
            - containerPort: 8000 			
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000						

 

다시 업데이트 된 YAML파일을 적용 시킨다

kubectl apply -f my-app.yaml
deployment.apps/my-app configured
service/my-app-service unchanged

 

적용 후 웹 사이트 방문 결과

image.png