본문 바로가기
쿠버네티스

쿠버네티스(3) - 서비스

by 왈레 2024. 7. 8.

Kubernetes에서는 서비스라는 개념을 사용하여 파드(Pod)들에 대한 네트워크 접근을 관리한다.

서비스는 일종의 가상 IP 주소와 포트를 제공하며, 그 파드들에 대한 로드 밸런싱, 서비스 발견 등을 담당한다.

  • 서비스는 동일한 Pod 그룹의 단일 진입점을 제공한다. (로드밸런싱 역할) 단일진입점: 여러 개의 동일한 역할을 하는 파드들을 하나로 묶어서 외부에서 접근할 수 있는 단일한 접근 지점을 제공한다는 의미
  • 서비스는 ClusterIp < NodePort <LoadBalancer로 순서로 확장된다.
  • 서비스에 접근할 때 서비스 ip 혹은 서비스 이름 외에도 DNS명으로도 접근할 수 있다.
    e.g. http://my-service.default.svc.cluster.local
  • DNS이름은 {서비스 이름}.{네임스페이스}.svc.cluster.local 형식을 따른다.

 

3-1 서비스 타입

ClusterIp (defualt)

  • Pod 그룹의 단일 진입점(Virtual IP) 생성
  • 클러스터 외부에서 접속할 수 없다. (ClusterIP는 내부에서만 접근 가능)
  • type 생략 시 default 값으로 10.96.x.y/12 범위에서 할당 됨
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  #clusterIP: 10.100.100.100 일반적으로 서비스의 IP는 사용안하고, 서비스 이름을 활용함
  selector:
    app: webui
  ports:
  - port: 80
    targetPort: 80

 

NodePort

  • ClusterIP(service)를 생성후 모든 노드(마스터 포함)를 대상으로 외부 접속 가능한 포트를 예약한다.
  • NodePort는 ClusterIP를 포함하기때문에 Service의 ClusterIP로도 접근 가능하다.
  • Default NodePort의 범위는 30000~32767이다.
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: webui
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30200

 

LoadBalancer

  • ClusterIP, NodePort를 생성 후 각각의 노드를 연결해주는 로드밸런서 생성
    ClusterIP, nodeport(노드ip:port)로도 접근 가능
  • 참고로 로드밸런서는 클러스터 영역밖에 위치한다.
  • 로드밸런서를 통해 노드접속 → 노드는 service로 포워딩 → service는 Pod로 로드밸런싱
    (로드밸런서는 노드로 랜덤하게 접근하고, 서비스에서 또 pod로 랜덤하게 접근함)
  • 클라우드 인프라스트럭쳐(AWS, Azure, GCP 등)나 오픈스택 클라우드에 적용
  • LoadBlanacer를 자동으로 프로 비전하는 기능 지원
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: webui
  ports:
  - port: 80
    targetPort: 80

 

ExternalName

ExternalName은 Kubernetes 서비스 유형 중 하나로, 클러스터 내의 service를 외부 DNS 이름으로 매핑하는 데 사용된다. 이는 Kubernetes 클러스터 내부의 파드가 외부에 호스팅된 서비스에 접근할 수 있도록 돕는 역할을 한다.

  • 외부 DNS 이름 사용: ExternalName 서비스는 클러스터 외부의 DNS 이름을 Kubernetes 서비스 이름으로 매핑한다.
  • 로컬 엔드포인트 없음: ExternalName 서비스는 로컬 클러스터 내에 엔드포인트를 생성하지 않는다. 대신, 해당 서비스의 이름을 사용하여 외부 DNS 이름으로 직접 요청을 전달한다.
  • 실제 사용 사례: 외부 데이터베이스 또는 API 연결
    e.g. AWS RDS와 같은 외부 데이터베이스 서비스를 사용하고자 할 때, 클러스터 내부에서 이 서비스에 접근하기 위해 ExternalName을 사용할 수 있다.
apiVersion: v1
kind: Service
metadata:
  name: my-external-db
spec:
  type: ExternalName
  externalName: rds.amazonaws.com

Kubernetes 클러스터 내부에서 my-external-db 서비스 이름으로 요청을 보내면, 해당 요청은 자동으로 설정된 외부 DNS 이름(rds.amazonaws.com)으로 리다이렉트됩니다.

 

Headless Service

Headless 서비스는 Kubernetes에서 클러스터 내의 파드들을 직접 클라이언트가 조회할 수 있도록 지원하는 특별한 유형의 서비스이다.

일반적인 서비스와는 달리, Headless 서비스는 클러스터 IP를 제공하지 않으며, 대신 DNS를 통해 파드의 IP 주소를 직접 반환한다.

Kubernetes에서 파드의 IP 주소를 확인하고 관리하기 위해서는 파드와 연결된 서비스를 만들어야 한다.

  • ClusterIP가 없는 서비스로 단일 진입점이 필요 없을 때 사용
  • Service와 연결된 Pod의 endpoint로 DNS 레코드가 생성됨
  • 헤드리스 서비스는 파드의 이름이 보장되는 StatefulSet에 유용하게 쓰인다.
  • headless Service는 특별한 type이 있는것이 아니고, type은 ClusterIP로 설정하되, IP를 적는부분(slusterIp)을 :None으로 설정해주면된다.
apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: webui
  ports:
  - port: 80
    targetPort: 80

# 확인
$ kubectl run testpod -it --image=centos:7
$ curl <pod-ip-addr>.<namespace>.<uniquename.vitasoft.io>
$ curl 10-233-72-157.default.pod.uniquename.vitasoft.io

 

3-2 다른 nampespace에 있는 서비스와 통신

다른 네임스페이스에 있는 서비스와 통신하려면 <service-name>.<namespace>.svc.cluster.local 형식을 사용하여 DNS 이름을 구성하면 됩니다. 이를 통해 같은 클러스터 내의 네임스페이스 간에 쉽게 통신할 수 있습니다.

'쿠버네티스' 카테고리의 다른 글

쿠버네티스(5) - 레이블과 셀렉터  (0) 2024.07.15
쿠버네티스(4) - 인그레스  (1) 2024.07.15
쿠버네티스(2) - 컨트롤러  (0) 2024.07.08
쿠버네티스(1) - 파드  (1) 2024.07.05

댓글