심플코더
간단한 코딩 공간
   

글쓰기    관리    수식입력
  • 분류 전체보기 (84)
    • AWS (1)
    • JavaScript (11)
    • 개인학습 (5)
    • DB (11)
    • OS (9)
    • Network (7)
    • DevOps (0)
    • TypeScript (1)
    • 개발 (1)
    • CKA (28)
hELLO · Designed By 정상우.
심플코더

간단한 코딩 공간

CKA

(TIL) Kubernetes Service

Kubernetes Service란

Kubernetes에서 Pod는 독립적인 네트워크를 사용하기 때문에 외부에서 직접 Pod로 접근하는 것은 어렵다.
또한 Pod는 동적으로 생성되고 종료되므로 IP주소가 자주 변경된다는 점이 있는데, 이러한 상황에서 내/외부 통신을 용이하게 하기 위한 용도로 등장한 개념이 Service이다.

Service의 역할

Kubernetes Service는 특정 Pod의 집합을 하나의 네트워크 엔드포인트로 묶어주는 역할을 한다.
즉 고정된 IP 주소를 제공하여 Pod이 벼경되더라도 안정적인 네트워크 접근이 가능하도록 만든다.

Service의 종류

Kubernetes에는 3가지의 주요한 Service 타입이 존재한다.
yaml 파일 정의의 selector 필드는 어떤 application과 서비스를 연결할지를 지정하는 필드로, 세 서비스에 공통으로 존재한다.

ClusterIP

Kubernetes 내부에서만 통신 가능한 서비스로, 외부에서 접근할 수 없으며 Pod간 통신을 위한 서비스이다.

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP  # 기본값

위와 같은 Service가 있는 경우 Kubernetes cluster 내부에서 http://backend-service:80으로 연결이 가능하다

ClusterIP는 cluster 내부에서 Pod간의 통신을 관리하는 기본적인 서비스 유형으로 Pod의 IP 주소가 변경되더라도 자동으로 트래픽을 올바른 Pod으로 전달한다.
로드밸런싱을 지원하며, 여러 Pod 사이에서 요청을 분산 처리한다.

내부에서의 통신만을 지원하는 서비스가 왜 별개로 존재하는지에 대한 의아함이 있을 수 있다.
보통 풀스택 웹 어플리케이션은 여러 개의 서비스로 구성된다.

예를 들어 Frontend, Backend, Redis, MySQL과 같이 여러개의 서비스들로 구성된 어플리케이션이 있을 수 있고, 이러한 상황에서 여러 Pod은 서로 통신하며 동작해야한다. Kubernetes의 Pod의 IP 주소는 고정되지 않고 동적으로 변경되므로 IP를 사용한 직접적인 통신은 불가능하다.
이러한 문제를 해결하기 위해 ClusterIP를 사용하며 고정된 IP주소와 DNS 이름을 통해 어떤 Pod이 생성되거나 삭제되더라도 안정적으로 통신할 수 있다.

NodePort

외부에서 노드의 특정 포트를 통해 Pod에 접근이 가능하도록하는 서비스타입이다.

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30008  # (범위: 30000~32767)

노드의 IP + 포트를 사용해서 외부에서 접근할 수 있다.

각 필드의 의미는 다음과 같다.

  • targetPort: Pod 내부에서 어플리케이션이 실행되는 포트
  • port: service가 클라스터 내부에서 사용하는 포트
  • nodePort: 클러스터 외부에서 접근할 수 있는 포트

LoadBalancer

외부 클라우드 환경(AWS, GCP, Azure)에서 Load Balancer를 자동으로 생성한다.

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

LoadBalancer Service를 사용하면 외부 사용자가 단일 URL을 사용하여 어플리케이션에 접근할 수 있게 만들 수 있다.

NodePort와 LoadBalancer의 차이

서비스 타입 설명 외부 접근 방식
NodePort 클러스터의 모든 노드에 포트를 개방하여 외부 접근을 허용 http://<노드IP>:
LoadBalancer 클라우드 제공자의 로드밸런서를 생성하여 외부 트래픽을 관리 http://example.com

LoadBalancer Service의 동작 방식은 다음과 같다.

 

1. 사용자가 http://example.com 으로 요청을 보낸다

2. 클라우드 제공자의 LoadBalancer가 트래픽을 Kubernetes LoadBalancer로 전달한다.

3. LoadBalancer Service가 내부적으로 NodePort를 사용하여 적절한 Pod에 트래픽을 분배한다.

4. Pod이 응답을 반환한다.

'CKA' 카테고리의 다른 글

(TIL) Kubernetes의 imperative, declarative  (0) 2025.03.22
(TIL) Kubernetes namespace  (0) 2025.03.22
(TIL) Kubernetes Deployment  (0) 2025.03.16
(TIL) Replicaset  (0) 2025.03.15
(TIL) Kubernetes의 Pod  (0) 2025.03.13
    'CKA' 카테고리의 다른 글
    • (TIL) Kubernetes의 imperative, declarative
    • (TIL) Kubernetes namespace
    • (TIL) Kubernetes Deployment
    • (TIL) Replicaset
    심플코더
    심플코더

    티스토리툴바