쿠버네티스(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로 생성됨.
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
로 접근 가능.
접근 방법: http://<NodeIP>:30007
3) LoadBalancer
-
클라우드 환경(AWS, GCP, Azure 등)에서 외부 로드 밸런서를 자동으로 생성하는 서비스.
- 외부에서 접근 가능한 퍼블릭 IP를 자동으로 할당받음.
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 이름을 반환함.
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에 자동 등록하여, 서비스 이름으로 접근 가능.
2) 로드 밸런싱
- 서비스는 여러 개의 Pod에 트래픽을 자동으로 분산할 수 있음.
- 내부적으로
kube-proxy
가 iptables 또는 IPVS를 사용하여 트래픽을 분배.
4. 서비스와 셀렉터(Selector)
서비스는 특정 Pod들을 대상으로 트래픽을 전달하기 위해 label selector 를 사용합니다.
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 객체를 생성합니다.
만약 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를 활용하면 도메인 기반의 고급 트래픽 관리를 할 수 있습니다.
어떤 유형의 서비스를 사용할지 결정하는 것은 애플리케이션의 특성과 네트워크 구조 에 따라 다릅니다. 🚀