귀찮게하기/DevOps-SRE

[Kubernetes] ingress - external dns - route53(cloud dns server)

게임이 더 좋아 2025. 4. 5. 00:23
반응형
728x170

여기서 중요한 것은 ExternalDNS임

만약 public 이 필요 없다면 CoreDNS + Traefik 로 사용

 

정의

external dns란 쿠버네티스 클러스터 내부 리소스를 외부 DNS 서비스와 연동하여 DNS 레코드를 자동으로 생성하고 관리할 수 있게 해주는 오픈소스

 

 

목적

클러스터 내 서비스와 외부 도메인을 연결

DNS 레코드 자동 생성 및 업데이트

쿠버네티스의 Service 또는 Ingress 리소스를 기반으로 외부 DNS 제공자에 A 레코드 또는 TXT 레코드를 생성하고 삭제

-> 주로 Ingress로 사용됨

다양한 DNS 제공자와 연동, AWS Route53, Google Cloud DNS, Azure DNS 등 여러 퍼블릭 도메인 공급자와 호환

 

작동

ExternalDNS를 배포하면 인그레스 리소스가 생성될 때마다 자동으로 Route 53에 레코드를 추가

 

어떻게?

ExternalDNS는 컨트롤러 형태로 쿠버네티스 클러스터에 배포

DNS 제공자와의 연동을 위해 적절한 IAM Role 또는 권한이 필요

 


 

추가 정보

++ Ingress Controller

Kubernetes에서 외부 트래픽을 클러스터 내부로 라우팅하기 위해 사용

Ingress 리소스를 정의하면 HTTP/HTTPS 트래픽을 특정 서비스로 전달하거나, 경로 기반 라우팅, SSL 종료 등을 처리

  • NGINX Ingress Controller: 가장 널리 사용되는 오픈소스 Ingress 컨트롤러로, NGINX를 기반으로 동작.
  • Traefik: 경량화된 모던 Ingress 컨트롤러로, 동적 설정과 자동 서비스 디스커버리를 지원.
  • HAProxy Ingress: 고성능 로드 밸런싱에 특화.

 

External DNS와의 연계

Ingress 리소스가 생성되면 External DNS가 이를 감지해 자동으로 DNS 레코드를 설정

 


 

자세한 예시

기본적으로 IP와 포트 기반으로 동작하는 Kubernetes Service와 달리

Ingress는 도메인 이름(예: app.example.com)과 경로(예: /api)를 기반으로 트래픽을 관리

주요 기능:

  • 도메인 기반 라우팅 (Host-based routing)
  • 경로 기반 라우팅 (Path-based routing)
  • TLS/SSL 종료 (HTTPS 지원)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: app.example.com  # ingress 는 host로 라우팅함
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com
    secretName: example-tls

-> app.example.com/api로 들어오는 요청을 api-service로, app.example.com/으로 들어오는 요청을 web-service로 보냄

Ingress 자체는 규칙만 정의

실제 트래픽 처리는 Ingress Controller가 필요

Ingress Controller는 Ingress 리소스를 해석하고 실행하는 소프트웨어로, Kubernetes 클러스터에서 외부 트래픽을 처리

리버스 프록시(예: NGINX, HAProxy)나 로드 밸런서를 기반으로 동작

Ingress 규칙에 따라 트래픽을 서비스로 라우팅

 

Ingress Controller

  • NGINX Ingress Controller: NGINX를 기반으로 한 가장 널리 사용되는 컨트롤러.
  • Traefik: 동적 설정과 자동 디스커버리를 지원.
  • HAProxy Ingress: 고성능 트래픽 처리에 강점.
  • AWS ALB

 

ExternalDNS는 Kubernetes 리소스(예: Ingress, Service)를 외부 DNS 제공업체(예: Route 53)에 동기화하는 도구

  • Ingress의 host 필드를 DNS 레코드로 등록
  • Service의 외부 IP를 DNS에 매핑
  • 동적 환경에서 수동 DNS 관리 부담 감소

 


 

이렇게 연동하기 위해 필요한 것

  • 도메인 이름 구매 (예: example.com).
  • AWS Route 53에 호스팅 존(Hosted Zone) 생성
  • IAM 권한 설정 (ExternalDNS가 Route 53을 수정할 수 있도록)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "route53:ChangeResourceRecordSets",
        "route53:ListResourceRecordSets",
        "route53:ListHostedZones"
      ],
      "Resource": "*"
    }
  ]
}
  • ChangeResourceRecordSets: DNS 레코드 생성/수정/삭제 권한.
  • ListResourceRecordSets: 호스팅 존 내 레코드 목록 조회.
  • ListHostedZones: 관리 가능한 호스팅 존 목록 조회.

 

Kubernetes에서 ExternalDNS를 실행한다면 IAM Roles for Service Accounts (IRSA)를 사용

  • IAM → "Roles" → "Create role":
    • Trusted entity: "Elastic Kubernetes Service (EKS)" 선택.
    • Use case: "EKS - IRSA" 선택.
    • 생성한 정책(ExternalDNSPolicy)을 역할에 연결.
    • 역할 이름(예: external-dns-role)을 지정하고 생성.
  • 역할 ARN을 기록합니다(예: arn:aws:iam::123456789012:role/external-dns-role).

 

Kubernetes Service Account에 역할 연결

Kubernetes 클러스터에서 Service Account를 생성하고 IRSA를 연결합니다.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/external-dns-role

 

 

 

 

 

728x90
반응형
그리드형

'귀찮게하기 > DevOps-SRE' 카테고리의 다른 글

[Kubernetes] RBAC  (0) 2025.04.05
DevOps - Argo CD  (0) 2025.03.31
DevOps - Helm  (0) 2025.03.31
DevOps - ArgoCD APP of APPS  (0) 2025.03.18
내 컴퓨터가 해킹당했다면?  (0) 2025.02.16