Kubernetes는 애플리케이션을 컨테이너화하고 관리하는 강력한 도구입니다. 그 중에서도 Service는 클러스터 내의 애플리케이션을 네트워킹하는 데 중요한 역할을 합니다. Kubernetes 서비스는 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 유형이 있습니다. 이번 글에서는 Kubernetes Service의 한 종류인 Loadbalancer에 대해 자세히 알아보겠습니다.
LoadBalancer란?
LoadBalancer 타입은 퍼블릭 클라우드 환경에서 사용할 수 있으며, 클라우드 환경의 로드 밸런서를 생성하여 외부 트래픽을 Kubernetes 클러스터 내부의 서비스로 라우팅하는 데 사용됩니다. 이러한 로드 밸런서는 클러스터 외부에서 접근할 수 있는 IP 주소와 포트를 제공하여 외부 트래픽을 내부 서비스로 효율적으로 분배합니다. 로드 밸런서는 비동기적으로 생성되며, 완료되기까지 시간이 걸릴 수 있습니다. 로드 밸런서가 성공적으로 프로비저닝되면, 해당 로드 밸런서에 대한 정보는 Kubernetes 서비스 객체의 .status.loadBalancer 필드에 저장됩니다.
주요 특징
- LoadBalancer 타입의 서비스는 퍼블릭 클라우드 환경에서만 사용가능하며, Network Load Balancer를 생성합니다. AWS의 경우 ELB (Elastic Load Balancer), GCP의 경우 GCLB (Google Cloud Load Balancer)를 생성합니다.
- Annotation으로 Network Load Balancer 설정을 제공합니다.
LoadBalancer 서비스 생성하기
LoadBalancer 서비스를 생성하는 방법은 매우 간단합니다. 아래는 Nginx 애플리케이션을 대상으로 LoadBalancer 서비스를 생성하는 예제입니다.
Deployment 정의
먼저 Nginx Pod를 배포하는 Deployment를 정의합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Service 정의
LoadBalancer 서비스를 정의하려면 type을 LoadBalancer로 지정해야 합니다.
Load balancer
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
Internal load balancer
annotation
을 사용하여 VPC 내부에서 private 통신이 가능한 Internal Load Balancer를 설정할 수 있습니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
위의 정의 파일을 통해 nginx-service라는 이름의 LoadBalancer 서비스를 생성할 수 있습니다. 이 서비스는 로드 밸런서를 통해 app.kubernetes.io/name: nginx
레이블을 가진 모든 Pod의 80번 포트로 트래픽을 전달합니다.
kubectl
명령어로 조회하면 nodePort가 할당되어 있고, EXTERNAL-IP
에서 로드 밸런서 도메인을 확인할 수 있습니다. LoadBalancer 타입의 서비스 생성시 nodePort(31003)가 자동으로 매핑됩니다. nodePort가 매핑되는걸 방지하려면 spec.allocateLoadBalancerNodePorts
값을 false
로 설정하면 됩니다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service LoadBalancer 10.100.23.10 2d23lp02a22d35jhcs2s22de3fd35eee-b3s33dsf123dsf12.elb.ap-northeast-2.amazonaws.com 80:31003/TCP 1d
결론
LoadBalancer 타입의 서비스는 퍼블릭 클라우드 환경에서 Kubernetes 클러스터 외부에서 들어오는 트래픽을 처리하는 효율적인 방법입니다. Service는 OSI 7계층 중 4계층(Layer 4)에서 통신을 처리되므로 LoadBalancer 타입의 서비스는 Network Load Balancer만 지원합니다.