[Kubernetes] Service

1. 소개

쿠버네티스에서 서비스는 각 컴포넌트들로의 네트워크 연결을 제공하는 모듈이다. 유저는 웹 서비스를 통해 프론트엔드 파드의 웹서비스로 접속하고 프론트엔드 파드는 백엔드 서비스를 통해 백엔드 파드들과 통신 할 수 있다. 서비스의 타입은 Nodeport, ClusterIP, LoadBalancer의 세 가지가 있다.

2. 유형

1) Nodeport

노드의 포트와 노드 내부 파드의 포트 매핑 역할을 한다. 외부의 사용자가 노드로 커넥션을 시도할 때 사용하는 Nodeport와 매핑할 파드의 포트인 Targetport 정보를 가진다. 단일 노드, 단일 파드든 멀티 노드 멀티파드든 관계없이 selector에 원하는 label을 입력하는 것만으로 로드밸런싱 기능을 제공한다. 관리 목적으로 운영자가 원하는 노드 및 파드에 직접 접속할 때 사용할 수 있다.

vi service-definition.yml


apiVersion: v1
kind: Service
metadata: 
  name: myapp-services

spec: 
  type: NodePort # Default값은 ClusterIP
  ports: 
    - targetPort: 80 # targetport는 입력하지 않으면 port와 동일한 값을 사용
      port: 80  #port만 필수값이다. 서비스 객체에서 대상 파드로 연결할 떄 사용하는 포트.
      nodePort: 30008 # 입력하지 않으면 30000에서 32767사이의 비어있는 포트를 사용함
  selector: 
    app: myapp
    type: front-end

# 서비스 생성
kubectl create -f service-definition.yml

# 서비스 조회
kubectl get services

# 로컬PC에서 노드의 포트로 웹서비스 접속확인(포트매핑으로 파드로 접속됨)
curl http://192.168.1.1:30008

2) ClusterIP

파드는 계속 스케일링 되고 삭제, 생성되기 때문에 파드의 IP를 이용해 서비스 레이어 간 연결을 구성하는 것은 의미가 없다. 이 때 사용하는 서비스 타입이 ClusterIP이다. 위 NodePort와 거의 동일하며 차이점은 노드에 직접 접속하는 것이 목적이 아니기 때문에 nodePort를 넣을 필요가 없다. 프론트엔드와 백엔드, DB 사이의 연결을 설정할 때 사용한다.

3) LoadBalancer

클라우드 서비스 벤더들마다 로드밸런서 서비스를 제공하는데 이와 호환하는 목적의 타입이다. 만약 일반 가상 호스트 환경 등 자체 로드밸런서가 없는 환경에서 사용하면 NodePort와 동일한 기능을 한다.

3. 명령어

# 타입이 ClusterIP이고 파드의 label을 그대로 사용하는 서비스 yaml 파일 생성
kubectl expose pod redis --port=6379 --name redis-service --dry-run=client -o yaml

# 파드와 서비스 정의하는 yaml 한번에 생성하기
kubectl run httpd --image=httpd:alpine --port=80 --expose\
 --dry-run=client -o yaml > httpd-definition.yml