Kubernetes

쿠버네티스(Kubernetes) 서비스

🤖 쿠버네티스(Kubernetes) 서비스 개요

쿠버네티스(Kubernetes, K8s)에서 서비스(Service) 는 클러스터 내에서 실행 중인 Pod(파드)들 간의 네트워크 접근을 관리하는 핵심적인 리소스입니다. Pod는 동적으로 생성되고 제거될 수 있기 때문에, 각 Pod의 IP 주소가 변할 수 있습니다. 서비스는 이러한 Pod의 변동성을 해결하고, 안정적인 네트워크 엔드포인트를 제공하여 클러스터 내에서 원활한 통신이 가능하도록 합니다.


1. 서비스가 필요한 이유

(1) Pod의 IP 주소는 변동 가능

    • Pod는 죽거나 새로 배포될 수 있으며, 이때마다 새로운 IP 주소가 할당됨.
    • Pod 간 직접적인 통신 시, 동적으로 변하는 IP를 추적하는 것이 어려움.

(2) 로드 밸런싱 제공

    • 동일한 기능을 수행하는 여러 개의 Pod가 있을 때, 서비스는 요청을 적절히 분배(로드 밸런싱)하여 트래픽을 균등하게 분산.

(3) 내부 및 외부 접근 제어

    • 특정 서비스만 클러스터 내부에서 접근 가능하게 하거나, 외부에서 접근할 수 있도록 설정 가능.

2. 쿠버네티스 서비스의 유형

쿠버네티스의 서비스는 크게 네 가지 유형으로 나뉩니다.

1) ClusterIP (기본값)

  • 클러스터 내부에서만 접근 가능한 내부 전용 서비스.
  • 외부에서는 직접 접근할 수 없음.
  • 기본적으로 kubectl expose 명령을 사용하면 ClusterIP로 생성됨.
yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # 서비스가 노출하는 포트
targetPort: 8080 # Pod의 컨테이너가 사용하는 포트

접근 방법: my-service라는 DNS 이름을 통해 클러스터 내부에서만 접근 가능.


2) NodePort

  • 클러스터 외부에서 접근 가능하도록, 클러스터 내 모든 노드의 특정 포트를 개방하는 서비스.

  • 30000~32767 범위 내에서 포트를 지정 가능.

  • 클러스터 외부에서 NodeIP:NodePort로 접근 가능.
yaml
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007

접근 방법: http://<NodeIP>:30007


3) LoadBalancer

  • 클라우드 환경(AWS, GCP, Azure 등)에서 외부 로드 밸런서를 자동으로 생성하는 서비스.

  • 외부에서 접근 가능한 퍼블릭 IP를 자동으로 할당받음.
yaml
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
접근 방법:
  • 클라우드 제공자가 할당한 퍼블릭 IP 주소 또는 DNS를 통해 접근.
  • ex) http://<External Load Balancer IP>:80

4) ExternalName

  • 외부 서비스를 클러스터 내부에서 DNS 이름을 통해 접근할 수 있도록 하는 서비스.

  • IP 주소가 아니라 DNS 이름을 반환함.
yaml
apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
type: ExternalName
externalName: example.com

접근 방법: my-external-service를 호출하면 example.com으로 요청이 전달됨.


3. 서비스 디스커버리와 로드 밸런싱

쿠버네티스에서 서비스는 서비스 디스커버리(자동 검색) 와 로드 밸런싱 역할을 수행합니다.

1) 서비스 디스커버리

쿠버네티스에서는 2가지 방식으로 서비스 디스커버리를 지원합니다.

  • 환경 변수 방식: 서비스가 생성되면, 해당 서비스의 정보가 자동으로 환경 변수로 추가됨.

  • DNS 방식(권장): kube-dns 또는 CoreDNS가 서비스 이름을 클러스터 DNS에 자동 등록하여, 서비스 이름으로 접근 가능.
nginx
curl http://my-service

2) 로드 밸런싱

  • 서비스는 여러 개의 Pod에 트래픽을 자동으로 분산할 수 있음.
  • 내부적으로 kube-proxy가 iptables 또는 IPVS를 사용하여 트래픽을 분배.

4. 서비스와 셀렉터(Selector)

서비스는 특정 Pod들을 대상으로 트래픽을 전달하기 위해 label selector 를 사용합니다.

yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
  • selector 에서 app: my-app 이라는 라벨이 붙은 Pod들에게 트래픽을 전달함.
  • 만약 selector를 사용하지 않으면, 수동으로 엔드포인트(Endpoints) 를 지정해야 함.

5. 서비스와 엔드포인트(Endpoints)

서비스가 Pod에 요청을 전달할 때, 실제로는 Endpoints 라는 리소스를 통해 Pod의 IP 주소 목록을 관리합니다.

1) 자동 엔드포인트 생성

서비스가 selector를 사용하면, 쿠버네티스가 자동으로 해당 Pod의 IP를 관리하는 Endpoints 객체를 생성합니다.

yaml
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 192.168.1.10
- ip: 192.168.1.11
ports:
- port: 8080
2) 수동 엔드포인트 설정

만약 selector 없이 특정 IP를 지정하려면, Endpoints 리소스를 수동으로 생성해야 합니다.


6. 인그레스(Ingress)와 서비스의 차이

  • 서비스(Service): Pod 간 통신을 위한 내부 네트워크 엔드포인트 제공. (L4 Load Balancer)
  • 인그레스(Ingress): 도메인 기반의 HTTP(S) 트래픽을 관리하는 API 게이트웨이 역할. (L7 Load Balancer)

예시

  • NodePort 또는 LoadBalancer 서비스로 외부에 노출 가능하지만, Ingress를 사용하면 더 세밀한 라우팅 가능.

7. 마무리

쿠버네티스 서비스는 Pod 간 통신을 안정적으로 관리하고, 외부 트래픽을 클러스터 내부로 전달하는 중요한 역할을 합니다.

  • ClusterIP → 내부 서비스 (기본값)
  • NodePort → 외부 노드 IP와 포트를 통해 접근 가능
  • LoadBalancer → 클라우드 로드 밸런서와 연계하여 퍼블릭 IP 제공
  • ExternalName → 외부 도메인과 연계

추가적으로, Ingress를 활용하면 도메인 기반의 고급 트래픽 관리를 할 수 있습니다.
어떤 유형의 서비스를 사용할지 결정하는 것은 애플리케이션의 특성과 네트워크 구조 에 따라 다릅니다. 🚀

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!