쿠버네티스 클러스터를 생성하여 nginx 웹 서버를 배포해보겠습니다.
먼저 로컬에서 쿠버네티스를 테스트해보기 위해 minikube, 쿠버네티스 CLI 도구인 kubectl과 virtualbox를 설치해줍니다.
minikube로 클러스터를 생성해줍니다.
$ minikube start --memory=4084 --cpus=2 --disk-size=30g \
--vm-driver=virtualbox -p my-profile
생성된 프로필 my-profile을 확인하고, 그 프로필로 전환해줍니다.
$ minikube profile list
$ minikube profile my-profile
nginx 웹 서버를 배포할 샘플 디플로이먼트를 생성해보겠습니다.
kubectl 컨텍스트의 기본 namespace를 새로 만들어서 지정해줍니다.
$ kubectl create namespace my-namespace
$ kubectl config set-context $(kubectl config current-context) --namespace=my-namespace
deployment를 생성하기 위해 다음과 같은 nginx-deployment.yaml 파일을 작성해줍니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
오브젝트 이름은 nginx-deploy이고, replicas의 값을 1로 설정해서 팟을 하나만 실행합니다.
deployment가 app labels의 값이 nginx-app인 팟을 찾도록 합니다.
template에서는 팟 생성 방법을 작성하는데, 팟을 식별할 때 사용하는 labels과 nginx 이미지를 지정해줍니다.
$ kubectl apply -f nginx-deployment.yaml
다음 커맨드로 클러스터에 deployment를 생성하고 확인해봅니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-684c7956fd-s7f2r 1/1 Running 0 18s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 74s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-684c7956fd 1 1 1 74s
1개의 pod, 1개의 deployment, 1개의 replicaset을 확인할 수 있습니다.
생성되어있는 하나의 팟을 임의로 제거해보겠습니다.
$ kubectl delete pod --selector app=nginx-app
replicaset이 지정한 상태와의 차이를 감지하고 새로운 팟을 다시 생성하게 됩니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-684c7956fd-s7f2r 0/1 ContainerCreating 0 3s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 0/1 1 0 59s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-684c7956fd 1 1 0 59s
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-684c7956fd-s7f2r 1/1 Running 0 5s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 61s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-684c7956fd 1 1 1 61s
nginx-deployment.yaml의 replica 값을 3으로 변경하고 다시 적용해보겠습니다.
$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deploy configured
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-684c7956fd-blxsb 1/1 Running 0 14s
pod/nginx-deploy-684c7956fd-kkm7p 1/1 Running 0 14s
pod/nginx-deploy-684c7956fd-s7f2r 1/1 Running 0 76s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 3/3 3 3 2m12s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-684c7956fd 3 3 3 2m12s
세 개의 팟을 확인할 수 있습니다.
생성된 nginx 웹 서버가 외부와 통신할 수 있도록 서비스 객체를 만들기 위해 nginx-service.yaml 파일을 작성해보겠습니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx-app
ports:
- targetPort: 80
port: 80
nodePort: 30080
서비스 오브젝트의 이름은 nginx-service로 지정하고, 타입은 NodePort로 선언하여 외부에서 클러스터 노드에 접근하기 위한 전용 포트를 지정해주겠습니다.
요청이 전달될 팟의 포트는 80, 클러스터 내부에서 사용하는 포트는 80, 외부에서 서비스에 접근할 때 사용할 노드의 포트는 30080으로 지정하였습니다.
$ kubectl apply -f nginx-service.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.97.136.21 <none> 80:30080/TCP 6s
서비스 객체를 생성하여 확인해줍니다.
다음 커맨드로 클러스터 노드의 IP 주소를 알아내서 배포한 웹 서버에 접속해봅니다.
$ minikube ip
$ curl -s $(minikube ip):30080
nginx 웹 페이지가 출력되는 것을 확인할 수 있습니다.
$ kubectl delete namespace my-namespace
배포했던 namespace를 제거하고 마무리해줍니다.
$ minikube stop
* Stopping node "my-profile" ...
* 1개의 노드가 중지되었습니다.
$ minikube start
$ minikube delete --profile my-profile
다음과 같이 클러스터를 일시 정지 및 시작하거나, 종료시킬 수 있습니다.
* '스프링으로 하는 마이크로서비스 구축 / 매그너스 라슨' 을 보면서 실습해본 내용입니다.
'Kubernetes' 카테고리의 다른 글
쿠버네티스 튜토리얼 5 : 앱 스케일링하기 (Kubernetes tutorial) (0) | 2021.11.11 |
---|---|
쿠버네티스 튜토리얼 4 : 앱 외부로 노출하기 (Kubernetes tutorial) (0) | 2021.11.11 |
쿠버네티스 튜토리얼 3 : 앱 조사하기 (Kubernetes tutorial) (0) | 2021.11.11 |
쿠버네티스 튜토리얼 2 : 앱 배포하기 (Kubernetes tutorial) (0) | 2021.11.11 |
쿠버네티스 튜토리얼 1 : 클러스터 생성하기 (Kubernetes tutorial) (0) | 2021.11.11 |