해당 문서의 쿠버네티스 버전: v1.20
Kubernetes v1.20 문서는 더 이상 적극적으로 관리되지 않음. 현재 보고있는 문서는 정적 스냅샷임. 최신 문서를 위해서는, 다음을 참고. 최신 버전.
예시: 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> 27017/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.kubernetes.io/name=guestbook -l app.kubernetes.io/component=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 LoadBalancer 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 service "frontend" deleted
파드의 목록을 질의하여 실행 중인 파드가 없는지 확인한다.
kubectl get pods
결과는 아래와 같은 형태로 나타난다.
No resources found.
다음 내용
- 쿠버네티스 기초 튜토리얼을 완료
- MySQL과 Wordpress을 위한 퍼시스턴트 볼륨을 사용하여 블로그 생성하는데 쿠버네티스 이용하기
- 애플리케이션 접속에 대해 더 알아보기
- 자원 관리에 대해 더 알아보기