반응형

목차

  1. 클러스터 외부에 있는 서비스 연결
  2. 서비스 Endpoint
  3. 셀렉터 없이 서비스와 Endpoint 리소스 생성
  4. 외부 서비스를 위한 별칭 생성
  5. Endpoint?

클러스터 외부에 있는 서비스 연결

이전 포스팅에서는 클러스터 내부에서 실행 중인 하나 이상의 파드와의 통신을 지원하는 서비스를 설명했습니다. 그러나 쿠버네티스 서비스 기능으로 내부에서만 통신을 하는 것이 아닌 외부 서비스를 노출하려는 경우가 있을 것입니다. 이 때 서비스가 클러스터 내에 있는 파드로 연결을 전달하는 게 아니라, 외부 IP와 포트로 연결을 전달하게 됩니다.

 

이 경우 서비스 로드밸런싱과 서비스 검색 모두 활용할 수 있습니다. 클러스터에서 실행 중인 클라이언트 파드는 내부 서비스에 연결하는 것처럼 외부 서비스에 연결할 수 있습니다,


서비스 Endpoint

들어가기에 앞서 서비스에 대해 좀 더 자세히 설명을 하도록 하겠습니다. 서비스는 파드에 직접 연결되지 않습니다. 대신 Endpoint 리소스가 그 사이에 있습니다. 서비스에서 kubectl describe 명령을 사용하면 엔드 포인트를 확인할 수 있습니다.

 

엔드 포인트 리소스는 서비스로 노출되는 파드의 IP 주소와 포트 목록입니다. 엔드 포인트 리소스는 다른 쿠버네티스 리소스와 유사하므로 kubectl get을 사용해 기본 정보를 표시할 수 있습니다. 파드 셀렉터는 서비스 스펙에 정의돼 있지만 들어오는 연결을 전달할 때 직접 사용하지는 않습니다. 대신 셀렉터는 IP와 포트 목록을 작성하는 데 사용되며 Endpoint 리소스에 저장됩니다. 클라이언트가 서비스에 연결하면 서비스 프록시는 이들 중 하나의 IP와 포트 쌍을 선택하고 들어온 연결을 대상 파드의 수신 대기 서버로 전달합니다.

서비스의 Endpoint를 서비스와 분리하면 Endpoint를 수동으로 구성하고 업데이트 할 수 있습니다. 파드 셀렉터 없이 서비스를 만들면 쿠버네티스는 Endpoint 리소스를 만들지 못합니다. 서비스를 위한 Endpoint 목록을 Endpoint 리소스로 설정하는 것은 독자에게 달렸습니다. 수동으로 관리되는 Endpoint를 사용해 서비스를 만들려면 서비스와 Endpoint 리소스를 모두 만들어야 합니다.


셀렉터 없이 서비스와 Endpoint 리소스 생성
apiVersion: v1
kind: Service
metadata:
  name: external-service    >  서비스 이름은 Endpoint 오브젝트 이름과 일치해야 합니다.
spec:
  ports:
  - port: 80

해당 YAML 매니페스트는 포트 80으로 들어오는 연결을 허용하는 external-service라는 서비스를 정의했습니다. 위에서 확인할 수 있듯이 서비스에 대한 파드 셀렉터는 따로 정의되어 있지 않습니다.

 

이러한 방식으로 서비스에 관한 Endpoint 리소스를 셀렉터 없이 생성할 수 있습니다. Endpoint는 별도의 리소스이며, 서비스 속성은 아니지만 셀렉터가 없는 서비스를 생성했기 때문에 Endpoint 리소스가 자동으로 생성되지 않습니다. 따라서 Endpoint 서비스를 생성해야 합니다. 다음 예제는 이러한 YAML 매니페스트를 보여줍니다.

apiVersion: v1
kind: Endpoints
metadate:
  name: external-service    >  위 예제에서 확인할 수 있듯이 서비스 이름과 
subsets:                                 Endpoint 오브젝트 이름과 일치 해야 합니다.
  - addresses:
    - ip: 123.123.123.123     >  서비스가 연결을 전달할 Endpoint의 IP
    - ip: 234.234.234.234
    ports:
    - port: 80                         >  Endpoint의 대상 포트

Endpoint 오브젝트는 서비스와 이름이 같아야 하고 서비스를 제공하는 대상 IP 주소와 포트 목록을 가져야 합니다. 서비스와 Endpoint 리소스가 모두 서버에 게시되면 파드 셀렉터가 있는 일반 서비스처럼 서비스를 사용할 수 있습니다. 서비스가 만들어진 후 만들어진 컨테이너에는 서비스의 환경변수가 포함되며 <IP:포트> 쌍에 대한 모든 연결은 서비스 엔드 포인트 간에 로드밸런싱합니다.

 

