본문 바로가기
개발/k8s

[k8s] 쿠버네티스 Service와 Deployment

by parkkingcar 2023. 12. 19.

 

기본적으로 쿠버네티스 매니패스트 파일을 통해 클러스터 내부의 애플리케이션의 네트워크 설정, 구성 등의 리소스를 작성하고 관리합니다. yaml 또는 yml 형식의 파일을 사용합니다.

 


쿠버네티스 클러스터의 구성에 대해서는 아래 글에서 다루고 있습니다. 

 

[k8s] 쿠버네티스 기초

쿠버네티스란? 쿠버네티스는 구글이 내부적으로 사용하던 컨테이너 클러스터 관리도구에서 아이디어를 얻어서 만든 오픈소스 소프트웨어입니다. 쿠버네티스는 컨테이너화된 애플리케이션의

parkkingcar.tistory.com

 

 

Pod

Pod은 쿠버네티스의 기본 배포 단위입니다. Pod은 하나 이상의 컨테이너를 묶은 단위로, 컨테이너들이 동일한 호스트에서 실행됩니다. Pod은 네트워크 네임스페이스, IPC 네임스페이스, 호스트 이름, 스토리지 리소스를 공유하는 컨테이너 그룹입니다. 

 

Deployment

Deployment는 Pod의 논리적인 그룹이며, Pod의 생성 및 업데이트를 관리하는 쿠버네티스 리소스입니다. Deployment를 사용하면 쉽게 애플리케이션을 배포하고 롤백하는 등의 작업을 수행할 수 있습니다. 또한, Desired State와 Current State를 비교하여 자동으로 조정됩니다.

 

Deployment_test.yml예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1

 

위 구성은 myapp-deployment라는 이름의 Deployment를 생성하며, 레이블이 app: myapp인 Pod를 3개 유지합니다. Pod는 myapp-container라는 이름의 컨테이너를 가지며, 해당 컨테이너는 myapp:v1 이미지를 사용합니다.

 

 

apiVersion : apps/v1은 이 파일이 사용하는 Kubernetes API의 버전을 나타냅니다. apps/v1은 앱 관리와 관련된 오브젝트(객체)를 정의하는 데 사용되는 API 버전입니다. 

kind : 이 YAML 파일이 Deployment 오브젝트를 정의한다는 것을 나타냅니다.

metadata : 메타데이터를 정의합니다. 

spec : Deployment의 세부 사항을 정의합니다. 

replicas :  원하는 Pod의 복제본 수입니다. 이 경우 3개의 동일한 Pod을 유지합니다.

selector : Deployment가 어떤 Pod을 관리할 것인지를 선택하는 데 사용됩니다. 여기서는 matchLabels를 사용하여 app: myapp 레이블을 가진 Pod을 관리하도록 선택했습니다.

template : 새로 생성되는 Pod의 템플릿을 정의합니다.

metadata : Pod 템플릿의 메타데이터를 정의합니다. app: myapp 레이블을 가진 Pod을 생성합니다.

spec : Pod의 세부 사항을 정의합니다.

containers : Pod 내에서 실행될 컨테이너를 정의합니다.

name : 컨테이너의 이름을 정의합니다. 

image : 컨테이너가 사용할 이미지를 정의합니다. myapp:v1 이미지를 사용합니다.

 

 

 

Service

service는 여러 Pod에 대한 단일 진입점을 제공하는 쿠버네티스 리소스입니다. 서비스를 통해 Pod의 네트워크 추상화 및 로드 밸런싱이 가능하며, DNS 이름을 통해 서비스에 접근할 수 있습니다. 서비스를 사용하여 애플리케이션의 내부 통신 및 외부 노출을 관리할 수 있습니다.

 

Service _test.yml예시

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

 

위 구성은 myapp-service라는 이름의 Service를 생성하며, 이 Service는 레이블이 app: myapp인 Pod에 연결되어 외부에서 80 포트로 액세스할 수 있게 합니다. 해당 트래픽은 Pod의 8080 포트로 전달되며, 클라우드 제공업체의 로드 밸런서를 통해 관리됩니다.

 

 

apiVersion : v1은 이 파일이 사용하는 Kubernetes API의 버전을 나타냅니다. 

kind : Service는 Pod에 대한 네트워크 엔드포인트를 제공하는 리소스입니다.

metadata : 메타데이터를 정의합니다.

spec : Service의 세부 사항을 정의합니다.

selector : Service가 어떤 Pod을 대상으로 하는지를 선택하는 데 사용됩니다. 여기서는 app: myapp 레이블을 가진 Pod을 대상으로 합니다.

ports : Service가 수신할 포트 및 해당 포트로 전달할 대상 포트를 정의합니다.

protocol : 포트가 사용할 프로토콜을 정의합니다.

port : Service가 수신할 포트 번호를 정의합니다. 여기서는 클라이언트가 접속할 때 사용할 포트로 80을 사용합니다.

targetPort : Pod에 전달할 트래픽이 도착할 포트를 정의합니다. 여기서는 Pod이 제공하는 애플리케이션의 포트로 8080을 사용합니다.

type : Service의 유형을 정의합니다. 여기서는 LoadBalancer 타입을 사용하여 외부에서 액세스 가능한 공용 IP를 할당받는 로드 밸런서를 생성합니다.

 

 

 

쉽게 말하면, deployment를 통해 여러 pod를 그룹으로 관리하고 애플리케이션을 배포, 롤백 등의 작업을 수행합니다. Service를 통해 pod의 앤드포인트 제공, 로드밸런싱 등을 가능하도록 하고, 애플리케이션의 내부 통신 및 외부 노출을 관리할 수 있습니다.

 

 

 

 

매니페스트 파일을 클러스터에 등록하려면 kubectl 명령을 사용합니다.
$ kubectl apply -f 파일이름.yaml

매니페스트 파일로 정의한 리소스를 클러스터에서 삭제하려면 다음과 같이 명령어를 실행합니다. 
$ kubectl delete -f 파일이름.yaml





 

댓글