1. ClusterIP
용도: 파드 간 통신
서비스가 생성되면 k8s 내부 DNS 서버에 서버 IP 주소가 등록됨
사실 서비스가 없어도 파드의 IP를 직접 알아내어 파드 간 통신을 할 수 있음. 하지만 이러면 재생성된 파드에 대해 대응을 못함(IP가 바뀌어서)
name: api-service
port 80
targetPort 80
selector: numbers_api
2. LoadBalancer
용도: 외부 트래픽 전달
spec:
ports:
- port: 8080 # 서비스가 주시하는 포트
- targetPort: 80 # 트래픽이 전달될 파드의 포트
selector:
app: numbers-web
3. NodePort
용도: 외부 트래픽을 전달하는 또다른 방법(실제론 잘 안씀)
노드포트 서비스는 모든 노드가 서비스에 설정된 포트를 주시하게 함
spec:
ports:
- port: 8080 # 다른 파드가 서비스에 접근하기 위해 사용하는 포트
- targetPort: 80 # 대상 파드에 트래픽을 전달하는 포트
- nodePort: 30080 # 서비스가 외부에 공개되는 포트
selector:
app: numbers-web
4. External Node
용도: 외부로 요청 전달
파드가 numbers_api를 조회하면 DNS 서비스가 'raw.github.com'을 반환
metadata:
name: numbers_api
spec:
externalName: 'raw.github.com'
5. CluterIP: None을 설정한 헤드리스 서비스
apiVersion: v1
kind: Service
metadata:
name: headless-service
spec:
clusterIP: None
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 9376
특징
- DNS 이름 해석: 서비스 이름으로 DNS 쿼리를 수행하면, 서비스에 속한 모든 파드의 IP 주소 목록이 반환
- 직접 통신: 클라이언트는 서비스의 DNS 이름을 사용하여 파드의 IP 주소 목록을 받아와 직접 통신할 수 있다
- 자동 업데이트: 파드가 추가되거나 삭제되면, DNS 이름 해석 결과가 자동으로 업데이트
주요 용도
- 파드 간의 직접 통신이 필요할 때
- 상태를 유지해야 하는 스테이트풀 애플리케이션(예: 데이터베이스 클러스터)
- 클라이언트가 직접 파드의 IP 주소 목록을 사용하여 로드 밸런싱을 수행할 때
5. 엔드포인트를 제공하는 서비스
레이블 셀렉터가 없어 대상 파드가 없다.
대신 자신이 제공해야 할 IP 주소 목록이 담긴 엔드포인트 리소스와 함께 배포됨
apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: my-external-service
subsets:
- addresses:
- ip: 192.168.1.1
- ip: 192.168.1.2
ports:
- port: 80
특징
- 고정된 IP 주소 목록: 엔드포인트는 특정 IP 주소와 포트를 직접 지정하여 설정
- 수동 관리: 엔드포인트는 수동으로 정의되며, 파드의 변화에 따라 자동으로 업데이트되지 않음
- 외부 리소스 연결: 클러스터 외부의 서비스나 특정 IP 주소에 대한 접근을 설정할 때 유용
주요 용도
- 클러스터 외부의 리소스(예: 외부 데이터베이스 서버)와 연결할 때
- 특정 고정된 IP 주소를 사용하여 접근해야 할 때
댓글