쿠버네티스 Service

Chori·2025년 11월 16일
post-thumbnail

초보를 위한 쿠버네티스 안내서를 수강하며 정리한 내용입니다.

개념

  • Pod는 자체 IP 주소를 가지고 다른 Pod와 통신할 수 있지만 쉽게 사라지고 생성되는 특징 때문에 직접 통신하는 방법은 권장하지 않음
  • 쿠버네티스는 Pod와 직접 통신하는 방법 대신에 별도의 고정된 IP 주소를 가진 Service를 만들고 이를 통해 Pod에 접근하는 방식을 사용
  • 노출 범위에 따라 ClusterIP, NodePort, LoadBalancer 유형으로 나뉨

ClusterIP 만들기

  • 외부에서 Pod로 접속하는 것이 아니라 클러스터 내부에 있는 Pod가 또 다른 Pod에 접속하기 위해 만드는 Service
  • ClusterIP는 클러스터 내부에서 새로운 IP 주소를 할당하고 여러 개의 Pod를 바라보는 로드밸런서 기능을 제공
  • Service 이름을 내부 도메인 서버에 등록하여 Pod 간에 Service 이름으로 통신할 수 있음
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    metchLables:
      app: counter
      tier: db
  template:
    metadata:
      labels:
        app: counter
        tier: db
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPorts: 6379
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  ports:
    - port: 6379
      protocol: TCP
  selector:
    app: counter
    tier: db
  • 같은 클러스터에서 생성된 Pod라면 redis라는 도메인으로 redis Pod에 접근할 수 있음
  • spec.ports.port: Service가 생성할 Port
  • spec.ports.targetPort: Service가 접근할 Pod의 Port (기본값: port와 동일)
  • spec.selector: Service가 접근할 Pod의 label 조건
apiVersion: apps/v1
kind: Deployment
metadata:
  name: counter
spec:
  selector:
    matchLables:
      app: counter
      tier: app
  template:
    metadata:
      labels:
        app: counter
        tier: app
    spec:
      containers:
        - name: counter
          image: ghcr.io/subicura/counter:latest
          env:
            - name: REDIS_HOST
              value: "redis"
            - name: REDIS_PORT
              value: "6379"
  • Redis에 접근하는 Counter 앱에서 REDIS_HOST의 값을 redis로 주었음

NodePort 만들기

  • 클러스터 외부에서 접근할 때 필요한 Service는 NodePort
apiVersion: v1
kind: Service
metadata:
  name: counter-np
spec:
  type: NodePort
  ports:
    - port: 3000
      protocol: TCP
      nodePort: 31000
  selector:
    app: counter
    tier: app
  • spec.ports.nodePort: Node에 오픈할 Port (미지정 시 30000-32768 중에 자동 할당)
  • NodePort는 클러스터의 모든 Node에서 포트를 오픈, 여러 개의 Node가 있을 때 아무 Node로 접근해도 지정한 Pod로 접근하게 됨
  • NodePort는 ClusterIP의 기능을 기본적으로 포함

LoadBalancer 만들기

  • NodePort의 단점은 Node가 사라졌을 때 자동으로 다른 Node를 통해 접근이 불가능하다는 점, 예를 들어 3개의 Node가 있다면 3개 중에 아무 Node로 접근해도 NodePort로 연결할 수 있지만 어떤 Node가 정상 작동하는지 알 수 없음
  • 자동으로 정상 작동하는 Node에 접근하기 위해 모든 Node를 바라보는 LoadBalancer가 필요, LoadBalancer는 NodePort가 정상 작동하는지 계속 확인하며 만약 Node에 문제가 생기면 다른 Node로 요청을 보냄
  • 브라우저는 NodePort에 직접 요청을 보내는 것이 아니라 LoadBalancer에 요청을 하고 LoadBalancer가 알아서 정상 작동하는 Node에 접근하면 NodePort의 단점을 없앨 수 있음
apiVersion: v1
kind: Service
metadata:
  name: counter-lb
spec:
  type: LoadBalancer
  ports:
    - port: 30000
      targetPort: 3000
      protocol: TCP
  selector:
    app: counter
    tier: app
  • 일반적인 경우에는 NodePort보다 LoadBalancer를 많이 사용
  • 그러나 LoadBalancer는 하나의 서비스밖에 바라보지 못한다는 문제가 있음, 예를 들어 쿠버네티스 클러스터에 여러 개의 앱이 있다면 각각의 LoadBalancer가 필요, 서비스가 늘어날 때마다 LoadBalancer를 추가해야 함, 그래서 Ingress를 주로 사용
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글