프로그래밍/쿠버네티스

[쿠버네티스] 4. Service

riroan 2023. 5. 6. 21:13

쿠버네티스 배포하기에서 발생한 오류를 해결해보자. 지난시간에 Service 객체가 존재하여 pod를 외부와 소통하는 역할을 한다고 하는데 무엇인지 알아보자.

 

Pod IP address

우선 pod는 접속하기 위한 고유의 IP주소를 가지고 있다. 일단 해당 IP주소를 확인해보자.

minikube dashboard
minikube dashboard --url # url만 표시

위 명령어를 실행하면 웹사이트가 하나 나온다. 왼쪽 메뉴에서 pod로 들어가 실행중인 pod를 확인해보자.

pod의 IP주소를 확인할 수 있다. 그렇다면 이 IP로 접속하면 문제가 해결될까?

아쉽게도 불가능하다. 해당 IP는 클러스터 내부에서 사용하는 IP이기때문에 클러스터 외부에 있는 우리는 직접 접근이 불가능하다.

또한 해당 IP는 pod가 교체될때마다 변경된다. 해당 내용을 확인하기 위해 다음 명령어를 입력해보자.

minikube stop
minikube start
minikube dashboard

실제로 IP가 변경된 것을 확인할 수 있다. 이러한 두 가지 이유로 우리는 pod에 접근할 때 IP를 직접 사용하여 접근할 수 없다. 특히 오토스케일링이나 self-healing이 상당히 빈번하게 일어나기때문에 더욱 사용할 수 없다. 그래서 클러스터 외부에서는 물론 클러스터 내부에 있더라도 IP를 사용하여 통신하지 않는다.

Service

그렇다면 pod에 접속할 수 있는 고정적인 IP가 있으면 해결이 되는 것이다! 해당역할을 Service가 해준다.

Service는 pod에 접속할 수 있도록 변경되지 않는 공유 IP를 할당하고 pod와 연결하는 역할을 한다. 이렇게 함으로써 클러스터 내부에서는 물론 외부에서도 pod에 접속할 수 있게 되는 것이다!

 

그렇다면 Service를 만들어서 접속해보자!

kubectl expose deployment server --type=LoadBalancer --port=8000

type과 port라는 옵션이 있다. port는 노출시킬 포트를 나타내고 type이 중요하다.

type을 지정하지 않으면 기본적으로 클러스터 내부에서만 접속할 수 있다. 여기에서 LoadBalancer를 사용했는데 이는 클러스터 외부와 소통할 수 있으며 클러스터로 들어오는 트래픽을 고르게 분산시켜 파드로 보낸다. 그리고 클라우드 프로바이더를 사용하는 경우 클라우드에서 제공하는 로드밸런서를 사용할 수 있다. 현재 클라우드 프로바이더를 사용하지 않지만 minikube에서 LoadBalancer옵션을 제공하니 하나의 pod만 있지만 사용해보도록 하자.

여러가지 옵션은 공식문서에서 확인하자.

 

https://kubernetes.io/ko/docs/concepts/services-networking/service/#publishing-services-service-types

 

서비스

파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법 쿠버네티스를 사용하면 익숙하지 않은 서비스 디스커버리 메커니즘을 사용하기 위해 애플리케이션을 수정할

kubernetes.io

Service를 확인하면 우리가 만든 server가 추가된 것을 볼 수 있다. kubernetes는 기본으로 제공하는 Service이다. CLUSTER-IP라고 써 있는 것이 클러스터 내부에서 접속할 때 사용하는 IP주소이다. 우리는 클러스터 밖에 있으니 사용하지 않을 것이다. 이제 service에 액세스 해보자.

minikube service server

이제 외부에서 접근 가능한 공유 IP가 나타나고 해당 url로 접속하면 잘 접속되는 것을 볼 수 있다.