Kubernetes에서 서비스(Service)는 클러스터에서 하나 이상의 Pod로 실행되는 네트워크 애플리케이션을 노출하는 방법입니다.

Service

포드의 문제점

  • 일시적으로 생성된 컨테이너 집합
  • IP 주소의 지속적인 변동, 로드밸런싱 역할이 필요

서비스 생성

서비스 생성 yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  • port: 서비스를 할 포트
  • targetPort: Pod의 포트
  • selector: service와 연결할 Pod의 label을 선택
# service yaml 파일 적용
$ kubectl create -f service-test.yaml

# service 조회
$ kubectl get svc

ClusterIP

  • 포드간의 통신을 위함
  • 다수의 포드를 하나의 서비스로 묶어서 관리
  • 내부에서만 사용(외부로 노출x)

서비스 세션 고정(Session stickiness)

  • 서비스가 다수의 포드로 구성하면 웹 세션이 유지되지 않음
  • 특정 클라이언트의 연결이 매번 동일한 Pod로 전달되도록 하려면 클라이언트의 IP 주소를 기반으로 세션 어피니티를 구성
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 8080
  - name: https
    protocol: TCP
    port: 443
    targetPort: 8443
  # The following adds session affinity
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 600 
  • 다중 포트를 사용할 수 있다.(80,443포트)
  • 보통 80 포트로 접속하면 443포트로 접속하도록 302 Redirect 코드를 보낸다.
  • yaml에서 보통 단어에 s로 끝나면 하위에 리스트 형태로 정의를 할 수 있다.
# 서비스 세부사항에서 연결될 IP에 대한 정보를 확인 할 수 있다.
$ kubectl describe svc myservice

# 테스트
$ kubectl run -it --rm --image=busybox bash
$ wget -O- -q <cluster-ip>

서비스를 노출하는 방법

  1. NodePort: 노드 자체 포트를 사용하여 포드로 리다이렉션
  2. LoadBalancer: 외부 게이트웨이를 사용해 노드 포트로 리다이렉션
  3. Ingress: 하나의 IP 주소를 통해 여러 서비스를 제공

NodePort

NodePort를 사용하면 자체 로드 밸런싱 솔루션을 자유롭게 설정하고, Kubernetes에서 완전히 지원되지 않는 환경을 구성하거나, 하나 이상의 노드의 IP 주소를 직접 노출할 수도 있습니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort # NodePort 설정
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - port: 80
      # 기본적으로 편의상 `targetPort`는 다음으로 설정됩니다.
      # `port` 필드와 동일한 값.
      targetPort: 80
      # 선택 필드
      # 기본적으로 편의를 위해 Kubernetes 제어 평면은
      # 범위에서 포트를 할당합니다(기본값: 30000-32767).
      nodePort: 30007 # NodePort 설정

실습

Tomcat을 노드포트로 서비스하는 YAML 파일 (tomcat-nodeport.yaml):

apiVersion: v1
kind: Service
metadata:
  name: tomcat-nodeport
spec:
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30002
  type: NodePort
  • tomcat-nodeport라는 서비스를 생성
  • Tomcat Pods를 찾기 위해 selector를 사용
  • 서비스는 노드의 특정 포트(여기서는 30002)로 노출

로드밸런서로 서비스하는 YAML 파일 (tomcat-loadbalancer.yaml):

apiVersion: v1
kind: Service
metadata:
  name: tomcat-loadbalancer
spec:
  selector:
    app: tomcat
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
  • tomcat-loadbalancer라는 서비스를 생성
  • 노드 외부에서 접근할 수 있도록 로드밸런서를 생성합니다.
  • 포트는 80번으로 노출되며, 이를 통해 클러스터 내의 Tomcat Pods에 연결

참고