Kubernetes 쿠버네티스 - Service

salgu·2023년 3월 25일
0

kubernetes

목록 보기
8/16
post-thumbnail

Service 란


Service는 Pod를 추상화한 오브젝트이고 Pod들의 단일 엔드포인트를 제공하고 로드밸런싱 기능을 사용할 수 있습니다.

로드 밸런싱 알고리즘

  • 서비스가 Pod들에 부하를 분산할때 디폴트 알고리즘은 Pod 간에 랜덤으로 부하 분산

Pod Client는 ServiceIP:Port를 이용하여 Pod와 통신 가능

  • NodePort/LoadBalancer Service를 이용하여 Cluster 외부의 request를 Pod로 전달
  • Pod 안에서는 Service 이름과 네임스페이스 이름을 이용하여 다른 Pod와 통신
    • 같은 네임스페이스에 존재하는 Pod :
      <service-name>:<service-port>
    • 다른 네임스페이스에 있는 Pod :
      <service-name>:<service-port>.<namespace>



Service가 필요한 이유


Pod는 변경이 잦고 수시로 삭제되었다 생겨나기 때문에 Pod IP가 매번 변경이 됩니다.

  • Pod Client가 최신 상태의 모든 Pod IP를 알 수 없음
  • 클라이언트가 특정 Pod IP로 오프라인 상태의 Pod에 접근하면 요청은 실패

Pod IP는 클러스터 내부에서만 접근할 수 있습니다.

  • 클러스터 외부에서 접근할 수 있는 방법이 필요
  • kubectl port-forward 프로세스는 개발단계에서만 사용



NodePort와 ClusterIP의 차이



[NodePort 이미지 출처: https://kim-dragon.tistory.com/52]


[ClusterIp 이미지 출처: https://kim-dragon.tistory.com/52]


NodePort와 ClusterIP는 Kubernetes 클러스터 내부에서 서비스를 노출하는 방법 중 가장 일반적인 두 가지입니다.

ClusterIP는 내부 클러스터에서 사용하는 가상 IP 주소를 할당하여 해당 서비스에 대한 엔드포인트를 생성합니다. 이 서비스는 클러스터 내부에서만 사용 가능하며, 외부에서는 접근할 수 없습니다.

NodePort는 ClusterIP의 모든 기능을 포함하면서, 클러스터 외부에서도 해당 서비스에 접근할 수 있도록 노드의 IP 주소와 포트를 사용하여 해당 서비스를 노출합니다. 이 방식은 외부에서 해당 서비스에 접근해야 하는 경우 유용합니다.

즉, ClusterIP는 내부에서만 서비스에 접근할 수 있으며, NodePort는 외부에서도 접근할 수 있는 방식입니다.



yml 작성법


apiVersion: v1
kind: Service
metadata:
  name: order	# Service 명
  namespace: snackbar
  labels:
    app: order
spec:
  type: ClusterIP
  selector:
    app: order	# request를 전달할 Pod 집합
  ports:
    - port: 80	# 노출할 Service Port
      targetPort: 8080	# Service Port와 연결할 컨테이너 Port, containerPort와 일치해야함



Endpoints


Service가 노출하는 Pod Ip와 Port의 최신 목록

  • Service 리소스를 생성하면 Service와 같은 이름으로 Endpoints 리소스가 생성됨
  • Service에 선언한 Selector의 Pod집합이 변경될 때마다 Endpoints의 목록도 함께 업데이트됨
  • Service가 받은 request를 Endpoints 중에 하나로 리다이렉트 함



Pod 집합에 대한 단일 Endpoint Service와 통신하는 2가지 방법


컨테이너 환경변수에 설정된 Service IP와 Port를 이용하는 방법

  • 쿠버네티스가 Pod를 생성할 때 컨테이너 환경변수에 모든 Service IP와 Port를 추가
    • XXX_SERVICE_HHIST, XXX_SERVICE_PORT
    • Service를 Client Pod보다 먼저 생성해야함
    • 다른 NameSpace에 있는 Service 환경변수는 설정되지 않음

Service 이름으로 DNS 서버에 질의하여 Service IP를 알아내는 방법

  • 쿠버네티스가 DNS 서버 IP 주소를 컨테이너의 /etc/resolve.conf 파일에 등록
  • Service 이름으로 요청을 실행하면 DNS 서버로부터 Service IP 조회



LoadBalancer 란



[ClusterIp 이미지 출처: https://kim-dragon.tistory.com/52]

  • LoadBalancer 타입의 서비스를 생성하면 클라우드 서비스의 로드밸런서가 실행됨
  • 로드밸런서의 IP가 Service의 External IP로 할당
  • Service의 External IP이자 로드밸런서의 IP로 외부에서 Pod에 접근할 수 있음
  • Service의 ClusterIP, NodePort의 기능도 내포함
  • 요청을 처리하는데 다른 Pod의 응답이 필요하면 그 Pod의 Service이름과 Service Port를 이용함



Service의 LoadBalancer와 Deployment에 포트포워딩 하는것의 차이


Deployment의 포트포워딩은 개발자나 운영자가 로컬 컴퓨터에서 쿠버네티스 클러스터 내부의 Pod로 직접 접근할 수 있도록 하는 것입니다. 이를 통해 로컬 환경에서 개발 중인 애플리케이션을 테스트하거나 디버깅 할 수 있습니다.

LoadBalancer 서비스는 클러스터 외부에서 애플리케이션에 접근하도록 허용하는 것입니다. 즉, 클러스터 외부에서 트래픽을 로드밸런싱하고, 서비스 디스커버리를 제공하여 클러스터 내부의 Pod로 요청을 전달합니다.

Deployment의 포트포워딩은 로컬 환경에서의 개발 및 디버깅을 위한 것이며, 로컬 환경 외부에서는 사용되지 않습니다. 반면에 LoadBalancer 서비스는 클러스터 외부에서 애플리케이션에 접근하기 위한 것이며, 고객 또는 사용자가 애플리케이션에 접근할 수 있습니다.

또한, LoadBalancer 서비스는 클라우드 제공업체에서 제공하는 로드밸런서를 사용하므로, 대규모 애플리케이션에 적합하며 안정적인 서비스 제공이 가능합니다. 반면에, Deployment의 포트포워딩은 개발 및 디버깅 단계에서만 사용되기 때문에, 일반적으로 작은 규모의 애플리케이션에서 사용됩니다.





reference:

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글