AWS 로드 밸런서 컨트롤러로부터 생성/관리 되는 로드 밸런서: NLB / ALB
NLB(Network Load Balancing)
- 네트워크 트래픽을 OSI 모델의 L4 에서 로드 밸런싱
- k8s 에서 LoadBalancer 타입의 Service 생성시 프로비저닝됨
- 초당 수백만 개의 요청 처리 가능
- 고정 IP 등록 가능
- IP / Port 지정으로 타겟그룹 등록 가능
ALB(Application Load Balancing)
- 어플리케이션 트래픽을 OSI 모델의 L7 에서 로드 밸런싱
- k8s 에서 ingress 리소스 생성시 프로비저닝됨
- 여러 도메인, 호스트, 경로 기반의 라우팅 가능
- 한 URL에서 다른 URL로 요청을 리디렉션 가능
NLB / ALB 서브넷 설정
- 방법1. Service 구성시 서브넷 ID 명시
- 방법2. private/public 서브넷에 태그 설정
- public : kubernetes.io/cluster/cluster-name : shared, kubernetes.io/role/elb : 1
- private : kubernetes.io/cluster/cluster-name : shared, kubernetes.io/role/internal-elb : 1
NLB 구동 테스트
NLB 를 사용할 계획은 아니지만 샘플이 간단해서 기록해 본다. NLB 를 통해 nginx 의 첫화면을 확인하는 샘플. 어플리케이션 정상 배포 확인하고, NLB 정상 구동 확인하고, 브라우저에서 nginx 확인하고...
1. Sample namespace
$ kubectl create namespace nlb-sample-app
& 해당 namespace 로 fargate 프로파일도 작성
2. nginx 어플리케이션 배포
$ vi sample-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nlb-sample-app
namespace: nlb-sample-app
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: public.ecr.aws/nginx/nginx:1.21
ports:
- name: tcp
containerPort: 80
$ kubectl apply -f sample-deployment.yaml
Deployment/nlb-sample-app created
3. NLB 생성
로드밸런서의 타입인 Instance 와 IP 중 Fargate 는 IP 타겟만 지정 가능하다. Instance 는 node 로, IP 는 pod 로 라우팅된다. 아래 스크립트는 선택기가 app=nginx 인 pod 로 라우팅하는 NLB 를 생성한다.
$ vi sample-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nlb-sample-service
namespace: nlb-sample-app
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
$ kubectl apply -f sample-service.yaml
Service/nlb-sample-service created
4. 서비스 확인
$ kubectl get svc nlb-sample-service -n nlb-sample-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service LoadBalancer 10.100.240.137 k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com 80:32400/TCP 16h
여기까지 진행하였으면, AWS 관리콘솔에서 [로드밸런서] 와 [대상 그룹] 이 정상적으로 구동되었는지 확인한다.
- 로드밸런서 : DNS 이름 / network 유형 / internet-facing 체계
- 대상그룹 : 80 port / TCP protocal / IP target / Health status
5. 결과 확인
상단 EXTERNAL-IP 의 DNS 주소로 curl 이나 browser 를 사용하여 nginx 첫 페이지를 확인한다.
$ curl k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com
* NLB 에서 80 port 접속시 container 의 8080 port 로 라우팅 하려면...
- Service port:80, targetPort: 8080
- Deployment containerPort: 8080
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.
,