Kubernetes는 애플리케이션을 컨테이너화하고 관리하는 강력한 도구입니다. 그 중에서도 Service는 클러스터 내의 애플리케이션을 네트워킹하는 데 중요한 역할을 합니다. Kubernetes 서비스는 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 유형이 있습니다. 이번 글에서는 Kubernetes Service의 한 종류인 ExternalName에 대해 자세히 알아보겠습니다.

ExternalName 이란?

ExternalName 서비스는 Kubernetes 클러스터 외부의 서비스로 트래픽을 전달하는 특별한 서비스 유형입니다. 이 서비스는 Kubernetes 클러스터 외부의 도메인 이름(DNS)으로 트래픽을 라우팅하도록 구성됩니다. 즉, ExternalName 서비스는 외부 서비스에 대한 내부 DNS 엔트리를 생성하여 Kubernetes 클러스터 내의 애플리케이션이 외부 서비스를 쉽게 참조할 수 있게 해줍니다. 이 서비스 유형은 실제 네트워크 프록시나 로드 밸런서를 생성하지 않으며, 클러스터 내에서 정의된 DNS 이름을 외부 DNS 이름으로 단순히 매핑합니다.

ExternalName 서비스의 사용 사례

Kubernetes 클러스터 내부에서 외부 서비스(예: 외부 데이터베이스)에 연결할 때, ExternalName 서비스를 사용하여 외부 서비스의 DNS 이름을 클러스터 내부의 이름으로 매핑할 수 있습니다. 이 방식은 외부 서비스의 DNS 이름이 변경되더라도 모든 애플리케이션을 수정할 필요 없이 ExternalName 서비스만 업데이트하면 되므로 편리합니다. 그러나 HTTP/HTTPS 프로토콜에서는 클러스터 내부에서 사용하는 도메인과 실제 도메인이 다르기 때문에 연결이 실패할 수 있으니 주의해서 사용해야 합니다.

ExternalName 서비스 생성하기

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ExternalName
  externalName: my.database.example.com

mysql이라는 이름의 ExternalName 서비스를 정의하며, 이 서비스는 클러스터 내부에서 my.database.example.com 이라는 외부 도메인 이름을 가리키도록 설정되어 있습니다. 이제 클러스터 내부의 애플리케이션은 mysql.default.svc.cluster.local DNS를 사용하여 my.database.example.com을 연결할 수 있습니다.

결론

Kubernetes의 ExternalName 서비스는 클러스터 외부의 서비스를 내부 도메인으로 간편하게 참조할 수 있는 유용한 도구입니다. 하지만 외부 네트워크와의 통합, 네트워크 지연, 외부 DNS 의존성 등의 문제를 고려해야 하므로, ExternalName 서비스 사용을 권장하진 않습니다.

References