본문 바로가기

Programming/Cloud

Day 178. 쿠버네티스(Kubernetes) - Service Object

 

 

 

Service

 

Pod 집합에서 실행 중이 애플리케이션을 네트워크 서비스로 노출하는 추상적인 방법

Pods에 접근하기 위한 규칙을 정의

하나의 애플리케이션에 하나의 Pod만 사용하지 않고 Pod의 집합을 사용하는 경우 각 Pod는 고유의 IP 주소를 가지기 때문에 접근이 까다롭다.

Deployment를 사용하는 경우 Pod는 동적으로 생성/소멸 될 수 있기 때문에 배포 중 동작되는 Pod의 IP 주소는 변경될 수 있다.

 

더보기

도커는 -p 옵션을 통해서 사용하는 호스트의 포트를 통해서 컨테이너의 포트로 포트 포워딩 시켜서 포트를 노출 시켰었다. -> 컨테이너 1개를 직접 노출했다.

 

쿠버네티스에서는 그렇게 할 수 없다. 그래서 Pod의 IP를 직접 확인하고, Pod를 하나 더 만들어서 내부에서 IP로만 직접 접근했었다. 이 방법은 로컬에서는 가능하지만 이걸 가지고 외부에서 요청을 할 수는 없다. 그리고 새로 만들때마다 Pod의 IP는 계속 바뀌었기 때문에 불편함이 있다.

Deployment는 여러 개의 Pod를 관리하는데 이 Pod들을 모두 외부에 노출하면 하나의 Pod에만 요청이 몰릴 수도 있기 때문에 동일한 Pod를 복제해서 원하는 개수를 유지하면서 각각 따로 만들기도 했다.

이러한 문제점들이 있기 때문에,

 

쿠버네티스에서는 별도의 서비스라고 하는 오브젝트를 만들어서 외부에 노출시킬 것이다.

 

 

 

Service Type

타입 설명
ClusterIP 내 클러스터 내부 IP에 서비스를 노출
클러스터 내에서만 (연결되어있는 쿠버네티스 안에서만) 서비스에 접근 가능
외부로 Pods를 노출하지 않음
기본 ServiceType
NodePort Pods에 접근할 수 있는 Port를 클러스트를 구성하는 모든 Node(각 PC)에 동일하게 개방
외부에서 서비스에 접근 가능
ClusterIP 서비스가 자동으로 같이 생성됨
접근 Port는 기본 랜덤하게 지정됨
특정 Port로 접근하도록 설정 가능
LoadBalancer 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출
외부에서 서비스에 접근 가능
클라우드 환경에서만 사용 가능
NodePort 및 ClusterIP 서비스가 자동으로 같이 생성됨

 

 

▶ Service API 확인

kubectl api-resources

 

▶ CentOs 리눅스 서버 설치

kubectl run -it kuserver-centos7 --image=centos:7

 

▶ 리눅스 내 Curl 도구 설치

[root@kuserver-centos7 /]# yum -y install curl

 

▶ 접속 확인

# curl 10.1.0.XX:8080 

해서 index.jsp 내용 응답이 잘 보여지는지 확인

(IP 확인하려면 Powershell 2 하나 더 켜서, kubectl get pods -o wide 로 확인 가능)

 

 

▶ Service 생성

kubectl apply -f Yaml파일경로 [옵션]

 

 

▶ Service 목록 확인

kubectl get services

 

▶ Service 상세 정보 확인

kubectl describe svc [옵션]

 

▶ Service 삭제

kubectl delete svc svc명 [옵션]

 

 

 

▶ Service 연결할 Yaml 파일 작성

 

 

▷ selector : 서비스에서 만들어놓은 Pod 중에 이 라벨을 가지는 Pod에 접근할 수 있게 만들 수 있는지

▷ spec > ports > port : 서비스에서 사용하는 포트, 서비스에 접근할 수 있는 포트 

- 여기에서는 서비스의 80 포트로 접근하면 라벨에 해당하는 Pod가 내부적으로 사용하고 있는 8080 포트로 연결해주겠다.

 

 

Yaml 파일 작성 후,

cd 디렉터리 이동

ls 목록 확인

kubectl apply -f .\kuweb-service_v1.yaml

생성 후

서비스 확인

kubectl get svc -o wide

 

 

Powershell 1 에서 curl kuweb-service의 CLUSTER-IP:8080 요청을 보내보면 

응답이 와서 index.jsp가 보여진다.

 

그런데 같은 요청을 여러 번 보내면

응답해주는 Server IP Address:IP가 계속 바뀐다.

 

WHY? 서비스를 통해서 요청을 보내면 Pod중 하나한테 응답을 받는다. 특정 라벨을 가지는 Pod를 서비스에 연결하기 위해 Yaml 파일에 selector 항목에 정의했는데 그 selector에 해당하는 Pod중에서 내부 로직에 따라 특정한 하나 Pod를 선택해서 요청을 보낸다.

 

 

서비스 오브젝트 사용 장점

1. 서비스의 IP를 알고 있으면 Pod의 IP를 알 필요가 없다.

2. 부하를 알아서 분산해준다. (로드 밸런서 역할)

3. 서비스의 이름으로도 접근이 가능하다. (쿠버네티스 내부적으로 DNS가 있어서 IP 지정하지 않고 서비스 이름으로 접근 가능)

4. 대신 CLUSTER-IP(클러스터 내부에서 사용하는 IP)는 외부에서 접근할 수 없다.

 

 

 

 

kubectl get po --show-labels

Pod가 가지고 있는 label 보기

혹은

kubectl describe svc

Endpoints: 확인하기 (서비스로 요청이 왔을 때, 도착하는 끝지점)

(kubectl get ep : Endpoints 따로 조회하기)

 

 

 

외부에서 접근할 수 있도록 Service를 하나 더 만들어보자.

 

이번에는 spec > type을 Nodeport로 바꿈

 

 

▷ nodePort : 내가 원하는 Port를 지정

 

 

Yaml 파일 작성 후,

kubectl apply -f .\kuweb-service_v2.yaml

서비스 생성하고

kubectl get svc -o wide

로 확인해보면

TYPE이 NodePort로 바뀌었고,

PORT(S)도 80:XXXXX/TCP로 바뀌었다.

- 현재 노드에 XXXXX 포트를 오픈해놓았다.

- 이 포트로 요청을 하면 서비스의 80 포트로 요청이 가고

- 서비스의 80포트의 Endpoints로 요청을 다시 보낸다.

- 웹 브라우저에서 localhost:XXXXX 검색해보면

- index.jsp가 잘 보인다.

- 그리고 웹 브라우저에서 Server IP Address : ~~ 는 시간이 지나면서 계속 바뀐다.