Service

mingg·2024년 1월 31일
0

쿠버네티스

목록 보기
5/9
post-thumbnail

서비스 개념

서비스 = 쿠버네티스 네트워크

동일한 서비스를 제공하는 pod 그룹의 단일 진입점을 제공

쉽게 말해서 동일한 pod를 하나씩 각 노드에 실행하고 있을때 요청이 들어오면 로드밸런싱을 어떻게 해줘? → etcd에 해당 모든 파드의 ip주소를 모으고 virtual ip가 만들어짐 virtual ip로 단일 진입점을 만들어서 로드밸런싱 해준다.

apiVersion: v1
kind: Service
metadata:
  name: webui-svc
spec:
# clusterIP:생략가능 적으면 지정하는것도 가능
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

서비스 타입

  • clusterIP(defult)

selector의 label가 동일한 파드들의 그룹으로 묶는다.

pod 그룹의 단일 진입점(virtual IP) 생성

파드들이 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP.

type생략시 기본 값으로 10.96.0.0./12 범위에서 할당된

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
curl 10.100.100.100
  • NodePort

clusterIP는 자동으로 생성되고 clusterIP 생성된 후 모든 worker node에 외부에서 접속 가능한 포트 예약

외부에서 노드IP의 특정 포트로 들어오는 요청을 감지하여 해당 포트와 연결된 파드로 트래픽을 전달하는 유형

default nodeport 범위 : 30000-32767

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
  • LoadBalancer

클라우드 인프라스트럭쳐(AWS, Azure, GCP 등)이나 오픈스택 클라우드에 적용

실제 존재하는 LB가 생긴다. LB 포트랑 기존에 열려있는 포트를 연결해주는거

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • ExternalName

클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용.

클러스터 도메인이 실제 외부 도메인으로 치환되어 동작

apiVersion: v1
kind: Service
metadata:
  name: externalname-svc
spec:
  type: ExternalName
  externalName: google.com
kubectl exec [접근할 pod이름] -it -- /bin/bash
curl [externalname-svc이름].default.svc.cluster.local

하면 externalname 주소로 연결 여기서는 google로 연결

Headless Service

pod들의 endpoint에 DNS resolcing Service 지원

clusterIP가 없는 서비스로 단일 진입점이 필요없을때 사용

service와 연결된 Pod의 endpoins로 DNS 레코드가 생성됨

pod의 DNS주소 : [pod-ip-address].namespace.pod.cluster.local

apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# 마스터에서 제공하는 core DNS server 주소 확인
cat /etc/resolv.conf
# core DNS가 실제 127-16-64-64서버와 resolving서비스를 제공을 지원해준다. -> headless service
curl 172-16-64-64.default.pod.cluster.local

pod간 접속에 사용 (파드의 이름이 바뀌지 않는 statefulset과 같은걸 사용할때 유용)

kube-proxy

kubernetes service의 백엔드 구현

endpoint연결을 위한 iptables 구성

nodePort로의 접근과 파드 연결을 구현 (포트 열어두면 리슨하고 있음)

각각의 노드에는 kube-proxy가 동작

iptables -t nat -S | grep 80

kube-proxy mode

  • userspace

클라이언트의 서비스 요청을 iptables를 거쳐 kube-proxy가 받아서 연결

쿠버네티스 초기버전에 잠깐 사용

  • iptables → 이게 default

kube-proxy는 service API요청 시 iptables rule이 생성

클라이언트 연결은 kube-proxy가 받아서 iptables rule을 통해 연결

  • IPVS

리눅스 커널이 지원하는 L4로드밸런싱 기술을 이용

별도의 ipvs 지원 모듈을 설정한 후 적용가능!

profile
혼자 이것저것 해보는걸 즐깁니다..!

0개의 댓글