응용 프로그램 내부 및 외부의 다양한 구성 요소 간의 통신을 가능하게하는 객체
nodeport
cluster ip
load balancer
사용자 → 노드포트 → 서비스 → 파드
targetport, port, nodeport
pod.yml의 labels를 service.yml의 selector에 사용하여 서비스와 파드를 연결시킴
서비스는 생성 즉시 클러스터에 공유되어 모든 노드가 접근할 수 있게됨
포트 설명
nodeport는 보안상의 이유로 권장되는 방식이 아님. 아래 2가지 방식이 권장됨
yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
ports:
- targetPort: 80
port: 80
nodePort: 30008
selector:
type: myapp
모든 파드에는 ip가 할당되어 있음
그러나 이 파드 ip는 고정된 것이 아니라, 다운/생성시 변경될 수 있음
그래서 파드 ip로는 애플리케이션끼리 통신을 보장 할 수 없음
클러스터 내부의 애플리케이션끼리 확실하게 통신 할 수 있도록 cluster ip라는 개념을 사용함
cluster ip
파드를 그룹화하고 그룹 내의 파드에 접근하기 위한 단일 인터페이스
들어온 요청은 서비스에 속한 파드 중 하나로 전달
yaml
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
ports:
- port: 6379
targetPort: 6379
selector:
name: redis-pod
app: demo-voting-app
위에서 배운 것 처럼 사용자는 외부에서 nodeport를 사용하여 서비스를 호출할 수 있다.
이 때, http://노드ip:nodeport 처럼 호출하면 되는데,
모든 노드가 서비스를 공유하고 있으므로 이 노드ip에는 모든 노드ip를 사용할 수 있다.
(http://192.168.56.70:30035 = http://192.168.56.71:30035 = http://192.168.56.72:30035 = http://192.168.56.73:30035)
그러나 사용자는 이런 방식을 원하지 않는다. http://ex-front:30000처럼 단일 url을 사용하기를 원한다.
2가지 방식으로 이 요구사항을 구현할 수 있다.