Infra/Open Source

[Kubernetes] K8S 배포 설정 Deployment, Service, Ingress 파악하기

헹창 2024. 2. 2.
반응형

Deployment

Kubernetes Deployment Docs.
  • 디플로이먼트는 파드와 레플리카셋에 대한 업데이트를 선언하는 영역
apiVersion: apps/v1
kind: Deployment
metadata:
  name: haenny-deploy
  labels:
    app: haenny-deploy
spec:
  replicas: 2
  revisionHistoryLimit: 3	# 유지할 ReplicaSet의 최대 개수 설정
  selector:
    matchLabels:
      app: haenny
  template:
    metadata:
      labels:
        app: haenny
    spec:
      containers:
      - name: haenny
        image: openjdk11
        command:
           - /java/openjdk/bin/java
           - '-jar'
           - /haenny.jar
        ports:
        - containerPort: 80

 

  • apiVersion   :   해당 deployment 를 생성하기 위해 사용하고 있는 K8S API 버전 정의
  • kind    :   K8S 에 다양한 오브젝트가 존재하는데, 그 중 하나가 deployment
  • metadata   :  deployment 설정 - 오브젝트를 유일하게 구분해줄 데이터
    • metadata.name  :  생성할 deployment 이름 설정
    • metadata.label   :  deployment 레이블 설정
  • spec   :  오브젝트 상태 정의
    • spec.replicas  :  pod 의 개수를 몇 개 유지할 지 설정, 기본 값 = 1
    • spec.selector  :  이 deployment 가 관리할 파드를 찾는 방법 정의., 이 필드가 없을 경우 spec.template.metadata.labels 에 설정된 내용들을 기본 값으로 설정
  • spec.template.metadata   :   어떤 파드를 실행할 지 정의하는 곳
    • spec.template.metadata.name   :   생성될 파드 이름 지정
    • spec.template.metadata.labels : 파드에 레이블 설정 
    • spec   :  컨테이너에 대한 설정 지정 - 컨테이너 명, 포트 등
    • spec.containers.ports.containerPort   :   컨테이너가 사용하는 포트 지정
      • 컨테이너와 통신하기 위해 service.yaml 설정도 필요
      • service.yaml 에 targetPort 와 containerPort 가 같지 않다면, 서비스는 해당 컨테이너로 트래픽을 전달할 수 없음

 

Service

Kubernetes Service Docs.
  • 파드셋에서 실행중인 애플리케이션을 네트워크 서비스로 노출시키는 방법
  • 파드는 클러스터 상태와 일치하도록 생성 및 삭제됨으로 각 파드가 고유한 IP를 가지지만, Deployment 를 통해 앱을 실행하면 특정 시점에서 실행된 파드 셋이 잠시 후 실행되는 해당 파드 셋과 다를 수 있어 K8S 서비스가 파드에 접근할 수 있도록 정책을 정의
    • 실제 파드가 변경되더라도 Front-end Client 는 이를 인식할 필요가 없도록 해줌
apiVersion: v1
kind: Service
metadata:
  name: haenny-service
spec:
  selector:
    app: haenny
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

 

  • metadata.name   :  생성할 서비스 이름 지정
  • spec.selector   :  셀렉터와 일치하는 파드를 지속적으로 검색하고, 해당 이름을 가지는 endpoint object 에 대한 모든 업데이트를 POST 함

서비스의 유형

  • ClusterIP (Default - type 을 별도로 지정하지 않은 경우 기본 값)
    :  pod 들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상 클러스터 전용 IP로, ClusterIP로 들어온 클러스터 내부 트래픽을 해당 파드의 <PodIP>:<targetPort> 로 넘겨주도록 동작하므로 클러스터 내부에서만 접근 가능하다.
  • NodePort
    : 외부에서 노드 IP의 특정 포트 ( <NodeIP>:<NodePort> ) 로 들어오는 요청을 감지해, 해당 포트와 연결된 파드로 트래픽을 전달하는 서비스다. 이 때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.
  • LoadBalancer
    : 클러스터의 서비스로 프로비저닝할 수 있는 로드밸런서 유형도 제공된다
  • ExternalName
    : 서비스에 selector 대신 DNS name을 직접 명시하고자 할 때 쓰인다

Ingress

Kubernetes Ingress Docs.
  • 클러스터 외부에서 클러스터 내부 서비스로 HTTP, HTTPS 경로를 노출
  • 인그레스 리소스에 정의된 규칙에 의해 트래픽 라우팅을 컨트롤

Ingress Controller

Kubernetes Ingree Controller Docs.
  • 인그레스 컨트롤러가 외부로부터 네트워크 요청을 수신하면, 인그레스 규칙에 따라 요청을 처리할 지 결정
  • Kubernetes - AWS, GCE, Nginx 인그레스 컨트롤러를 지원
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dev-ingress-path
  namespace: dev
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /haenny(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: haenny-service
                port:
                  number: 80
  • metadata.annotations    :    nginx.ingress.kubernetes.io/rewrite-target: /$2 는 regex 의 두번째 그룹으로 요청 전송한다
    • e.g.) /a/b 호출 > /b, /a/b/c 호출 > /b/c

 

 

 

쿠버네티스(K8S)를 통해 애플리케이션 배포하기 위해서는, 세 가지 영역을 설정에 대해 알아보았다.

  • Deployment - 클러스터 desired state 기술
  • Service - 네트워크 서비스로 노출
  • Ingress -  클러스터 외부에서 클러스터 내부 서비스로 접근
728x90
반응형

댓글

추천 글