[따배쿠] Service

박병준·2022년 10월 24일
0

따배쿠

목록 보기
4/4

서비스 개념

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

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <deploy_name>
spec:
  replicas: <배포 갯수>
  selector:
    matchLabels:
      key: value
  template:
    <컨테이너 템플릿>

service

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  clusterIP: <IP 주소>
  selector:
    key: value
  ports:
  - protocol: TCP
    port: <외부 포트>
    targetPort: <내부 포트>

서비스 타입

ClusterIP(default)

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

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  type: ClusterIP
  clusterIP: <IP 주소>
  selector:
    key: value
  ports:
  - protocol: TCP
    port: <외부 포트>
    targetPort: <내부 포트>

NodePort

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

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  type: NodePort
  clusterIP: <IP 주소>
  selector:
    key: value
  ports:
  - protocol: TCP
    port: <외부 포트>
    targetPort: <내부 포트>
    nodePort: <노드 포트>

LoadBalancer

클라우드 Infra Structure(AWS, Azure, GCP 등)나 오픈스택 클라우드에 적용
LoadBalancer를 자동으로 프로 비전하는 기능 지원
NodePort를 예약 후 해당 nodeport로 외부 접근을 허용

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  type: LoadBalancer
  clusterIP: <IP 주소>
  selector:
    key: value
  ports:
  - protocol: TCP
    port: <외부 포트>
    targetPort: <내부 포트>

ExternalName

클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용
클러스터 도메인이 실제 외부 도메인으로 치환되어 동작

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  type: ExternalName
  externalName: <외부 도메인>

헤드리스 서비스

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

Service와 여결된 Pod의 endpoint로 DNS 레코드가 생성됨

Pod의 DNS주소 : pod-ip-addr.namespace.pod.cluster.local

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    key: value
  ports:
  - protocol: TCP
    port: <외부 포트>
    targetPort: <내부 포트>

kube-proxy

Kubernetes Service의 Backend 국현
endpoint 연결을 위한 iptable 구성
nodePort로의 접근과 Pod 연결을 구현(iptable 구성)

kube-proxy mode

  • userspace
    클라이언트의 서비스 요청을 iptables를 거쳐 kube-proxy가 받아서 연결
    kubernetes 초기버전에 잠깐 사용

  • iptables
    kube-proxy는 service aPI 요청 시 iptables rule이 생성
    클라이언트 연결은 kube-proxy가 받아서 iptables 룰을 통해 연결

  • IPVS
    리눅스 커널이 지원하는 L4 로드밸런싱 기술을 이용
    별도의 ipvs 지원 모듈을 설정한 후 적용 가능

    지원 알고리즘

    • rr : round-robin
    • lc : least connection (smallest number of open connections)
    • dh : destination hashing
    • sh : source hashing
    • sed : shortest expected delay
    • nc : never queue

인그레스

HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출하고 L7 로드밸런싱 기능을 제공하는 컴포넌트입니다.

기능

  • Service에 외부 URL을 제공
  • 트래픽을 로드밸런싱
  • SSL 인증서 처리
  • Virtual hosting을 지정

Kubernetes Ingress 동작방식

Ingress Controller에 url의 path로 서비스를 연결시킨 Rule을 만들어 줍니다.

인그레스 컨트롤러 설치

클라우드 서비스에서는 각 클라우드 서비스에서 자사의 로드밸런서와 연동해서 Ingress를 사용할 수 있습니다.

하지만 클라우드를 사용하지 않고 클러스터를 구축해서 사용하는 경우는 Ingress Controller를 직접 Ingress와 연동시켜줘야 하며, 이때 가장 많이 사용되는 것이 바로 Ingress-nginx입니다.


출처
https://www.youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c

profile
뿌셔뿌셔

0개의 댓글