
Pod가 존재함Pod 그룹 간의 연결을 가능하게 하는것이 serviceservice는 엔드유저에게 프론트엔드 서비스를 제공 하게 하고 백엔드와 프론트엔드 Pod 통신과 외부 데이터 소스와 연결을 돕는다node에 부여된 IP 주소 (192.168.1.2) ❗️192.168.1.10 (노트북) ➡️ K8S Internal Pod Network(10.244.0.0) 접근 불가
servicenodeport service가 대표적NodePort : service가 내부 포트를 노드의 포트에 액세스할 수 있게 함ClusterIP : 클러스터 안에서 가상 IP를 만들어 다른 서비스간의 통신을 가능하게 함 (예시. 클러스터 내부의 프론트엔드와 백엔드 그룹의 통신)LoadBalancer : 클라우드 로드밸런서를 프로비전 함node의 포트로부터 pod의 포트로까지 mapping 해줄 수 있다.ClusterIP 라고 한다.# service-definition.yaml
apiServer: v1
kind: Service
metadata:
name: myapp-service
# label : 현재 필요없음
spec:
type: NodePort # 이외에 ClusterIP, LoadBalancer 등을 사용
ports:
- targetPort: 80
port: 80
nodePort: 30008
selector:
app: myapp
type: front-end
porttargetPort를 생략시 port와 동일하다고 간주함nodePort를 생략시 자동으로 비어있는 포트 번호 할당ports 필드는 배열(array)이기 때문에 자식 필드에 대시문자(-)가 있고 첫 번째 요소를 의미ports를 정의했다면 실제 연결할 pod를 labels로 식별할 수 있다spec 필드 아래에 selector 필드를 정의 하고 연결할 pod의 labels 실제 값을 명시한다replicaSet 또는 deployment와 다른 점은 matchLabels가 존재하지 않는다 Pod를 복제할 template이 필요가 없기 때문이다.$ kubectl create -f service-definition.yaml
$ kubectl get services
$ curl http://192.168.1.2:30008
# K8S node IP와 NodePort
Pod에 Mapping된 port를 예로 들었지만 다중 Pod에 Mapping 하기위해.Pod 정의시 labels을 설정하고 service정의 시 selector로 레이블 지정(위 yaml 파일 예시 참조)selector와 일치하는 레이블의 pod로 매칭하게 됨pod가 여러 node에 걸쳐 생성 되었을때는?node와 pod에 웹 애플리케이션이 존재service를 생성하고 타깃 포트를 같은 노드 포트로 맵핑함