Service Annotations으로 Network Load Balancers 구성하기
Service Annotations으로 Network Load Balancers 구성하기
Kubernetes 서비스 어노테이션으로 Amazon EKS에서 Network Load Balancer(NLB)를 구성하는 방법을 배우세요. 이 주제는 인터넷 접근성, 상태 검사, SSL/TLS 종료, IP 대상 모드를 포함한 NLB 동작을 커스터마이즈하기 위해 EKS Auto Mode가 지원하는 어노테이션을 설명합니다.
EKS Auto Mode에서 LoadBalancer 유형의 Kubernetes 서비스를 만들면 EKS가 지정한 어노테이션에 따라 AWS Network Load Balancer를 자동으로 프로비저닝·구성합니다. 이 선언적 접근 방식으로 Kubernetes 매니페스트를 통해 로드 밸런서 구성을 직접 관리하며, infrastructure as code 방식을 유지할 수 있어요.
EKS Auto Mode는 LoadBalancer 유형의 모든 서비스에 대해 기본적으로 Network Load Balancer 프로비저닝을 처리합니다. 추가 컨트롤러 설치나 구성이 필요하지 않습니다. loadBalancerClass: eks.amazonaws.com/nlb 사양이 클러스터 기본값으로 자동 설정되어 기존 Kubernetes 워크로드와의 호환성을 유지하면서 배포 과정을 간소화합니다.
Note: EKS Auto Mode는 공용·프라이빗 서브넷을 식별하려면 서브넷 태그가 필요합니다.
eksctl로 클러스터를 만들었다면 이미 이 태그가 있어요. Tag subnets for EKS Auto Mode 방법을 배워 보세요.
출처: 문서
본문
샘플 Service
Kubernetes Service 리소스에 대한 자세한 내용은 Kubernetes Documentation을 참고하세요. 아래 샘플 Service 리소스를 검토합니다.
apiVersion: v1
kind: Service
metadata:
name: echoserver
annotations:
# Specify the load balancer scheme as internet-facing to create a public-facing Network Load Balancer (NLB)
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
selector:
app: echoserver
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: LoadBalancer
# Specify the new load balancer class for NLB as part of EKS Auto Mode feature
# For clusters with Auto Mode enabled, this field can be omitted as it's the default
loadBalancerClass: eks.amazonaws.com/nlb
일반적으로 사용되는 어노테이션
다음 표는 Amazon EKS Auto Mode가 지원하는 어노테이션을 나열합니다. Amazon EKS Auto Mode는 AWS Load Balancer Controller에서 사용 가능한 모든 서비스 어노테이션을 지원하지는 않아요.
Tip: 다음 모든 어노테이션은
service.beta.kubernetes.io/접두사로 시작해야 합니다.
| 필드 | 설명 | 예시 |
|---|---|---|
aws-load-balancer-type |
로드 밸런서 유형을 지정합니다. 새 배포에는 external을 사용하세요. |
external |
aws-load-balancer-nlb-target-type |
트래픽을 노드 인스턴스로 보낼지 Pod IP로 직접 보낼지 지정합니다. 표준 배포에는 instance, 직접 Pod 라우팅에는 ip를 사용하세요. |
instance |
aws-load-balancer-scheme |
로드 밸런서가 내부인지 internet-facing인지 제어합니다. | internet-facing |
aws-load-balancer-healthcheck-protocol |
대상 그룹의 상태 검사 프로토콜. 일반 옵션은 TCP(기본) 또는 HTTP. |
HTTP |
aws-load-balancer-healthcheck-path |
HTTP/HTTPS 프로토콜 사용 시 상태 검사용 HTTP 경로. | /healthz |
aws-load-balancer-healthcheck-port |
상태 검사에 사용되는 포트. 특정 포트 번호 또는 traffic-port일 수 있음. |
traffic-port |
aws-load-balancer-subnets |
로드 밸런서를 만들 서브넷을 지정합니다. 서브넷 ID나 이름을 사용할 수 있음. | subnet-xxxx, subnet-yyyy |
aws-load-balancer-ssl-cert |
HTTPS/TLS용 AWS Certificate Manager의 SSL 인증서 ARN. | arn:aws:acm:region:account:certificate/cert-id |
aws-load-balancer-ssl-ports |
SSL/TLS를 사용해야 하는 포트를 지정합니다. | 443, 8443 |
load-balancer-source-ranges |
로드 밸런서에 접근할 수 있는 CIDR 범위. | 10.0.0.0/24, 192.168.1.0/24 |
aws-load-balancer-additional-resource-tags |
로드 밸런서와 관련 리소스에 적용할 추가 AWS 태그. | Environment=prod,Team=platform |
aws-load-balancer-ip-address-type |
로드 밸런서가 IPv4를 사용할지 dual-stack(IPv4 + IPv6)을 사용할지 지정합니다. | ipv4 또는 dualstack |
aws-load-balancer-listener-attributes.${Protocol}-${Port} |
리스너에 적용할 리스너 속성을 지정합니다. | tcp.idle_timeout.seconds=350 |
고려 사항
- Kubernetes에서 AWS Load Balancer 리소스로 태그 전파를 활성화하려면 Cluster IAM Role을 업데이트해야 합니다. 자세한 내용은 Custom AWS tags for EKS Auto resources를 참고하세요.
- 리소스가 EKS Auto Mode 또는 자체 관리형 AWS Load Balancer Controller 중 무엇과 연관될지에 대한 정보는 Migration reference를 참고하세요.
- 로드 밸런서 문제 해결은 Troubleshoot EKS Auto Mode를 참고하세요.
- EKS Auto Mode의 로드 밸런싱 기능 사용에 대한 더 많은 고려 사항은 Load balancing을 참고하세요.
로드 밸런싱을 위해 EKS Auto Mode로 마이그레이션할 때 서비스 어노테이션과 리소스 구성의 여러 변경이 필요합니다. 다음 표는 지원되지 않는 옵션과 권장 대안을 포함한 이전·새 구현 간의 주요 차이점을 설명합니다.
Service 어노테이션:
| 이전 | 새 | 설명 |
|---|---|---|
service.beta.kubernetes.io/load-balancer-source-ranges |
지원 안 함 | Service에서 spec.loadBalancerSourceRanges 사용 |
service.beta.kubernetes.io/aws-load-balancer-type |
지원 안 함 | Service에서 spec.loadBalancerClass 사용 |
service.beta.kubernetes.io/aws-load-balancer-internal |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-scheme 사용 |
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-target-group-attributes 사용 |
| 다양한 로드 밸런서 속성 | 지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-attributes 사용 |
service.beta.kubernetes.io/aws-load-balancer-access-log-enabled |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-attributes 사용 |
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-attributes 사용 |
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-attributes 사용 |
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled |
지원 안 함 | service.beta.kubernetes.io/aws-load-balancer-attributes 사용 |
사용이 중단된 로드 밸런서 속성 어노테이션에서 마이그레이션하려면 이 설정을 service.beta.kubernetes.io/aws-load-balancer-attributes 어노테이션으로 통합하세요. 이 어노테이션은 다양한 로드 밸런서 속성의 키-값 쌍을 쉼표로 구분한 목록을 허용합니다. 예를 들어 접근 로깅과 크로스 존 로드 밸런싱을 지정하려면 다음 형식을 사용합니다.
service.beta.kubernetes.io/aws-load-balancer-attributes: access_logs.s3.enabled=true,access_logs.s3.bucket=my-bucket,access_logs.s3.prefix=my-prefix,load_balancing.cross_zone.enabled=true
이 통합 형식은 필요한 개별 어노테이션 수를 줄이면서 로드 밸런서 속성을 구성하는 더 일관되고 유연한 방법을 제공합니다. 기존 Service 구성을 검토하고 이 통합 형식을 사용하도록 업데이트하세요.
TargetGroupBinding:
| 이전 | 새 | 설명 |
|---|---|---|
elbv2.k8s.aws/v1beta1 |
eks.amazonaws.com/v1 |
API 버전 변경 |
spec.targetType 선택 |
spec.targetType 필수 |
명시적 대상 유형 지정 |
spec.networking.ingress.from |
지원 안 함 | 더 이상 보안 그룹 없는 NLB 미지원 |
참고: 커스텀 TargetGroupBinding 기능을 사용하려면 컨트롤러에 필요한 IAM 권한을 부여하도록 대상 그룹에
eks:eks-cluster-name태그(값은 클러스터 이름)를 태깅해야 합니다. 컨트롤러는 TargetGroupBinding 리소스나 클러스터가 삭제되면 대상 그룹을 삭제한다는 점을 유의하세요.