cluster IP
- Pod들이 cluster 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상 cluster 전용 IP
- cluster 내부에서만 접근 가능
- spec.selector에서 지정된 label로 여러 Pod들이 존재할 경우 Service는 그 Pod들의 외부 요청( request )을 전달할 endpoint로 선택하여 트래픽을 분배( LoadBalancing )
- endpoint를 수동으로 직접 지정해줄때는 Endpoints 객체를 이용하여 Service와 mapping 한다. 주의점은 endpoint를 명시할 IP는 loopback이면 안된다
NodePort
- 외부에서 node IP의 특정 Port( : )로 들어오는 요청을 감지하여 해당 port와 연결된 Pod로 트래픽 전달
- spec.ports에 nodePort를 추가로 지정
- nodePort는 외부에서 node 안의 특정 서비스로 접근할 수 있도록 지정된 node의 특정 port 의미
- nodePort의 범위는 30000 ~ 32767, 미지정시 임의의 Port 부여
- spec.selector에 해당하는 모든 파드들에 NordPort에 의해 동일한 LoadBalancing이 적용된다.
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80 # Service에 노출되는 Port
targetPort: 80 # Pod(애플리케이션)을 노출하는 Port
nodePort: 30036 # 외부 사용자가 애플리케이션에 접근하기 위한 Port
protocol: TCP
Load balancer
- 별도 외부 LoadBalancer를 제공하는 cloud( AWS, GCP, Azure등 ) 환경을 고려하여 해당 LoadBalancer를 cluster의 Service로 프로비저닝할 때 사용
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80 # 서비스를 노출하는 포트
targetPort: 80 # 애플리케이션(파드)를 노출하는 포트
clusterIP: 10.0.171.239 # 클러스터 IP
selector:
app: myapp
type: frontend
status:
loadBalancer: # 프로비저닝된 로드 밸런서 정보
ingress:
- ip: 192.0.2.127
ExternelName
- Service에 selector 대신 name을 직접 명시하고자 할 때 사용
- spec.externalName 속성에 필요한 DNS 주소 기입하면 cluster의 DNS 서비스가 해당 주소에 대한 CNAME 레코드 반환
apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com