Kubernetes

서비스 API 카테고리(LoadBalancer)

jih0ssang 2024. 2. 8. 18:01

서비스 API 카테고리

컨테이너를 외부에 공개하는 엔드포인트를 제공하는 리소스

- 서비스

   - ClusterIP

 - ExternalIP  (ClusterIP의 한 종류)

   - NodePort

   - LoadBalancer

   - Headless (None)

   - ExternalName

   - None-Selector

- 인그레스

 

 

LoadBalancer

쿠버네티스 클러스터 외부의 로드밸런서에 외부 통신이 가능한 가상 IP를 할당할 수 있다.

GCP/AWS/Azure/OpenStack을 비롯한 클라우드 프로바이더가 LoadBalancer 서비스를 사용할 수 있는 환경을 제공하고 있다.

 

NodePort나 ExternalIP는 하나의 쿠버네티스 노드에 할당된 IP주소로 통신하기 때문에 그 노드가 단일 장애점(SPoF)가 되어버린다.

그러나 type: LoadBalacner에서는 노드 장애가 발생해도 크게 문제가 되지 않는다.

구조는 NodePort 서비스를 생성하고 쿠버네티스 외부의 로드밸런서에서 쿠버네티스 노드로 밸런싱하는 형태이다.

 

쿠버네티스 외부 로드밸런서 → 노드 로드밸런서(NodePort) → 파드 로드밸런서(ClusterIP, port) → 컨테이너 (targetPort)

# xx.xx.xxx.xxx는 GCE 인스턴스 IP주소가 아닌 GCLB(Google Cloud LB)에 할당된 가상 IP
$ curl -s http://xx.xx.xxx.xxx:8080
Host= xx.xx.xxx.xxx  Path=/  From=sample-deployment-7c67d
ClientIP=10.178.0.62  XFF=

# 여러 번 실행하면 비슷한 빈도로 세 개의 파드명이 표시된다.
Host= xx.xx.xxx.xxx  Path=/  From=sample-deployment-btkfh
ClientIP=10.178.0.61  XFF=

Host= xx.xx.xxx.xxx  Path=/  From=sample-deployment-x4xf97
ClientIP=10.178.0.61  XFF=

할당된 가상 IP는 쿠버네티스 노드에 분산되기 때문에 쿠버네티스 노드를 스케일링할 때 변경하지 않아도 된다.

type: LoadBalancer도 다음과 같이 당연히 쿠버네티스 클러스터 외부에서 글로벌 IP 주소를 통해 통신이 가능하다.

 

로드 밸런서에 할당되는 가상 IP 정적 지정

실제 서비스 운영 환경에서는 외부로부터 요청을 수신하는 IP 주소에 대해 DNS 설정 등의 이유로 고정 IP를 사용하려는 경우가 많다. 

 

옵션 loadBalancerIP

apiVersion: v1
kind: Service
metadata:
  name: sample-lb-fixip
spec:
  type: LoadBalancer
  loadBalancerIP: xxx.xxx.xxx.xxx
  ports:
  - name: "http-port"
    protocol: "TCP"
    port: 8080
    targetPort: 80
  selector:
    app: sample-app

 

spec.loadBalancerIP로 외부 LoadBalancer에서 사용하는 IP 주소를 지정할 수 있다.

loadBalancerIP로 지정하지 않을 경우 자동으로 할당된다.

 

GKE의 경우 사용자가 임의로 가상 IP를 사용할 수 없도록 설계되어 있으므로 소유하지 않은 IP 주소를 지정한 경우 <pending> 상태가 되어버린다.

 

로드밸런서 방화벽 정책 설정

LoadBalancer 서비스를 생성하면 기본적으로 전 세계(글로벌)로 공개된다.

GKE와 아마존 EKS에서는 LoadBalancer 서비스의 spec.loadBalancerSourceRanges에 접속을 허가하는 발신 측 네트워크를 지정하면 클러스터 밖의 외부의 로드 밸런서에 클라우드 프로바이더가 제공하는 방화벽 기능을 사용하여 접속 제한을 설정할 수 있다. 지정하지 않을 경우, 기본값으로 0.0.0.0/0이 지정되어 전세계에 공개된다.

 

apiVersion: v1
kind: Service
metadata:
  name: sample-lb-fw
spec:
  type: LoadBalancer
  loadBalancerIP: xxx.xxx.xxx.xxx
  ports:
  - name: "http-port"
    protocol: "TCP"
    port: 80
    targetPort: 80
  selector:
    labelis: labels
  loadBalancerSourceRanges:
  - 10.0.0.0/8