Post

[Kubernetes] 서비스(Service)

Kubernetes 네트워킹을 위한 Service

Kubernetes에서 Service는 Pod 간의 통신을 가능하게 하며, 클러스터 내부 또는 외부로 트래픽을 라우팅하는 중요한 역할을 합니다. 이번 포스팅에서는 Kubernetes 네트워크의 기본 단위인 Service에 대해 자세히 살펴보고, 각 Service의 종류와 설정 방법, 실습 예시를 제공하겠습니다.

1. Kubernetes Service란 무엇인가?

Service는 클러스터 내의 여러 Pod에 대한 네트워크 접속을 안정적으로 관리하는 추상적인 네트워크 객체입니다. Pod는 일반적으로 IP 주소를 가지지만, Pod가 삭제되거나 재생성될 경우 IP 주소가 변경될 수 있기 때문에 직접적으로 Pod의 IP를 참조하기 어렵습니다. 이를 해결하기 위해 Service는 고정된 IP 주소와 DNS 이름을 통해 Pod 간의 통신을 보장합니다.

1.1 Service가 필요한 이유

Pod의 IP 주소는 변경될 수 있기 때문에, 서비스 간 통신이 필요한 애플리케이션에서는 동적으로 변경되는 Pod IP 주소 대신 Service를 사용하여 통신을 설정할 수 있습니다. 이를 통해 애플리케이션의 안정적인 네트워크 구성이 가능합니다.

1.2 Service의 주요 기능

  • 부하 분산: 여러 Pod에 트래픽을 고르게 분산하여 처리 성능을 향상시킵니다.
  • 고정 IP 제공: Pod의 IP 주소가 변하더라도 고정된 IP 주소를 통해 통신할 수 있게 합니다.
  • 자동 DNS 등록: 서비스 이름을 통해 Pod에 접속할 수 있도록 Kubernetes는 자동으로 DNS 등록을 처리합니다.

2. Service 종류

Kubernetes에서 제공하는 주요 Service 유형에는 ClusterIP, NodePort, LoadBalancer, ExternalName이 있습니다. 각 유형에 대해 자세히 살펴보겠습니다.

2.1 ClusterIP

ClusterIP는 클러스터 내부에서만 접근 가능한 IP 주소를 제공합니다. 외부에서는 접근할 수 없으며, 클러스터 내부의 Pod 간 통신에 사용됩니다. 기본적으로 생성되는 Service 타입입니다.

ClusterIP 예시

1
2
3
4
5
6
7
8
9
10
11
12
yaml
apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80       # Service 포트
      targetPort: 8080 # Pod 내부 컨테이너 포트
  type: ClusterIP

이 Service는 클러스터 내에서 myapp 라벨을 가진 Pod에 대해 80번 포트로 트래픽을 라우팅합니다.

2.2 NodePort

NodePort는 클러스터 외부에서 노드의 IP 주소와 특정 포트를 통해 서비스를 접근할 수 있게 합니다. ClusterIP 기능을 포함하며, 클러스터 외부에서 노드의 IP 주소를 사용하여 서비스에 접근할 수 있습니다.

NodePort 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80         # Service 포트
      targetPort: 8080 # Pod 포트
      nodePort: 30000  # 외부에서 접근할 NodePort
  type: NodePort

NodePort는 각 노드의 30000번 포트에서 서비스를 노출하며, 외부에서 접근이 가능합니다.

2.3 LoadBalancer

LoadBalancer는 클라우드 환경에서 사용할 수 있으며, 클러스터 외부의 트래픽을 로드 밸런싱하여 클러스터 내부의 여러 노드와 Pod에 분산합니다. 클라우드 환경에서 자동으로 외부 IP가 할당됩니다.

LoadBalancer 예시

1
2
3
4
5
6
7
8
9
10
11
12
yaml
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80         # Service 포트
      targetPort: 8080 # Pod 포트
  type: LoadBalancer

이 설정은 클라우드 환경에서 외부 IP 주소를 통해 서비스를 제공하며, 여러 노드와 Pod에 트래픽을 분산합니다.

3. 실습: ClusterIP, NodePort, LoadBalancer Service 설정

Kubernetes에서 Service를 설정하고 사용하는 방법을 실습해 보겠습니다.

3.1 ClusterIP 설정 및 사용

다음은 ClusterIP로 설정된 서비스와 관련된 Pod와 Service를 생성하는 예시입니다.

1
2
3
4
5
# Pod 생성
kubectl run mypod --image=nginx --port=80

# ClusterIP 서비스 생성
kubectl expose pod mypod --name=mypod-svc --type=ClusterIP --port=80

ClusterIP는 클러스터 내부에서만 접근할 수 있으며, 다음과 같은 명령어로 확인할 수 있습니다.

1
2
# 서비스 정보 확인
kubectl get svc mypod-svc

3.2 NodePort 설정 및 사용

NodePort를 통해 외부에서 서비스를 접근할 수 있습니다.

1
2
# NodePort 서비스 생성
kubectl expose pod mypod --name=mypod-svc-nodeport --type=NodePort --port=80 --target-port=80 --node-port=30001

NodePort로 설정한 후에는 클러스터 외부에서 노드 IP와 30001번 포트를 사용해 접근할 수 있습니다.

1
2
# 외부에서 서비스 확인
curl <노드 IP>:30001

3.3 LoadBalancer 설정 및 사용

클라우드 환경에서는 LoadBalancer 서비스를 사용할 수 있습니다. LoadBalancer는 클라우드에서 외부 IP를 자동으로 할당받아 외부 트래픽을 처리합니다.

1
2
# LoadBalancer 서비스 생성
kubectl expose pod mypod --name=mypod-svc-lb --type=LoadBalancer --port=80 --target-port=80

이 명령어를 실행하면 외부 IP가 할당되며, 클라우드 환경에서 접근이 가능합니다.

1
2
# 서비스 정보 확인
kubectl get svc mypod-svc-lb

4. Service의 동작 방식

Kubernetes에서 Service는 내부적으로 kube-proxy를 사용하여 Pod와 연결을 관리합니다. kube-proxy는 iptables나 IPVS를 통해 트래픽을 적절한 Pod로 라우팅합니다. 각 Service는 클러스터 내부에서 고유한 ClusterIP를 할당받으며, 이 ClusterIP를 통해 여러 Pod에 분산된 트래픽을 전달할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.