Pod가 여러개 라면 그 앞에 관문 역할을 하는 것이 필요하다.
이러한 개념이 바로 Service
이다.
Service Template
이란 쿠버네티스에서 Service
를 생성하기 위한 yml
로 작성된 파일이다.
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
protocol: TCP
selector:
run: my-nginx
위의 내용을 한줄씩 설명한다.
metadata:
name: my-nginx
labels:
run: my-nginx
서비스의 이름은 my-nginx
이고, labels
는 해당 Pod에 대해서 라벨링을 해두는 것이다. 여기서는 run: my-nginx
라고 해두었다.
spec:
type: NodePort
Service
는 유형(ClusterIp,NodePort,LoadBalancer) 을 갖고 있는데, Node Port
를 여기서 사용하고 있다.
ports:
- port: 8080
targerPort: 80
protocol: TCP
클러스터 port 는 8080
이고 실제 nginx Pod가 서비스 되는 포트는 80
포트이다.
selector:
run: my-nginx
이 서비스는 Pod 중에서 label 값이 run: my-nginx
인 pod 쪽으로 서비스 한다.
( label이 run: my-nginx로 된 tcp 80 번 포트를 가진 pod를 대상으로 서비스한다.)
쿠버네티스에서 서비스는 파드의 논리적 집합과 그것들에 접근할 수 있는 정책을 정의하는 추상적 개념이다. 서비스가 대상으로 하는 파드 집합은 일반적으로 셀렉터가 결정한다.
셀렉터: 사용자가 레이블에 따라 리소스 리스트를 필터할 수 있다.
예를 들어, 3개의 레플리카로 실행되는 스테이트리스 이미지-처리 백엔드를 생각해보면 이러한 레플리카는 대체 가능하다. 즉, 프론트엔드에는 그것들이 사용하는 백엔드를 신경쓰지 않는다. 백엔드 세트를 구성하는 실제 파드는 변경될 수 있지만, 프론트엔드 클라이언트는 이를 인식할 필요가 없으며, 백엔드 세트 자체를 추적해야 할 필요도 없다.
파드의 포트 정의에 이름이 있으므로, 서비스의
targetPort
속성에서 이 이름을 참조 할 수 있다.
ClusterIp
, NodePort
, LoadBalancer
쿠버네티스의 디폴트 설정으로 외부에서 접근 가능한 IP를 할당받지 않기 때문에 Cluster내에서만 해당 서비스를 노출할 때 사용되는 Type
해당 서비스를 외부로 노출시키고자 할 때 사용되는 Service Type으로 외부에 Node IP와 Port를 노출시키는 것으로 아래 그림과 같이 쿠버네티스 클러스터 상에 있는 모든 노드에 대해서 노출 시킨다.
클라우드 상에 존재하는 LoadBalancer에 연결하고자 할 때 사용되는 Service Type으로 LoadBalancer의 외부 External IP를 통해 접근이 가능하다.
Kubernetes는 자체 DNS서버를 가지고 있어 클러스터 내부에서만 사용가능한 DNS를 설정해서 사용할 수 있다. 이것은 Kubernetes 상에서 통신할 때 IP기반이 아닌 DNS를 통해 연결할 수 있음을 뜻하며 Pod에서 다른 Pod의 서비스를 연결할 때 사용된다.
Ingress는 Kubernetes v1.1 추가된 기능으로 NodePort
와 LoadBalancer
와 마찬가지로 애플리케이션의 Service를 외부로 노출할 때 사용되는 리소스이다.
외부에서 들어온 HTTP와 HTTPS 트래픽을 ingress resource를 생성하여 Cluster 내부의 Service로 라우팅하며 로드밸런싱, TLS, 도메인 기반의 Virtual Hosting을 제공한다.