본문으로 바로가기

쿠버네티스 - Service

category Kubernetes 2021. 7. 19. 03:26
반응형

쿠버네티스 API Service = 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공한다.

예를들어 똑같은 기능을 수행하는 webui 라는 이름의 파드. (replicas=3) 가 있을 때 그 세개의 파드의 ip는 각각 다를것이다. 그 ip를 한대로 묶어 마치 LoadBalancer의 역할 처럼 부하 분산을 시켜주고 단일 진입점을 만들어 주는게 바로 쿠버네티의 Service 라는 기능이다. 서비스 안에는 여러가지 기능들을 가지고 4가지 타입이 지원된다.

 

Deployment와 Sevice 파일의 차이점

Deployment에서 생성한 3개의 webui Pod들을 한대의 클러스터로 묶어 Ip를 지정 해줄수 있다. (생략해도된다. 대부분 생략한다) 저렇게 정해놓은 ip로 접근하면 3개의 파드들의 단일 진입점을 제공해준다.

 

서비스 타입 4가지

1. ClusterIP

  • Selector의 label가 동일한 Pod 그룹의 단일 진입점(Virtual IP) 생성
  • type 생략 시 default 값으로 10.96.0.0./12 범위에서 할당됨

2. NodePort

  • ClusterIP 가 생성된 후
  • 모든 Worker Node에 외부에서 접속 가능 한 포트가 예약된다.
  • 해당 서비스를 외부로 노출시키고자 할 때 사용되는 Service Type으로 외부에 Node IP와 Port를 노출시키는 것

3. LoadBalancer

  • 클라우드 인프라스트럭처(AWS, Azure, GCP 등)나 오픈스택 클라우드에 적용
  • LoadBalancer를 자동으로 프로비저닝 하는 기능 지원
  • 클라우드상에 존재하는 LoadBalancer에 연결하고자 할 때 사용되는 서비스 타입으로 LoadBalancer의 외부 External IP를 통해 접근이 가능하다.

4. ExternalName

  • 클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용
  • 클러스터 도메인이 실제 외부 도메인으로 치환되어 동작
  • Kubernetes는 자체 DNS서버를 가지고 있어 클러스터 내부에서만 사용가능한 DNS를 설정해서 사용할 수 있다.
  • 이것은 Kubernetes상에서 통신할때 IP기반이 아닌 DNS를 통해 연결할 수 있음을 뜻하며 Pod에서 다른 Pod의 서비스를 연결할때 사용된다.

실습 

1. ClusterIP

  1)deployment 생성 (replica=3) name=webui

  2) Pod의 각 ip 확인

  3) Cluster-ip 생성

  파드마다 다른 저 ip 세개를 하나로 묶어주는 ClusterIP를 생성해주자.

kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  selector:
    app: webui   //webui pod를 묶어준다.
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80  //Pod의 port

<cluster-exam.yaml>

적용 후 조회

 

clusterip-service란 이름의 서비스가 실행중이며 10.103.138.156의 ip를 갖고 있다. 이 서비스의 ip가 webui 파드들의 단일 진입점이다.

 

좀더 자세히 조회

 

kubectl describe svc clusterip-service

 

엔드포인트 부분에서 3개의 ip가 있는 것을 확인할 수 있다. 

 

로드밸런싱 확인

그럼이제 진짜 로드밸런싱이 되는지 확인 해보자. 각 파드의 컨테이너 마다 nginx 인덱스 파일을 수정해서 파드마다 다른 내용을 출력하게 해준다.

 

kubectl exec [pod name] -it -- /bin/bash

각 Pod 의  index.html 내용은 web ui #1 이런식으로 각 파드마다 번호를 붙였다.

이제 클러스터 ip:80 포트로 접속하면 3파드에 분산되면서 접속이 되는지 확인해보자.

 

내 클러스터 ip 는 10.103.138.156 이였고 : 80으로 curl 명령으로 확인한 결과

한곳의 파드로 만 접속되는 것이 아닌 로드밸런싱 기능이 잘 수행된 것을 확인할 수 있었다.

 

2.NodePort

  • 모든 노드를 대상으로 외부 접속 가능한 포트를 예약
  • ClusterIP를 생성후 Nodeport 예약

nodeport yaml 파일 생성 및 nodeport service 생성

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

nodeport를 생성하면서 현재 노드들의 포트를 개방해 주었다 :30092 포트를.

 

각 워커노드마다 확인 해보니 30092 포트가 개방 돼 있었고, 저 클러스터 ip :30092 포트로 요청을 하면

80번 포트에 연결이 돼게 끔 설정해놔서 nginx index 파일이 출력 된다.

node 포트는 외부에서 접속할 수 있게끔 포트를 개방해주기 위한 역할을 제공해준다.

 

3. LoadBalancer

  • Public 클라우드에서 운영가능
  • LoadBalancer를 자동으로 구성 요청
  • NodePort를 예약 후 해당 nodeport로 외부 접근을 허용한다.

출처 : 따배쿠 유튜브 강의 https://www.youtube.com/watch?v=WaJyY5KvZj8&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=26

퍼블릭 클라우드가 아니기 때문에 로드밸런서가 동작 되지는 않지만 확인을 해보기만 한다.

 

원래는 퍼블릭 클라우드와 연결이 됐다면 External-IP에 외부 로드밸런스 IP가 등록된다.

정리하자면 외부의 로드밸런서를 설정하는 것이 로드밸런서 서비스의 역할이다.

 

4. ExternalName

  • 클러스터 내부에서 External(외부)의 도메인을 설정
반응형

'Kubernetes' 카테고리의 다른 글

쿠버네티스 - Ingress  (0) 2021.07.20
쿠버네티스 - Statefulset  (0) 2021.07.18
쿠버네티스 - Daemonset  (0) 2021.07.18
쿠버네티스 - Deployment  (0) 2021.07.17
쿠버네티스 - Replicaset  (0) 2021.07.17