Search

7. Service

서비스 개념

동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공
ex) deployment로 생성된 다수의 pod에 각각 ip가 할당됨 이때 service를 활용하여 해당 deploy팟들에 접근할 수 있는 ip를 만들수있음
즉, 로드벨런서 ip가 만들어짐

Service Definition

# Deployment Definition apiVersion: apps/v1 kind: Deployment metadata: name: webui spec: replicas: 3 selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14
YAML
복사
# Service Definition apiVersion: v1 kind: Service metadata: name: webui-svc spec: clusterIP: 10.96.100.100 selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80
YAML
복사
Service에서의 selector는 적용될 팟의 label을 의미함

서비스 타입

4가지 TYPE 지원
ClusterIP(default)
pod 그룹의 단일 진입점(Virtual IP) 생성
각 팟에 연결하는 LoadBalancer IP를 생성
NodePort
ClusterIP 가 생성된 후
모든 Worker Node에 외부에서 접속가능 한 포트가 예약
LoadBalancer
클라우드 인프라스트럭쳐(AWS, Azure, GCP 등)나 오픈스택 클라우드에서만 적용가능
LoadBalancer를 자동으로 프로 비전하는 기능 지원
ClusterIP와의 차이점은 ClusterIP의 경우 kubernetes 내에서 의 연결을 만들어 준다면 LoadBalancer은 외부의 LoadBalancer 장비와 클러스터를 연결해준다.
ExternalName
클러스터 안에 외부에서 접속시 사용할 도메인을 등록해서 사용
클러스터 도메인이 실제 외부 도메인으로 치환되어 동작

서비스 사용하기

Cluster IP

selector의 label이 동일한 파드들을 그룹으로 묶어 단일 진입점(Virtual IP)를 생성
클러스터 내부에서만 사용가능
type 생략시 default 값으로 10.96.0.0/12 범위에서 할당됨

Cluster IP Example

# clusterip-service.yaml apiVersion: v1 kind: Service metadata: name: clusterip-service spec: type: ClusterIP clusterIP: 10.100.100.100 selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80 # 생성 kubectl create -f clusterip-service.yaml # 확인 kubectl get svc kubectl describe svc clusterip-service curl 10.100.100.100 # 삭제 kubectl delete svc clusterip-service
YAML
복사

NodePort

모든 노드를 대상으로 외부 접속 가능한 포트를 예약
Default NodePort 범위: 30000-32767
ClusterIP를 생성 후 NodePort를 예약

NodePort Example

# nodeport-service.yaml apiVersion: v1 kind: Service metadata: name: nodeport-service spec: type: NodePort ClusterIP: 10.100.100.200 selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30200 # 생성 kubectl create -f nodeport-service.yaml # 확인 kubectl get svc curl 10.100.100.200 kubectl describe svc nodeport-service iptables -t nat -L KUBE-NODEPORTS | column -t # 삭제 kubectl delete svc nodeport-service
YAML
복사

LoadBalancer

Public 클라우드(AWS, Azure, GCP 등)에서 운영 가능
LoadBalancer를 자동으로 구성 요청
NodePort를 예약 후 해당 NodePort로 외부 접근 허용

LoadBalancer Example

# loadbalancer-service.yaml apiVersion: v1 kind: Service metadata: name: loadbalancer-service spec: type: LoadBalancer selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80 # 생성 kubectl create -f loadbalancer-service.yaml # 확인 kubectl get svc # 삭제 kubectl delete svc loadbalancer-service
YAML
복사

ExternalName

클러스터 내부에서 Exteranl(외부)의 도메인을 설정
DNS

ExternalName Example

apiVersion: v1 kind: Service metadata: name: externalname-svc spec: type: ExternalName externalName: google.com # 생성 kubectl create -f externalname-service # 확인 kubectl get svc kubectl run testpod -it --image=centos:7 /# curl externalname-svc.default.svc.cluster.local /# exit # 삭제 kubectl delete pod testpod kubectl delete svc externalname-svc
YAML
복사

Headless Service

ClusterIP가 없는 서비스로 단일 진입점이 필요 없을 때 사용
Service와 연결된 Pod의 endpoint로 DNS 레코드가 생성됨
Pod의 DNS 주소: pod-ip-addr.namespace.pod.cluster.local
ClusterIP를 None로 설정

Headless Example

# headless-nginx.yaml apiVersion: v1 kind: Service metadata: name: headless-nginx spec: type: ClusterIP clusterIP: None selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80 # 생성 kubectl create -f headless-nginx.yaml # 확인 kubectl get svc # 삭제 kubectl delete svc headless-nginx
YAML
복사
클라이언트가 Pod 1개가 아니라 모든 Pod 들과 통신해야하는 경우 사용할 수 있을 것 같다.
DB같은경우 마스터와 읽기전용 모드로 구성을 하는경우가 있는데 이때 데이터를 작성할때는 마스터, 읽을 때는 읽기전용의 형태로 사용할 수 있다.
statefulSet과의 조합이 좋은데 pod의 dns주소가 pod-ip-addr 과도 이어지지만 pod-name과도 이어지기 때문에 항상 고정된 dns값을 받을수 있다.

kube-proxy

kubernetes Service의 backend 구현
endpoint 연결을 위한 iptables 구성
nodePort로의 접근과 Pod 연결을 구현(iptables 구성)

kube-proxy mode

userspace
클라이언트의 서비스 요청을 iptables를 거쳐 kube-proxy가 받아서 연결
kubernetes 초기버전에 잠깐 사용
iptables
default kubernetes network mode
kube-proxy는 service API 요청 시 iptables rule 이 생성
클라이언트 연결은 kube-proxy가 받아서 iptables 룰을 통해 연결
IPVS
리눅스 커널이 지원하는 L4 로드밸런싱 기술을 이용
별도의 ipvs 지원 모듈을 설정한 후 적용가능
지원 알고리즘: rr(round-robin), lc(least connection), dh(destination hashing), sh(source hashing), sed(shortest expected delay), nc(next queue)