[쿠버네티스] Service 객체와 Service로 Deployment 노출하기


파드와 파드에서 실행되는 컨테이너에 접근하려면 service가 필요하다.


service 객체는 쿠버네티스가 알고 있는 또다른 객체이기에 클러스터의 다른 pod에 pod를 노출한다.
전 세계에 pod를 노출하기 위해 클러스터 외부의 방문자에게도 매우 중요하다.


pod에는 대시보드에서 확인할 수 있듯이 내부 IP주소가 있다!


하지만 내부 IP 주소에는 두 가지 문제가 있다.
첫 번째는 클러스터 외부에서 pod에 액세스 하는데 사용할 수 없기 때문에 문제가 된다
두 번째 문제는 pod가 교체될 때마다 변경된다는 것이다.


따라서 IP 주소를 pod에 의존할 수는 없고, 비록 클러스터 내부에 있다하더라도 IP 주소는 실제로 pod와 통신하는데 훌륭한 도구가 아니다.

service는 pod를 그룹화하고, 공유 주소, 공유 IP 주소를 제공한다. 그러면 이 주소는 변경되지 않다.
service를 사용하여 여러 pod를 해당 service로 이동하고, service에서 변경할 수 없는 IP 주소에 연결할 수 있도록 할 수 있다.


그리고 그보다 더 좋은 것은 클러스터 내부 뿐만 아니라 클러스터 외부에서도 변경되지 않는 이 주소를 노출하도록 service에 지시할 수 있다. 그리고 그로 인해 클러스터 외부에서 pod에 액세스할 수 있게 된다.


디폴트 값은 내부 전용이지만, service를 사용하면 이를 덮어쓸 수 있다.


따라서 service가 없으면, 내부적으로 pod에 접근하기 매우 어렵다. 왜냐면 IP 주소가 변경되고, 클러스터 pod 외부에서 컨테이너화 되지 않은 앱에 전혀 연결할 수 없기 때문이다.


Service로 Deployment 노출하기

 kubectl expose deployment first-app --type=LoadBalancer --port=8080

service를 생성하여 deployment에 의해 생성된 pod를 노출한다.

deployment를 노출하고자 한다는 걸 쿠버네티스에 알린 다음, 그 deployment의 이름을 지정해주어야 한다.

그리고 두가지 옵션이 중요한데, 첫번째 옵션은 노출하려는 포트이다. 나의 경우는 컨테이너가 8080을 노출하기 때문에 8080이 될 것이다.

또 다른 하나는 service또는 expose 유형이다.

ClusterIP은 디폴트 유형이다. 이는 기본적으로 클러스터 내부에서만 연결할 수 있음을 뜻한다. 최소한 변경되지 않는 주소를 얻을 수 있지만, 필요한것은 아니다.

그리고 NodePort가 있다. 이것은 이 deployment가 실행중인 워커 노드의 IP 주소를 통해 노출 됨을 뜻한다.

더 좋은건 LoadBalancer 유형이 있다. 로드밸런서는 클러스터가 실행되는 인프라에 존재해야하는 로드밸런서를 활용한다. 그러면 이 로드밸런서는 실제로 이 service에 대한 고유한 주소를 생성한다. 뿐만아니라 들어오는 트래픽을 이 service의 일부인 모든 pod에 고르게 분산한다.  (지금은 하나의 파드만 있어서 그렇게 의미 있지는 않다, 그렇지만 이것을 스케일링한다면, pod의 여러 인스턴스를 실행한다면, 의미가 있을것이다.)

로드밸런서 유형은 클러스터와 클러스터가 실행되는 인프라가 지원하는 경우에만 사용할 수 있다. AWS와 minikube는 지원하므로 로드밸런서를 사용할 수 있다.

 

kubectl get services

그리고 위 명령을 실행해 서비스가 생성되었는지 확인할 수 있다.

***kubernetes는 내가 만든게 아닌 디폴트로 자동 생성된 서비스이다.

그리고 제일 위에 first-app 이름의 LoadBalancer 타입으로 서비스가 만들어 진 것을 볼 수 있다.

그리고 Cluster-ip는 내부IP이다. External-ip는  클라우드 프로바이더에 배포되면 실제 외부 IP를 볼 수 있지만, minikube 는 항상 pending 상태로 유지가 된다.

 

minikube service first-app

하지만 minikube에는 Service에 액세스할 수  있게 하는 명령이 있다.

기본적으로 로컬 머신에서 접근할 수 있는 IP에 특수 포트를 매핑하여, 로컬머신에서 실행중인 가상머신을 식별한다.

로드 밸런서를 지원하는 클라우드 프로바이더에서 이 서비스를 만든 경우에는 애초에 external-ip를 찾을 수 있으며, 이 명령이 작동하지 않는다. 그리고 minikube에서만 작동한다.

그리고 이렇게 접속 할 수 있다.

이 어플리케이션은 내가 쿠버네티스 클러스터로 보낸 deployment를 기반으로 쿠버네티스에 의해 생성한 pod에서 실행된다.

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Kubernetes 다른 글

    이전 글

    다음 글