예시: MongoDB를 사용한 PHP 방명록 애플리케이션 배포하기
이 튜토리얼에서는 쿠버네티스와 Docker를 사용하여 간단한 (운영 준비가 아닌) 멀티 티어 웹 애플리케이션을 빌드하고 배포하는 방법을 보여준다. 이 예제는 다음과 같은 구성으로 이루어져 있다.
- 방명록을 저장하는 단일 인스턴스 MongoDB
- 여러 개의 웹 프론트엔드 인스턴스
목적
- Mongo 데이터베이스를 시작
- 방명록 프론트엔드를 시작
- 프론트엔드 서비스를 노출하고 확인
- 정리 하기
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: v1.14. 버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.
Mongo 데이터베이스를 실행
방명록 애플리케이션은 MongoDB를 사용해서 데이터를 저장한다.
Mongo 디플로이먼트를 생성하기
아래의 매니페스트 파일은 단일 복제본 Mongo 파드를 실행하는 디플로이먼트 컨트롤러를 지정한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
labels:
app.kubernetes.io/name: mongo
app.kubernetes.io/component: backend
spec:
selector:
matchLabels:
app.kubernetes.io/name: mongo
app.kubernetes.io/component: backend
replicas: 1
template:
metadata:
labels:
app.kubernetes.io/name: mongo
app.kubernetes.io/component: backend
spec:
containers:
- name: mongo
image: mongo:4.2
args:
- --bind_ip
- 0.0.0.0
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 27017
-
매니페스트 파일을 다운로드한 디렉터리에서 터미널 창을 시작한다.
-
mongo-deployment.yaml
파일을 통해 MongoDB 디플로이먼트에 적용한다.kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-deployment.yaml
-
파드의 목록을 질의하여 MongoDB 파드가 실행 중인지 확인한다.
kubectl get pods
결과는 아래와 같은 형태로 나타난다.
NAME READY STATUS RESTARTS AGE mongo-5cfd459dd4-lrcjb 1/1 Running 0 28s
-
MongoDB 파드에서 로그를 보려면 다음 명령어를 실행한다.
kubectl logs -f deployment/mongo
MongoDB 서비스 생성하기
방명록 애플리케이션에서 데이터를 쓰려면 MongoDB와 통신해야 한다. MongoDB 파드로 트래픽을 프록시하려면 서비스를 적용해야 한다. 서비스는 파드에 접근하기 위한 정책을 정의한다.
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
app.kubernetes.io/name: mongo
app.kubernetes.io/component: backend
spec:
ports:
- port: 27017
targetPort: 27017
selector:
app.kubernetes.io/name: mongo
app.kubernetes.io/component: backend
-
mongo-service.yaml
파일을 통해 MongoDB 서비스에 적용한다.kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-service.yaml
-
서비스의 목록을 질의하여 MongoDB 서비스가 실행 중인지 확인한다.
kubectl get service
결과는 아래와 같은 형태로 나타난다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m mongo ClusterIP 10.0.0.151 <none> 6379/TCP 8s
참고: 이 매니페스트 파일은 이전에 정의된 레이블과 일치하는 레이블 집합을 가진mongo
라는 서비스를 생성하므로, 서비스는 네트워크 트래픽을 MongoDB 파드로 라우팅한다.
방명록 프론트엔드를 설정하고 노출하기
방명록 애플리케이션에는 PHP로 작성된 HTTP 요청을 처리하는 웹 프론트엔드가 있다. 방명록 항목들을 저장하기 위해 mongo
서비스에 연결하도록 구성 한다.
방명록 프론트엔드의 디플로이먼트 생성하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
labels:
app.kubernetes.io/name: guestbook
app.kubernetes.io/component: frontend
spec:
selector:
matchLabels:
app.kubernetes.io/name: guestbook
app.kubernetes.io/component: frontend
replicas: 3
template:
metadata:
labels:
app.kubernetes.io/name: guestbook
app.kubernetes.io/component: frontend
spec:
containers:
- name: guestbook
image: paulczar/gb-frontend:v5
# image: gcr.io/google-samples/gb-frontend:v4
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
-
frontend-deployment.yaml
파일을 통해 프론트엔드의 디플로이먼트에 적용한다.kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
-
파드의 목록을 질의하여 세 개의 프론트엔드 복제본이 실행되고 있는지 확인한다.
kubectl get pods -l app=guestbook -l tier=frontend
결과는 아래와 같은 형태로 나타난다.
NAME READY STATUS RESTARTS AGE frontend-3823415956-dsvc5 1/1 Running 0 54s frontend-3823415956-k22zn 1/1 Running 0 54s frontend-3823415956-w9gbt 1/1 Running 0 54s
프론트엔드 서비스 생성하기
서비스의 기본 유형은 ClusterIP이기 때문에 적용한 mongo
서비스는 컨테이너 클러스터 내에서만 접근할 수 있다. ClusterIP
는 서비스가 가리키는 파드 집합에 대한 단일 IP 주소를 제공한다. 이 IP 주소는 클러스터 내에서만 접근할 수 있다.
게스트가 방명록에 접근할 수 있도록 하려면, 외부에서 볼 수 있도록 프론트엔드 서비스를 구성해야 한다. 그렇게 하면 클라이언트가 쿠버네티스 클러스터 외부에서 서비스를 요청할 수 있다. 그러나 쿠버네티스 사용자는 ClusterIP
를 사용하더라도 kubectl port-forward
를 사용해서 서비스에 접근할 수 있다.
참고: Google Compute Engine 또는 Google Kubernetes Engine과 같은 일부 클라우드 공급자는 외부 로드 밸런서를 지원한다. 클라우드 공급자가 로드 밸런서를 지원하고 이를 사용하려면type : LoadBalancer
의 주석을 제거해야 한다.
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app.kubernetes.io/name: guestbook
app.kubernetes.io/component: frontend
spec:
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
ports:
- port: 80
selector:
app.kubernetes.io/name: guestbook
app.kubernetes.io/component: frontend
-
frontend-service.yaml
파일을 통해 프론트엔드 서비스에 적용시킨다.kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
-
서비스의 목록을 질의하여 프론트엔드 서비스가 실행 중인지 확인한다.
kubectl get services
결과는 아래와 같은 형태로 나타난다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 10.0.0.112 <none> 80/TCP 6s kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 4m mongo ClusterIP 10.0.0.151 <none> 6379/TCP 2m
kubectl port-forward
를 통해 프론트엔드 서비스 확인하기
-
다음 명령어를 실행해서 로컬 머신의
8080
포트를 서비스의80
포트로 전달한다.kubectl port-forward svc/frontend 8080:80
결과는 아래와 같은 형태로 나타난다.
Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
-
방명록을 보기위해 브라우저에서 http://localhost:8080 페이지를 로드한다.
LoadBalancer
를 통해 프론트엔드 서비스 확인하기
frontend-service.yaml
매니페스트를 LoadBalancer
와 함께 배포한 경우, 방명록을 보기 위해 IP 주소를 찾아야 한다.
-
프론트엔드 서비스의 IP 주소를 얻기 위해 아래 명령어를 실행한다.
kubectl get service frontend
결과는 아래와 같은 형태로 나타난다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 10.51.242.136 109.197.92.229 80:32372/TCP 1m
-
IP 주소를 복사하고, 방명록을 보기 위해 브라우저에서 페이지를 로드한다.
웹 프론트엔드 확장하기
서버가 디플로이먼트 컨르롤러를 사용하는 서비스로 정의되어 있기에 필요에 따라 확장 또는 축소할 수 있다.
-
프론트엔드 파드의 수를 확장하기 위해 아래 명령어를 실행한다.
kubectl scale deployment frontend --replicas=5
-
파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
kubectl get pods
결과는 아래와 같은 형태로 나타난다.
NAME READY STATUS RESTARTS AGE frontend-3823415956-70qj5 1/1 Running 0 5s frontend-3823415956-dsvc5 1/1 Running 0 54m frontend-3823415956-k22zn 1/1 Running 0 54m frontend-3823415956-w9gbt 1/1 Running 0 54m frontend-3823415956-x2pld 1/1 Running 0 5s mongo-1068406935-3lswp 1/1 Running 0 56m
-
프론트엔드 파드의 수를 축소하기 위해 아래 명령어를 실행한다.
kubectl scale deployment frontend --replicas=2
-
파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
kubectl get pods
결과는 아래와 같은 형태로 나타난다.
NAME READY STATUS RESTARTS AGE frontend-3823415956-k22zn 1/1 Running 0 1h frontend-3823415956-w9gbt 1/1 Running 0 1h mongo-1068406935-3lswp 1/1 Running 0 1h
정리하기
디플로이먼트 및 서비스를 삭제하면 실행 중인 모든 파드도 삭제된다. 레이블을 사용하여 하나의 명령어로 여러 자원을 삭제해보자.
-
모든 파드, 디플로이먼트, 서비스를 삭제하기 위해 아래 명령어를 실행한다.
kubectl delete deployment -l app.kubernetes.io/name=mongo kubectl delete service -l app.kubernetes.io/name=mongo kubectl delete deployment -l app.kubernetes.io/name=guestbook kubectl delete service -l app.kubernetes.io/name=guestbook
결과는 아래와 같은 형태로 나타난다.
deployment.apps "mongo" deleted service "mongo" deleted deployment.apps "frontend" deleted deployment.apps "frontend" deleted service "frontend" deleted
-
파드의 목록을 질의하여 실행 중인 파드가 없는지 확인한다.
kubectl get pods
결과는 아래와 같은 형태로 나타난다.
No resources found.
다음 내용
- 쿠버네티스 기초 튜토리얼을 완료
- MySQL과 Wordpress을 위한 퍼시스턴트 볼륨을 사용하여 블로그 생성하는데 쿠버네티스 이용하기
- 애플리케이션 접속에 대해 더 알아보기
- 자원 관리에 대해 더 알아보기