Kubernetes
Service
dongb
2023. 2. 8. 13:29
반응형
Service 특징
- Service는 default로 해당 클러스터의 ip를 가짐
- pod를 Service에 연결하면 클러스터 ip로도 연결된 pod의 포트로 접근할 수 있음
- pod는 재생성되면 ip가 변경되므로 service를 연결하여 service의 ip로 접근
- ClusterIP ⊂ NodePort ⊂ Load Balancer
ClusterIP
- 클러스터 내부에서만 접근이 가능
- 동일한 port의 여러 pod를 연결 가능 → Service가 트래픽을 분산 처리
- 인가된(클러스터 접근 가능한) 사용자만 접근 가능
- 내부 dashboard 관리나 pod의 서비스 상태 디버깅하는 용도로 사용
apiVersion: v1 kind: Service metadata: name: svc-1 spec: selector: app: pod ports: - port: 9000 targetPort: 8080 **type: ClusterIP # 생략 가능(기본값)**
NodePort
- 해당 service와 연결되어 있는 모든 node에 nodePort를 할당
- 외부에서 해당 port로 접근하면 service로 연결됨 → service와 연결되어 있는 pod에 요청을 전달
- 주의 사항
- 어떤 node에 요청된 트래픽인지 상관없이 service와 연결되어 있는 모든 node의 pod에 요청을 보냄
- externalTrafficPolicy: Local 옵션을 주면 요청된 node에 연결되어 있는 Pod에게만 요청을 보냄
- 보통 보안적으로 내부망에서만 접근 가능하도록 구성
- 일시적 외부 연결용으로 사용 (데모, 임시 연결용)
apiVersion: v1 kind: Service metadata: name: svc-2 spec: selector: app: pod ports: - port: 9000 targetPort: 8080 nodePort: 30000 # 30000 ~ 32767 **type: NodePort**
Load Balancer
- Load Balancer가 각각의 Node에 트래픽을 분산
- Load Balancer에 접근하기 위한 ip는 자동으로 생성되지 않음
- 별도로 ip를 할당해주는 플러그인이 있어야 ip가 생성됨 (GCP, AWS, Azure 등)
- 외부 시스템 노출용
apiVersion: v1 kind: Service metadata: name: svc-3 spec: selector: app: pod ports: - port: 9000 targetPort: 8080 **type: LoadBalancer**
Headless Service
ClusterIP VS Headless Service
ClusterIP
Service, Pod의 FQDN(Fully Qualified Domain Name)과 ip
- Service
- FQDN: {service 이름}.{Namespace}.svc.{cluster.local}
→ 같은 Namespace에서 {service 이름} 만으로도 ip 질의 가능 - ip: Service ip
- FQDN: {service 이름}.{Namespace}.svc.{cluster.local}
- Pod
- FQDN: {pod ip}.{Namespace}.pod.{cluster.local}
→ pod ip가 변경되므로 직접 사용 불가 - ip: pod ip
- FQDN: {pod ip}.{Namespace}.pod.{cluster.local}
Pod의 도메인명이 변경되기 때문에 다른 Pod의 도메인명으로 직접 ip를 알아낼 수 없지만, Service를 통해 다른 Pod에 접근하려 할 경우 ClusterIP 만으로도 접근이 가능
Headless Service
Pod가 Service를 거치지 않고 Pod에 직접 연결해야 할 경우 Service를 Headless로 만들어야 함
Service, Pod의 FQDN과 ip
- Service
- FQDN: {service 이름}.{Namespace}.svc.{cluster.local}
- ip: 없음 → 연결된 모든 Pod ip 출력
- Pod
- FQDN: {hostname}.{연결된 service의 FQDN}
→ 같은 Namespace에서 {hostname}.{subdomain} 만으로도 ip 질의 가능 - ip: pod ip
- FQDN: {hostname}.{연결된 service의 FQDN}
⇒ Headless Service를 연결한 Pod의 경우 다른 Pod에서 직접 접근 가능해짐
- 방법
- Service의 clusterIP: None → Service에 IP할당 없음
- 연결 받을 Pod의 hostname: {도메인명}, subdomain: {service 이름}
Endpoint
- label을 이용해 Service와 Pod을 연결하면 Service는 내부적으로 Endpoint 오브젝트를 생성
- Endpoint는 Service와 같은 이름, Pod의 접속 정보를 가짐
- label 없이 Endpoint를 별도로 생성해 Service와 Pod(또는 외부 ip) 연결 가능
apiVersion: v1
kind: Endpoints
metadata:
name: endpoint
subsets:
- addresses:
- ip: {pod ip}
ports:
- port: 8080
ExternalName
- ip는 변경될 수 있기 때문에 ip 대신 도메인 이름으로 연결하는 방법
- externalName으로 도메인 이름 지정시 DNS cache가 내부, 외부 DNS로부터 ip를 찾아냄
- Pod가 Service를 가리키고 있을 경우 externalName만 변경하여 재배포 없이 접속할 곳을 변경할 수 있음
apiVersion: v1
kind: Service
metadata:
name: externalName
spec:
type: ExternalName
externalName: github.github.io
반응형