728x90

서비스란?

  • 파드가 대체될 때 새로 생긴 파드의 주소를 자동으로 연결해주는 쿠버네티스 리소스
언제 사용하나요?
  • 파드와 파드간 통신할 때
  • 클러스터 외부에서 파드로 요청할 때
  • 파드에서 클러스터 외부로 요청할 때

서비스 리소스를 왜 사용할까요?

  • IP 주소만 있으면 다른 노드에서 실행 중인 파드끼리도 통신이 가능합니다. 하지만 파드가 대체될 때 파드의 IP는 바뀝니다.
  • 서비스 생성 시 쿠버네티스 DNS 서버에 도메인 이름이 서비스 이름으로 저장되며 서비스의 IP가 등록이 됩니다. 서비스는 레이블 셀렉터(label selector)에 등록된 동일한 레이블을 가진 파드를 관리할 수 있습니다.
  • 컨슈머 컴포넌트가 서비스에 요청을 보내면 서비스와 연결된 실제 IP로 요청을 전달합니다.

파드 간 통신

  • 클러스터IP : 가장 기본이 되는 서비스 유형. 클러스터 내부 파드 간 통신할 때 사용하는 리소스입니다.

예시코드

apiVersion: v1
kind: Service
metadata:
  name: foo_api    # 도메인 네임
spec:
  ports:
    - port: 80         # 80번 포트로 요청이 들어오면 파드의 80번 포트로 전달 
  selector:
    app: foo_api
  type: ClusterIP
  • foo_api의 서비스와 연결된 파드를 수동으로 삭제하더라도 디플로이먼트가 foo_api 레이블을 갖는 파드를 새로 생성하고 서비스 foo_api 레이블을 갖는 파드 트래픽을 연결하므로 잘 동작할 수 있습니다.

외부에서 파드로 트래픽 전달하기

  • 로드밸런서 : 외부에서 파드로 들어오는 트래픽을 파드에 전달하는 서비스 유형. 외부 로드밸런서와 함께 동작하며 클러스터 전체 중 레이블 셀렉터와 일치하는 파드로 트래픽을 전달합니다.
  • 로드밸런서 서비스를 배포하면 포트 포워딩을 해주지 않더라도 클러스터 외부의 트래픽을 파드에 전달할 수 있습니다.
apiVersion: v1
kind: Service
metadata:
  name: foo-web
spec:
  ports:
    - port: 8080       # 서비스가 주시하는 포트
      targetPort: 80   # 트래픽이 전달될 파드의 포트
  selector:
    app: foo-web
  type: LoadBalancer  
  • 클러스터 외부에서 8080 포트로 요청이 들어오면 로드밸런서가 감지하여 이를 foo-web 레이블을 갖는 파드의 80번 포트로 요청을 전달합니다.

파드에서 외부로 트래픽 전달하기

  • 익스터널네임 서비스 : 데이터베이스 같은 쿠버네티스 외부에서 동작하는 소프트웨어를 가리키며 도메인 네임 해소에 사용되는 서비스. 익스터널 서비스를 사용하면 로컬 API가 아니라 외부 도메인에 요청을 날릴 수 있습니다.
apiVersion: v1
kind: Service
metadata:
  name: numbers-api     # 도메인 네임
spec:
  type: ExternalName
  externalName: foo.com    # 도메인 네임을 조회하면 쿠버네티스 DNS 서버가 externalName(CNAME)을 반환한다.
  • foo-api 도메인 네임 대신 foo.com이라는 클러스터 외부 도메인으로 요청을 날릴 수 있습니다.

참고 서적

  • 쿠버네티스 교과서
728x90

+ Recent posts