ELBv2, Route 53 및 Aurora (ACK)
ELBv2 1.7.0 / Route 53 1.6.0 / RDS 1.12.0의 독립된 schema 예제입니다. NLB가 Aurora 앞단에 놓인다는 뜻은 아닙니다. app용 내부 NLB/DNS와 app이 연결할 Aurora를 별도로 준비하는 구성입니다. 전체 서비스가 연결된 실습으로 검증하지 않았습니다.
infra namespace와 세 controller의 인증·권한을 준비하고 승인된 VPC, private subnet, security group, hosted zone으로 치환하세요. NLB용과 DB용 security group은 필요한 source/port만 허용해야 합니다. 내부 NLB라고 IAM/RBAC 또는 네트워크 접근 제어가 대체되지는 않습니다.
TargetGroup만 생성하면 target이 등록되지 않습니다. 고정 IP target은 ACK targets로 관리할 수 있지만 Kubernetes Pod의 변동 IP 연결에는 AWS Load Balancer Controller의 적절한 binding/소유권 계획이 필요합니다. 같은 AWS 객체를 두 controller가 경쟁 관리하지 않게 하세요.
NLB와 TargetGroup ARN은 status.ackResourceMetadata.arn에서 읽습니다. Listener는 지원되는 Ref를 사용합니다. Route 53은 type이 아니라 recordType이며 NLB DNS와 canonicalHostedZoneID를 실제 status에서 복사해야 합니다. record가 속한 hosted zone과 alias 대상 NLB zone ID는 다른 값입니다.
Aurora PostgreSQL 17.10은 2026년 8월 발표 버전입니다. 실제 계정·region의 engine/class 조합과 upgrade 경로는 describe-db-engine-versions 및 describe-orderable-db-instance-options로 확인하세요. 예전 15.4를 새 기본값으로 사용하지 않습니다. DB subnet은 최소 두 개의 지원 AZ에 걸쳐 준비하고 실제 배치·가용성을 확인합니다.
manageMasterUserPassword=true로 RDS의 Secrets Manager 통합을 요청하며 별도의 plaintext password 예제를 만들지 않았습니다. 필요한 KMS/Secrets Manager 권한과 비용, app의 승인된 파일 전달 경로를 준비합니다. deletionProtection과 retain은 서로 다른 계층의 보존 설정입니다.
DBInstance 이름이나 Role tag가 writer/reader를 고정하지 않습니다. 실제 writer는 cluster membership 상태로 확인하며 failover로 바뀔 수 있습니다. promotionTier는 승격 우선순위이며 고정 역할 보장이 아닙니다. custom READER endpoint는 지정 인스턴스가 현재 reader인 경우에만 대상으로 사용하므로 failover 후 가용 대상과 연결 재시도를 확인합니다. AZ 이름처럼 보이는 endpoint 이름만으로 AZ 제한이 구현되지 않습니다.
LoadBalancer — loadbalancer-app-nlb
apiVersion: elbv2.services.k8s.aws/v1alpha1
kind: LoadBalancer
metadata:
name: app-nlb
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
name: app-nlb
scheme: internal
type: network
subnets:
- subnet-0123456789abcdef0
- subnet-0123456789abcdef1
securityGroups:
- sg-0123456789abcdef0TargetGroup — targetgroup-app-tg
apiVersion: elbv2.services.k8s.aws/v1alpha1
kind: TargetGroup
metadata:
name: app-tg
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
name: app-tg
protocol: TCP
port: 8080
targetType: ip
vpcID: vpc-0123456789abcdef0
healthCheckProtocol: TCP
healthCheckPort: '8080'Listener — listener-app-listener
apiVersion: elbv2.services.k8s.aws/v1alpha1
kind: Listener
metadata:
name: app-listener
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
loadBalancerRef:
from:
name: app-nlb
port: 8080
protocol: TCP
defaultActions:
- type: forward
targetGroupRef:
from:
name: app-tgRecordSet — recordset-app-dns
apiVersion: route53.services.k8s.aws/v1alpha1
kind: RecordSet
metadata:
name: app-dns
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
hostedZoneID: REPLACE_WITH_PRIVATE_ZONE_ID
name: app.example.com
recordType: A
aliasTarget:
dnsName: REPLACE_WITH_NLB_STATUS_DNS_NAME
hostedZoneID: REPLACE_WITH_NLB_CANONICAL_HOSTED_ZONE_ID
evaluateTargetHealth: trueDBSubnetGroup — dbsubnetgroup-app-db-subnets
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBSubnetGroup
metadata:
name: app-db-subnets
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
name: app-db-subnets
description: Private subnets in distinct supported AZs
subnetIDs:
- subnet-0123456789abcdef0
- subnet-0123456789abcdef1DBCluster — dbcluster-app-aurora
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBCluster
metadata:
name: app-aurora
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
dbClusterIdentifier: app-aurora
engine: aurora-postgresql
engineVersion: '17.10'
masterUsername: dbadmin
manageMasterUserPassword: true
dbSubnetGroupRef:
from:
name: app-db-subnets
vpcSecurityGroupIDs:
- sg-0123456789abcdef1
storageEncrypted: true
backupRetentionPeriod: 7
deletionProtection: trueDBInstance — dbinstance-app-db-1
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
name: app-db-1
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
dbInstanceIdentifier: app-db-1
dbClusterIdentifierRef:
from:
name: app-aurora
dbInstanceClass: db.r6g.large
engine: aurora-postgresql
publiclyAccessible: false
promotionTier: 0DBInstance — dbinstance-app-db-2
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
name: app-db-2
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
dbInstanceIdentifier: app-db-2
dbClusterIdentifierRef:
from:
name: app-aurora
dbInstanceClass: db.r6g.large
engine: aurora-postgresql
publiclyAccessible: false
promotionTier: 1DBInstance — dbinstance-app-db-3
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
name: app-db-3
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
dbInstanceIdentifier: app-db-3
dbClusterIdentifierRef:
from:
name: app-aurora
dbInstanceClass: db.r6g.large
engine: aurora-postgresql
publiclyAccessible: false
promotionTier: 2DBClusterEndpoint — dbclusterendpoint-app-selected-readers
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBClusterEndpoint
metadata:
name: app-selected-readers
namespace: infra
annotations:
services.k8s.aws/deletion-policy: retain
spec:
dbClusterEndpointIdentifier: app-selected-readers
dbClusterIdentifierRef:
from:
name: app-aurora
endpointType: READER
staticMemberRefs:
- from:
name: app-db-2
- from:
name: app-db-3검증과 운영 전 확인
표시한 필드는 공식 versioned CRD로 검사했습니다. 스키마 통과는 IAM, AWS 서비스 제약, 실제 생성·연결·복구를 증명하지 않습니다. retain으로 남긴 리소스의 운영·비용·삭제 책임과 백업 계획을 정한 뒤 적용하세요.