None-Selector 서비스는 ClusterIP 서비스의 일종으로(일반적으로 클러스터 내부에서는 ClusterIP 서비스를 통해 로드 밸런싱을 하기 때문에 이를 기준으로 설명한다.), 말 그대로 ClusterIP 서비스의 selector 를 지정하지 않는 대신, Service와 동일한 이름의 Endpoints 를 생성하고 Endpoints 에 subsets[].address[] 를 배열로 지정하여 Service와 목적지를 1:N 으로 매핑하도록 구성해준다.(로드 밸런싱 포함) Endpoints 에서 지정하는 로드 밸런싱 대상 멤버에는 외부 서비스의 IP 들을 지정하면 된다. Endpoints 에 지정된 엔드포인트들을 타켓으로 해야 하기 때문에 당연히 spec.externalName 도 지정하면 안된다.

 

1. 생성

Service 와 Endpoints 리소스를 각각 생성한다. 중요한 것은, 서비스와 엔드포인트 리소스의 이름이 일치해야 한다는 것이다. 서비스에는 spec.selector 와 spec.externalName 을 지정하지 않아야 한다.

 

서비스

apiVersion: v1
kind: Service
metadata:
  name: none-selector
spec:
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

 

엔드포인트

apiVersion: v1
kind: Endpoints
metadata:
  name: none-selector
subsets:
  - addresses:
      - ip: 192.168.1.1
      - ip: 192.168.1.2
    ports:
      - protocol: TCP
        port: 80

 

2. 로드 밸런싱 대상 변경

다음 커맨드로 서비스에 엔드포인트 대상 멤버가 등록되었는지 확인한다.

$ kubectl describe svc none-selector
Name:                     none-selector
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 <none>
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.96.201.140
IPs:                      10.96.201.140
Port:                     <unset>  8080/TCP
TargetPort:               80/TCP
Endpoints:                192.168.1.1:80,192.168.1.2:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

 

이제 엔드포인트 리소스에서 멤버만 추가/삭제하면 로드 밸런싱 대상이 변경된다.

참고로, ClusterIP 나 LoadBalancer 서비스를 생성하여도 자동으로 로드 밸런싱 대상인 엔드포인트 리소스가 생성된다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,