나중에 외부 서비스를 쿠버네티스 파드로 마이그레이션하기로 결정하면 수동 Endpoints 리소스를 사용하는 대신 서비스가 서비스를 실행하는 파드에 대한 연결을 자동으로 검색하고 관리할 수 있습니다. 이를 위해 셀렉터를 추가하여 서비스 구성을 업데이트합니다. 셀렉터를 추가하면 쿠버네티스가 Endpoing을 자동으로 관리하여 트래픽이 적절한 파드로 라우팅되도록 합니다. 


 하지만 서비스에서 셀렉터를 제거하는 경우 쿠버네티스는 Endpoint 리소스 업데이트를 중지합니다. 즉, 서비스 IP 주소와 포트는 동일하게 유지되지만 트래픽은 더 이상 Pod로 라우팅되지 않습니다. 이는 서비스의 실제 구현이 변경되는 동안에도 서비스 IP 주소가 일정하게 유지될 수 있음을 의미합니다.


외부 서비스를 위한 별칭 생성

서비스의 Endpoint를 수동으로 구성해 외부 서비스를 노출하는 대신 좀 더 간단한 방법으로 FQDN으로  외부 서비스를 참조할 수 있습니다.

 

외부 서비스의 별칭으로 사용되는 서비스를 만들려면 유형 필드를 ExternalNam으로 설정해 서비스 리소스를 만듭니다. api.somecompany.com에 공개 API가 있다고 가정해봅시다. 다음 예제에 표시된 대로 이를 가리키는 서비스를 정의할 수있습니다.

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: someapi.somecompany.com
  ports:
  - port: 80

서비스가 생성되면 파드는 서비스의 FQDN을 사용하는 대신 external-service.default.svc.cluster.local 도메인 이름으로 외부 서비스에 연결할 수 있습니다.

 

이렇게하면 서비스를 사용하는 파드에서 실제 서비스 이름과 위치가 숨겨져 나중에 externalName 속성을 변경하거나 유형을 다시 ClusterIP로 변경하고 서비스 스펙을 만들어 서비스 스펙을 수정하면 나중에 다른 서비스를 가리킬 수 있습니다. 서비스를 위한 Endpoint 오브젝트를 수동 혹은 서비스에 레이블 셀렉터를 지정해 Endpoint가 자동으로 생성되도록 합니다.

 

ExternalName 서비스는 DNS 레벨에서만 구현됩니다. 서비스에 관한 간단한 CNAME DNS 레코드가 생성됩니다. 따라서 서비스에 연결하는 클라이언트는 서비스 프록시를 완전히 무시하고 외부 서비스에 직접 연결됩니다. 이러한 이유로 ExternalName 유형의 서비스는 ClusterIP를 얻지 못합니다.

 

* CNAME 레코드는 IP 주소 대신 FQDN을 가리킵니다.


Endpoint?

쿠버네티스에서 Endpoint는 서비스와 연결된 파드의 네트워크 정보(IP 주소 및 포트)를 저장하는 리소스입니다. 서비스에서 네트워크 트래픽을 올바른 파드로 라우팅하는 데 사용됩니다. Endpoint는 클라이언트와 쿠버네티스 클러스터 내에서 원하는 기능을 제공하는 파드 간의 통신을 가능하게 합니다.

서비스에 선택기가 정의되어 있으면 쿠버네티스는 해당 Endpoints 리소스를 자동으로 생성하고 관리합니다. 선택기는 서비스에서 대상으로 하는 파드의 레이블과 일치하는 키-값 쌍 집합입니다. 파드가 생성, 업데이트 또는 종료되면 쿠버네티스는 적절한 네트워크 정보로 Endpoint를 업데이트하여 서비스가 트래픽을 올바른 파드로 라우팅하도록 합니다.

이번 포스팅에서 다룬 것 처럼 외부 서비스(쿠버네티스 클러스터 외부)에 연결하거나 서비스와 연결된 파드를 수동으로 관리하려는 경우와 같이 셀렉터가 없는 서비스가 있을 수 있습니다. 이러한 시나리오에서는 Endpoints 리소스를 수동으로 만들고 관리해야 합니다. Endpoints 리소스에서 직접 대상 파드 또는 외부 서비스의 IP 주소와 포트를 지정하고 쿠버네티스는 이 정보를 사용하여 서비스에서 트래픽을 라우팅합니다.

반응형