온라인 쇼핑몰을 가진 회사를 위해 Kubernetes에서 애플리케이션을 배포한다고 가정하자.
애플리케이션은 myonlinestore.com
이라는 도메인으로 접속할 수 있고, 애플리케이션을 Docker Image로 빌드하여 Kubernetes 클러스터에 Deployment의 Pod로 배포한다.
애플리케이션에는 DB가 필요하므로 MySQL 데이터베이스를 Pod로 배포하고, mysql-service
라는 ClusterIP 유형의 service를 생성하여 DB 파드가 애플리케이션 파드에 접근할 수 있도록 한다.
이제 외부에서 애플리케이션에 액세스할 수 있도록 NodePort 유형의 서비스를 만들고, 클러스터 노드의 port로 애플리케이션에 접속할 수 있게 한다.
사용자는 노드의 IP와 port 번호를 이용하여 응용프로그램에 접근할 수 있다.
트래픽이 증가하면 추가 트래픽 처리를 위해 pod의 replicas 수를 증가시키고 파드 간 트래픽을 분배한다.
그러나 사용자가 매번 IP 주소를 입력해야 하는 것은 불편함을 줄 수 있기 때문에 노드의 IP를 가리키도록 DNS 서버를 구성한다.
이제 사용자는 URL인 myonlinestore.com 및 38080번 포트를 사용해 애플리케이션에 접근할 수 있다.
이제 사용자가 포트 번호 없이도 서비스에 접근할 수 있도록 하고싶다.
그러나 서비스의 NodePort는 30000보다 큰 숫자의 포트만 할당할 수 있기 때문에 DNS 서버와 클러스터 사이에 proxy server와 같은 추가 계층이 필요하다.
80번 포트 요청을 NodePort 38080번 포트로 프록시하고 그런다음 DNS를 이 서버로 지정하면 url만으로 애플리케이션에 접근할 수 있다.
여기까지는 응용프로그램이 On-Premise 환경에 호스팅 된 경우이다.
이때는 NodePort 대신에 LoadBalancer 타입을 사용할 수 있다.
이렇게 하면 구글 클라우드 플랫폼에 이 서비스를 위한 네트워크 부하 분산기를 프로비저닝하도록 요청한다.
GCP가 자동으로 로드밸런서를 배포해준다. 로드밸런서에는 외부 IP가 있어서 이 IP를 사용자가 접속하는 곳으로 사용한다.