서비스 개념
•
동일한 서비스를 제공하는 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)