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
ALB 구동 테스트
ALB 생성 역시 NLB 와 흡사하지만 ingress 리소스를 생성해야 하고, NodePort 나 LoadBalancer 타입의 Service 를 생성하는 것이 다르다. 마찬가지로 nginx 의 첫화면을 확인하는 샘플. 어플리케이션 배포는 NLB 테스트에 사용한 것과 동일, ALB / NodePort 정상 구동 확인하고, 브라우저에서 nginx 확인하고...
1. Sample namespace
$ kubectl create namespace alb-sample-app
& 해당 namespace 로 fargate 프로파일도 작성
2. nginx Application, NLB 생성
로드밸런서의 타입인 Instance 와 IP 중 Fargate 는 IP 타겟만 지정 가능하다. Instance 는 node 로, IP 는 pod 로 라우팅된다. 아래 스크립트는 선택기가 app=nginx 인 pod 로 라우팅하는 ALB 를 생성한다.
$ vi sample-alb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
namespace: alb-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
---
apiVersion: v1
kind: Service
metadata:
namespace: alb-sample-app
name: sample-service-nodeport
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: alb-sample-app
name: sample-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample-service-nodeport
port:
number: 80
$ kubectl apply -f sample.yaml
Deployment/sample-app created
Service/sample-service-nodeport created
Ingress/sample-ingress created
3. 서비스 확인
$ kubectl get svc sample-service-nodeport -n alb-sample-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service-nodeport NodePort 172.20.23.108 <none> 80:31517/TCP 4s
$ kubectl get ingress sample-ingress -n alb-sample-app
NAME CLASS HOSTS ADDRESS PORTS AGE
sample-ingress <none> * k8s-samplein-1234d81632-1363801234.ap-northeast-2.elb.amazonaws.com 80 3h43m
여기까지 진행하였으면, AWS 관리콘솔에서 [로드밸런서] 와 [대상 그룹] 이 정상적으로 구동되었는지 확인한다.
- 로드밸런서 : DNS 이름 / application 유형 / internet-facing 체계
- 대상그룹 : 80 port / HTTP protocal / IP target / Health status
4. 결과 확인
상단 ingress DNS 주소로 curl 이나 browser 를 사용하여 nginx 첫 페이지를 확인한다.
$ curl k8s-samplein-1234d81632-1363801234.ap-northeast-2.elb.amazonaws.com
* ALB 에서 80 port 접속시 container 의 8080 port 로 라우팅 하려면...
- Ingress Service port: 80
- Service port:80, targetPort: 8080
- Deployment containerPort: 8080
* NodePort 가 아닌 LoadBalancer(NLB) 서비스를 사용할 경우, 내부 트래픽만 가능하도록 기존 NLB 생성했던 내용에서 internet-facing 만 삭제. (default: internal)
$ 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
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.