Service

dongbin_Shin·2022년 11월 15일
0

kubernetes

목록 보기
5/16

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
  • Pod
    • FQDN: {pod ip}.{Namespace}.pod.{cluster.local}
      → pod ip가 변경되므로 직접 사용 불가
    • ip: pod ip

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

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
profile
멋있는 백엔드 개발자

0개의 댓글