본문 바로가기
Study/Cloud,Docker,Kubernetes

Kuberenetes- Deployment, Service

by 왕방개 2024. 10. 29.

 


1.Deployment

-정의: Replicaset 을 관리하는 controller

-역할: 애플리케이션의 상태를 원하는 대로 설정하고 관리하는 방법.

 

<예시> nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

 

 

  • apiVersion
    • 리소스의 API 그룹과 버전을 지정합니다. 각 Kubernetes 리소스는 특정 API 그룹에 속해 있으며, apiVersion은 이 그룹과 버전을 명시합니다.
  • kind
    • YAML 파일에서 정의하려는 리소스의 종류를 나타냅니다.
    • 예: Deployment, Service, Pod 등이 있습니다.
  • metadata
    • 리소스에 대한 메타데이터를 포함합니다. 이 필드는 모든 Kubernetes 리소스에서 공통으로 사용됩니다.
    • 주요 하위 필드:
      • name: 리소스의 이름을 지정합니다.
      • labels: 리소스를 식별하고 그룹화하는 데 사용되는 키-값 쌍입니다. 예를 들어, 특정 앱을 식별하거나 버전 등을 표시할 수 있습니다.
      • annotations: 레이블과 유사한 키-값 쌍을 추가할 수 있지만, 주로 메타데이터에 정보를 추가하는 용도로 사용됩니다.
  • spec
    • 리소스의 구체적인 사양을 정의합니다. 리소스마다 spec 필드의 내용이 다릅니다.
    • 주요 하위 필드:
      • Deployment의 spec 필드:
        • replicas: 생성할 파드 수를 정의합니다.
        • selector: 이 Deployment가 관리할 파드를 식별하는 기준이 되는 레이블을 설정합니다.
        • template: Deployment가 생성할 파드의 템플릿을 정의합니다. 파드 템플릿에는 파드의 메타데이터(metadata)와 사양(spec)이 포함됩니다.
      • Pod의 spec 필드:
        • containers: 파드 내 컨테이너 목록입니다. 각 컨테이너에 대한 이름, 이미지, 포트, 자원 요청/제한 등을 설정할 수 있습니다.
  • containers
    • 파드에 포함된 컨테이너의 목록을 정의합니다.
    • 주요 하위 필드:
      • name: 컨테이너의 이름입니다.
      • image: 컨테이너 이미지 이름 및 태그(버전)를 지정합니다.
      • ports: 컨테이너가 노출할 포트입니다. containerPort는 컨테이너 내에서 사용되는 포트를 설정합니다.
      • env: 환경 변수 설정입니다. 각 환경 변수에 대한 이름과 값을 지정할 수 있습니다.
  • selector
    • 이 리소스가 어떤 파드를 선택하여 관리할지 결정합니다. 주로 matchLabels를 통해 특정 레이블과 일치하는 파드를 선택합니다.
  • template
    • Deployment와 같은 리소스가 생성할 파드의 템플릿을 정의합니다.
    • template 아래에 있는 metadata와 spec은 생성되는 파드의 레이블과 사양을 정의합니다.
  • labels
    • metadata나 template의 metadata에서 사용하는 필드로, 리소스에 대한 레이블을 정의합니다.
    • 파드를 특정 그룹으로 묶어 관리하거나, 선택 조건으로 사용됩니다.

 


2.Service

-정의: 클러스터 내외부에서 애플리케이션에 안정적으로 접근할 수 있는 네트워크 엔드포인트를 제공합니다. 일반적으로 파드는 동적으로 생성되고 삭제되므로 IP 주소가 고정되지 않기 때문에, Service는 이러한 파드의 집합에 고정된 IP 주소와 이름을 제공하여 파드 간 통신을 용이하게 함.

-역할: 클러스터 내외부에서 애플리케이션에 접근하도록 하는 엔드포인트 생성.

 

<예시> nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80        # Service에서 외부에 노출되는 포트
      targetPort: 80  # 파드에서 서비스하는 포트
  type: ClusterIP     # Service의 유형 (ClusterIP, NodePort, LoadBalancer 등)

 

 

 

  • apiVersion
    • 리소스가 속한 API 그룹과 버전입니다. Service는 기본 그룹에 속해 있으며, 보통 v1 버전을 사용합니다.
  • kind
    • 리소스의 종류를 나타내며, 여기서는 Service입니다.
  • metadata
    • Service의 메타데이터 정보를 포함합니다.
    • name: Service의 이름입니다.
    • labels: 필요에 따라 서비스에 레이블을 추가해 관리할 수 있습니다.
  • spec
    • Service의 상세 설정입니다.
    • selector: Service가 트래픽을 전달할 파드를 선택하는 기준입니다. 예를 들어, app: nginx라는 레이블을 가진 모든 파드가 이 Service의 대상이 됩니다.
    • ports: 외부와 통신할 때 사용할 포트 설정입니다.
      • port: Service가 외부에 노출하는 포트입니다.
      • targetPort: 연결된 파드가 내부적으로 사용하는 포트입니다. port와 targetPort는 다를 수 있습니다.
      • protocol: 사용할 네트워크 프로토콜을 지정합니다(예: TCP, UDP).
    • type: Service의 유형을 정의하며, 네트워크 접근 방식에 영향을 미칩니다. 주요 type 옵션은 다음과 같습니다:
      • ClusterIP: 기본값으로, 클러스터 내에서만 접근 가능.
      • NodePort: 클러스터 외부에서 노드 IP 주소와 특정 포트를 통해 접근 가능.
      • LoadBalancer: 클라우드 환경에서 외부 로드 밸런서를 설정해 외부 접근 가능.
      • ExternalName: 클러스터 외부의 DNS 이름을 사용할 때 사용됩니다.

주요 Service 유형

  • ClusterIP
    • 기본 설정이며, 클러스터 내부에서만 접근할 수 있는 IP 주소를 할당합니다.
    • 보통 애플리케이션의 백엔드가 다른 서비스와 통신할 때 사용합니다.
  • NodePort
    • 각 노드의 특정 포트(30000~32767 범위)를 통해 클러스터 외부에서 접근할 수 있습니다.
    • 외부에서 클러스터 노드 IP와 NodePort를 사용해 서비스에 접근할 수 있습니다.
  • LoadBalancer
    • 클라우드 환경에서 외부 로드 밸런서를 생성하여 외부 접근을 용이하게 합니다.
    • LoadBalancer IP 주소를 통해 외부에서 접근할 수 있습니다. (지원 여부는 클라우드 환경에 따라 다름)
  • ExternalName
    • Service가 클러스터 외부의 DNS 이름을 사용하도록 합니다.
    • 클러스터 내에서 Service 이름을 통해 외부 DNS 엔트리에 접근할 수 있습니다

 


3. kubectl 을 활용하여 Deployment 와 Service 활용

  • nginx-deployment.yaml 배포
kubectl apply -f nginx-deployment.yaml

 

  • nginx-service.yaml 배포
kubectl apply -f nginx-service.yaml

 

'Study > Cloud,Docker,Kubernetes' 카테고리의 다른 글

Load Balancer 정의 및 정리  (0) 2024.10.29
Container 기초  (0) 2024.10.15
Kubernetes  (0) 2024.04.08
Docker(4)-DockerCompose  (0) 2024.04.06
Docker(3)-Dockerfile  (0) 2024.04.04