[Kubernetes]Service

ksp7331·2024년 2월 1일

Service

애플리케이션의 각각의 노드에 대한 네트워크 엔드포인트를 생성하고 관리하는 리소스이다.

kubectl 리소스명

svc, service, services

ClusterIP

클러스터 내에서만 접근 가능한 가상 IP를 제공한다. 내부 서비스 간 통신에 사용된다.

yaml 파일

  • kind : Service
  • spec.ports
    • port : 서비스가 생성할 Port
    • targetPort : 서비스가 접근할 Pod의 Port(설정하지 않으면 port와 동일하다)
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    type: web
spec:
  containers:
  - name: container1
    image: ksp7331/sp-app:1.1
    ports:
    - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - port: 9000
      targetPort: 8080
  selector:
    type: web

위 예시를 예로 들면, 다른 파드에서 다음 주소로 서비스에 접근이 가능하다

curl [service-ip or service-name]:9000

Headless

clusterIP처럼 클러스터 내에서만 접근이 가능하나, 서비스에 IP가 할당되지 않고 대신 연결된 파드들에 대한 DNS 레코드를 생성한다. Pod에 직접적인 통신이 필요할 때 사용된다.

Headless service의 타입은 clusterIP로 표기된다.

yaml 파일

  • spec.clusterIP : Headless로 설정하기 위해서는 해당 속성을 None으로 해야 된다.
  • pod의 subdomain속성은 service의 이름과 같아야 한다.
apiVersion: v1
kind: Service
metadata:
  name: headless1
spec:
  selector:
    svc: headless
  ports:
    - port: 80
      targetPort: 8080    
  clusterIP: None
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    svc: headless
spec:
  hostname: pod-a
  subdomain: headless1
  containers:
  - name: container1
    image: ksp7331/sp-app:1.1

다음과 같은 주소를 사용해서 pod에 접근이 가능하다.

curl pod-a.headless1:8080 # [hostname].[subdomain]

NodePort

클러스터의 각 노드에 특정 포트를 할당하여 외부에서 해당 포트를 통해 서비스에 접근할 수 있도록 한다. 클러스터 외부에서 서비스에 접근해야 할 경우 사용된다.

yaml 파일

  • spec.type : NodePort로 설정해야 한다.
  • spec.ports.nodePort : 외부에서 접근할 수 있는 port를 설정한다.
apiVersion: v1
kind: Service
metadata:
  name: svc-nodeport
spec:
  type: NodePort
  ports:
    - port: 9000
      targetPort: 8080
      nodePort: 31000
  selector:
    type: web

위와 같이 설정할 경우, 모든 노드의 31000포트가 열린다.

minikube를 사용중일 경우, 아래 명령어로 서비스에 접근이 가능하다

minikube service [NAME]

LoadBalancer

클라우드에서 제공하는 로드 밸런서를 사용하여 외부에서 서비스에 접근할 수 있게 한다.

yaml 파일

  • spec.type : LoadBalancer로 설정해야 한다.
apiVersion: v1
kind: Service
metadata:
  name: svc-lb
spec:
  type: LoadBalancer
  ports:
    - port: 9000
      targetPort: 8080
  selector:
    type: web

ExternalName

클러스터 내에서 외부 서비스에 대한 가상 DNS 레코드를 제공한다. 클러스터 내부의 파드들이 외부 서비스에 접근할 때 사용된다.

yaml 파일

  • spec.type : ExternalName로 설정해야 한다.
  • spec.externalName : 연결할 도메인 이름을 지정해야 한다.

0개의 댓글