AWS Load balancer controller 통신 포트 확인하기
IT/AWS

AWS Load balancer controller 통신 포트 확인하기

반응형

Intro

AWS Load balancer controller를 구축하면 쿠버네티스 클러스터의 pod형태로 설치되며 AWS ALB의 target group 설정을 컨트롤 합니다.
AWS Load balancer controller가 ALB의 target group 설정을 컨트롤할때 어떤 port로 통신할까요? 오늘 해당 포트를 확인해보도록 하겠습니다.

본 포스팅은 상당 부분 생략된 부분이 많으므로 문의사항 댓글 주시면 최대한 답변드리겠습니다

테스트 환경

  • aws eks cluster on public network(최소한의 보안그룹 정책 사용)
  • aws load balancer controller 를 구성
  • 테스트할 pod, svc, ingress 생성 (aws에서 제공하는 game-2048 예제 사용)

테스트할 내용

Load balancer controller 통신제어를 worker Node의 security group으로 하기위해서 몇번 포트가 필요한지

Ingress Controller 구조

테스트

테스트 1 (정상동작 확인을 위한 테스트)

Worker Node1의 securtiy group에서 outbound가 443 any로 열려 있는 상태에서 ingress뒤에 있는 svc의 nodeport를 3001으로 변경

결과

ALB targetGroup에서 Registered Target instance 들이 3001 포트로 등록이 되며 기존 31784포트의 타겟들은 dranning됨

aws-balancer-controller pod logs

target을 등록(registering) 하고 제외(deRegistered)하는 로그를 확인할 수 있음

{"level":"info","ts":1632468654.1026535,"msg":"registering targets","arn":"arn:aws:elasticloadbalancing:ap-northeast-2:058475846659:targetgroup/k8s-game2048-service2-1ab1de1537/5ffbad8cbf8476c9","targets":[{"AvailabilityZone":null,"Id":"i-0081f11b54160115c","Port":30001},{"AvailabilityZone":null,"Id":"i-011efd5e7cfc96cb0","Port":30001},{"AvailabilityZone":null,"Id":"i-0180637a0f57e2df6","Port":30001},{"AvailabilityZone":null,"Id":"i-06a3da9f92cd54323","Port":30001},{"AvailabilityZone":null,"Id":"i-0805c2737902f5a40","Port":30001},{"AvailabilityZone":null,"Id":"i-0e9a611024cc53d36","Port":30001}]}
{"level":"info","ts":1632468654.2642539,"msg":"registered targets","arn":"arn:aws:elasticloadbalancing:ap-northeast-2:058475846659:targetgroup/k8s-game2048-service2-1ab1de1537/5ffbad8cbf8476c9"}
{"level":"info","ts":1632468654.3031719,"msg":"deRegistering targets","arn":"arn:aws:elasticloadbalancing:ap-northeast-2:058475846659:targetgroup/k8s-game2048-service2-1ab1de1537/5ffbad8cbf8476c9","targets":[{"AvailabilityZone":null,"Id":"i-0081f11b54160115c","Port":30001},{"AvailabilityZone":null,"Id":"i-011efd5e7cfc96cb0","Port":30001},{"AvailabilityZone":null,"Id":"i-0180637a0f57e2df6","Port":30001},{"AvailabilityZone":null,"Id":"i-06a3da9f92cd54323","Port":30001},{"AvailabilityZone":null,"Id":"i-0805c2737902f5a40","Port":30001},{"AvailabilityZone":null,"Id":"i-0e9a611024cc53d36","Port":30001}]}
{"level":"info","ts":1632468654.3332257,"msg":"deRegistered targets","arn":"arn:aws:elasticloadbalancing:ap-northeast-2:058475846659:targetgroup/k8s-game2048-service2-1ab1de1537/5ffbad8cbf8476c9"}

테스트 2 (비정상 동작 확인을 위한 테스트)

Worker Node1의 security group에서 outbound를 모두 제외한 상태에서 ingress뒤에 있는 svc의 nodeport를 3004으로 변경

결과

aws-balancer-controller pod에서 https://ec2.ap-northeast-2.amazonaws.com 와 통신하는데 timeout이 발생함

aws-balancer-controller pod logs

{"level":"error","ts":1632469120.3463004,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"RequestError: send request failed\ncaused by: Post \"[https://ec2.ap-northeast-2.amazonaws.com/\\](https://ec2.ap-northeast-2.amazonaws.com/%5C%5C)": dial tcp: i/o timeout"}

결론

aws load balancer controller는 k8s api-server와 통신할때 TCP 443으로 통신하고 여기서 k8s api-server는 EKS endpoint를 말한다. 즉 aws load balancer controller 가 떠있는 worker node에서 EKS endpoint로 443 통신이 가능해야한다. 이는 EKS Cluster Network가 Public이라면 443 any open이 필수적이고 Private이라면 내부 EKS ENI를 통해 통신하도록 설정해야한다. (이부분은 그림으로 유추 함. 실제 테스트 해보기위해 private network eks구성 필요)

또한, aws load balancer controller 는 https://ec2.ap-northeast-2.amazonaws.com/ 으로도 통신을하므로 EKS Cluster Network가 Public이라면 443 any open이 필수적이고 Private이라면 VPC endpoint를 생성하여 통신하도록 설정해야한다.

반응형