![[Kubernetes] Deployment와 Service](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNfolE%2FbtsNMLgTmR2%2FCAg8id90FKpPqW8A95v9Ek%2Fimg.png)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
Deployment
Deployment 개념
디플로이먼트(Deployment) 란 파드를 묶음으로 쉽게 관리할 수 있는 기능을 말한다.
- 현업에서는 일반적으로 서버를 작동시킬 때 파드(Pod)를 수동으로 배포하진 않는다.
- 디플로이먼트(Deployment)라는 걸 활용해서 파드(Pod)를 자동으로 배포한다.
디플로이먼트의 장점
- 파드의 수를 지정하는 대로 여러 개의 파드를 쉽게 생성할 수 있음.
ex) 파드를 100개를 생성하라고 시키면 디플로이먼트가 알아서 파드를 100개 생성해준다. - 파드가 비정상적으로 종료된 경우, 알아서 새로 파드를 생성해 파드 수를 유지한다.
- 동일한 구성의 여러 파드를 일괄적으로 일시 중지, 삭제, 업데이트를 하기가 쉽다.
ex) 디플로이먼트를 활용하면 ‘100개의 파드로 띄워져있는 결제 서버’를 한 번에 일시 중지/삭제/업데이트하는 게 굉장히 쉽다.
디플로이먼트의 구조
디플로이먼트(Deployment)가 레플리카셋(ReplicaSet)을 관리하고, 레플리카셋(ReplicaSet)이 여러 파드(Pod)를 관리하는 구조이다.
- 레플리카(Replica) : 복제본
- 레플리카셋(ReplicaSet) : 복제본끼리의 묶음
여러 백엔드 서버 띄우기
spring-deployment.yaml
apiVersion: apps/v1 kind: Deployment # Deployment 기본 정보 metadata: name: spring-deployment # Deployment 이름 # Deployment 세부 정보 spec: replicas: 3 # 생성할 파드의 복제본 개수 selector: matchLabels: app: backend-app # 아래에서 정의한 Pod 중 'app: backend-app'이라는 값을 가진 파드를 선택 # 배포할 Pod 정의 template: metadata: labels: # 레이블 (= 카테고리) app: backend-app spec: containers: - name: spring-container # 컨테이너 이름 image: spring-server # 컨테이너를 생성할 때 사용할 이미지 imagePullPolicy: IfNotPresent # 로컬에서 이미지를 먼저 가져온다. 없으면 레지스트리에서 가져온다. ports: - containerPort: 8080 # 컨테이너에서 사용하는 포트를 명시적으로 표현 |
위에서 설정한 Manifest File을 기반으로 디플로이먼트를 생성하는 명령어는 아래와 같다.
kubectl apply -f spring-deployment.yaml
디플로이먼트, 레플리카셋, 파드가 잘 생성됐는 지 확인
kubectl get deployment
kubectl get replicaset
kubectl get pods
디플로이먼트 삭제
kkubectl delete deployment spring-deployment
Service
Service 개념
서비스(Service)란 외부로부터 요청을 받는 역할 / 외부로부터 들어오는 트래픽을 받아, 파드에 균등하게 분배해주는 로드밸런서 역할을 하는 기능을 뜻한다.
즉, 사용자는 각각의 파드에 요청을 보내는 것이 아니라 서비스에 요청을 보내면 서비스는 각각의 파드에 요청을 보내게 되고, 이때 서비스는 로드밸런싱을 수행한다.
서비스를 이용한 백엔드 서버와 통신
spring-deployment.yaml
apiVersion: apps/v1 kind: Deployment # Deployment 기본 정보 metadata: name: spring-deployment # Deployment 이름 # Deployment 세부 정보 spec: replicas: 3 # 생성할 파드의 복제본 개수 selector: matchLabels: app: backend-app # 아래에서 정의한 Pod 중 'app: backend-app'이라는 값을 가진 파드를 선택 # 배포할 Pod 정의 template: metadata: labels: # 레이블 (= 카테고리) app: backend-app spec: containers: - name: spring-container # 컨테이너 이름 image: spring-server # 컨테이너를 생성할 때 사용할 이미지 imagePullPolicy: IfNotPresent # 로컬에서 이미지를 먼저 가져온다. 없으면 레지스트리에서 가져온다. ports: - containerPort: 8080 # 컨테이너에서 사용하는 포트를 명시적으로 표현 |
위에서 설정한 Manifest File을 기반으로 디플로이먼트를 생성하는 명령어는 아래와 같다.
kubectl apply -f spring-deployment.yaml
spring-service.yaml
apiVersion: v1 kind: Service # Service 기본 정보 metadata: name: spring-service # Service 이름 # Service 세부 정보 spec: type: NodePort # Service의 종류 selector: app: backend-app # 실행되고 있는 파드 중 'app: backend-app'이라는 값을 가진 파드와 서비스를 연결 ports: - protocol: TCP # 서비스에 접속하기 위한 프로토콜 port: 8080 # 쿠버네티스 내부에서 Service에 접속하기 위한 포트 번호 targetPort: 8080 # 매핑하기 위한 파드의 포트 번호 nodePort: 30000 # 외부에서 사용자들이 접근하게 될 포트 번호 |
Service 종류
- NodePort : 쿠버네티스 내부에서 해당 서비스에 접속하기 위한 포트를 열고 외부에서 접속 가능하도록 한다.
- ClusterIP : 쿠버네티스 내부에서만 통신할 수 있는 IP 주소를 부여. 외부에서는 요청할 수 없다.
- LoadBalancer : 외부의 로드밸런서(AWS의 로드밸런서 등)를 활용해 외부에서 접속할 수 있도록 연결한다.
Manifest File을 기반으로 서비스 생성하는 명령어는 아래와 같다.
kubectl apply -f spring-service.yaml
서비스가 잘 생성됐는 지 확인
kubectl get service
서버 개수 조절
트래픽이 늘어나서 서버를 늘리고 싶다면 디플로이먼트(Deployment)를 활용하면 쉽게 서버의 개수를 늘릴 수 있다.
spring-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: spring-deployment spec: replicas: 5 selector: matchLabels: app: backend-app template: metadata: labels: app: backend-app spec: containers: - name: spring-container image: spring-server imagePullPolicy: IfNotPresent ports: - containerPort: 8080 |
변경사항 적용
kubectl apply -f spring-deployment.yaml
잘 적용되었는지 확인
kubectl get pods
기존의 3개의 파드는 약 5분 30초전에 실행되었고, 새로운 파드 2개가 7초전에 새로 생성된것을 확인할 수 있다.
서버 업데이트
- 서버를 운영하다보면 기능을 업데이트를 할 일이 많이 발생한다.
- 쿠버네티스에서는 새로운 버전의 백엔드 서버를 업데이트하는 것을 쉽게할 수 있다.
- 여기서는 스프링을 기준으로 설명한다.
스프링부트 백엔드 애플리케이션의 코드가 변경되었다고 가정하고 빌드한다.
./gradlew clean build
빌드된 jar 파일을 기반으로 새로 도커 이미지를 빌드한다.(태그를 붙인다.)
docker build -t spring-server:1.0 .
이미지가 잘 생성됐는지 확인한다.
docker image ls
spring-deployment.yaml 수정
apiVersion: apps/v1 kind: Deployment metadata: name: spring-deployment spec: replicas: 5 selector: matchLabels: app: backend-app template: metadata: labels: app: backend-app spec: containers: - name: spring-container image: spring-server:1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 |
수정된 Manifest File을 기반으로 업데이트한다.
kubectl apply -f spring-deployment.yaml
여기까지 했다면 백엔드를 담당하는 모든 파드가 업데이트 된다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] 핵심 명령어 정리 (1) | 2025.05.13 |
---|---|
[Kubernetes] 볼륨(Volume) (0) | 2025.05.12 |
[Kubernetes] 환경변수 관리(ConfigMap, Secret) (0) | 2025.05.11 |
[Kubernetes] 파드(Pod) (0) | 2025.05.09 |
[Kubernetes] 쿠버네티스 설치(Mac) (0) | 2025.05.08 |