Question

EKS에서 로드밸런서를 배포하면 CLB로 생성이 되는데, NLB로 생성 하는 방법 문의드립니다.


Answer

EKS에서 Network Load Balancer(NLB) 타입의 Service를 생성하고 고정 IP를 연동하는 방법에 대해 안내드리겠습니다. 


"LoadBalancer" 타입의 Service를 생성하게 되면 기본적으로 Kubernetes in-tree service controller에 의해 CLB가 provisioning 됩니다. 


이 때, Service를 정의하는 단계에서 annotation을 지정하면 NLB가 provisioning 되도록 설정할 수 있습니다. 




Service에서 NLB에 EIP를 할당하는 방법은 다음과 같습니다. 



  1. 사전 준비 사항


1) NLB가 사용할 수 있도록 EIP(Elastic IP)를 준비합니다. [5]

2) NLB 타입의 Service manifest 파일을 생성합니다. 



  1. 예시 파일 


apiVersion: v1 
kind: Service 
metadata:   
  name: sample-service   
  namespace: ns-sample   
  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
    service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxxxx     
    service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xxxxxx
spec:   
  type: LoadBalancer   
  selector:     
    app: sample   
  ports:   
    - protocol: TCP     
      port: 80


annotations의 aws-load-balancer의 type, nlb-target-type, scheme을 위 예시 파일과 같이 설정하면 NLB 생성 가능합니다

위와 같이 subnet-aaaaaa에 EIP를 할당하여 해당 EIP(eipalloc-xxxxxx에 할당된 public IP)를 통해 Service에 접근하실 수 있습니다.



  1.  유의 사항


NLB에 지정하는 EIP와 Subnet의 수는 같아야 하며, 1쌍의 Subnet과 EIP만 지정할 수도 있습니다.


이렇게 EIP를 통해 Service를 연동하는 경우 해당 Service를 삭제 후 재생성 시에도 동일한 IP를 계속 이용하실 수 있다는 장점이 있습니다.



  1. 기타


각 annotation에 대한 자세한 설명은 문서 [6], [7]에서 확인하실 수 있습니다.

  • service.beta.kubernetes.io/aws-load-balancer-subnets 

  • service.beta.kubernetes.io/aws-load-balancer-eip-allocations 



*AWS Load Balancer Controller 설치 


Kubernetes in-tree service controller에서도 NLB의 EIP와 Subnet설정에 대한 annotation을 지원하기 때문에 'AWS Load Balancer Controller'의 이용이 필수는 아니므로 이 단계를 생략하실 수 있습니다.


하지만 추후 ALB Ingress 이용 및 NLB의 다양한 기능을 유연하게 이용하시려면 다음 문서 [2]를 참고하여 'AWS Load Balancer Controller'를 설치하시기 바랍니다.


'AWS Load Balancer Controller'를 통해 NLB를 설정하는 방법에 대한 자세한 내용은 문서 [3], [4]를 통해서 확인하시기 바랍니다.



============

References

[1] https://aws.amazon.com/premiumsupport/knowledge-center/elb-attach-elastic-ip-to-public-nlb 

[2] https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html 

[3] https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/#service-annotations 

[4] https://docs.aws.amazon.com/eks/latest/userguide/network-load-balancing.html 

[5] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-allocating 

[6] https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/#subnets 

[7] https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/#eip-allocations