이번 장에서는 Certified Kubernetes Administrator (CKA) 을 준비하며 Services에 대해서 알아본다.
Services
쿠버네티스 "Services"는 애플리케이션 내부 및 외부의 다양한 구성 요소 간의 통신을 가능하게 한다.
애플리케이션을 다른 애플리케이션 또는 사용자와 연결하는 데 도움이 된다. 예를 들어, 애플리케이션에는 사용자에게 프론트엔드 부하를 제공하는 그룹, 백엔드 프로세스를 실행하고 또 다른 그룹, 외부 데이터 소스에 연결하는 세 번째 그룹과 같은 다양한 섹션을 실행하는 Pod 그룹이 있다.
이러한 Pod 그룹 간의 연결을 가능하게 하는 것이 "Services"다.
"Services"는 프론트엔드 애플리케이션을 사용자에게 제공하고 백엔드와 프론트엔드 Pod 간의 통신을 돕고 외부 데이터 소스에 대한 연결을 설정하는 데 도움이 된다.
따라서 "Services"는 애플리케이션에서 마이크로서비스 간의 느슨한 결합을 가능하게 한다.
웹 애플리케이션이 실행 중인 Pod가 배포되어 있다.
쿠버네티스 노드에는 IP 주소가 있으며 192.168.1.2가 할당되어 있으며, 노트북에는 192.168.1.10이 할당되어 있다.
노드의 Pod에는 10.244.0.2가 할당되어 있지만 별도의 네트워크이기 때문에 노트북에서 바로 접근할 수는 없다.
첫째, 192.168.1.2로 쿠버네티스 노드에 SSH를 실행하면 curl을 실행하여 Pod의 웹페이지에 액세스할 수 있고 노드에 GUI가 있는 경우 브라우저를 실행하여 http://10.244.0.2 주소로 브라우저에서 웹페이지를 볼 수 있다.
하지만 이러한 방법은 쿠버네티스 노드 내부에서 실행한 것이며 일반적으로 사용자들이 원하는 사용법은 아니다.
노트북에서 노드를 거쳐 웹 컨테이너를 실행하는 Pod까지 요청을 매핑하는 데 도움을 주는 중간 단계가 필요하며 여기서 등장하는 것이 "Services"다.
쿠버네티스 "Services"는 이전에 알아보았던 Pod, ReplicaSet, Deployment와 같은 객체다.
대표적인 사용 사례로 하나의 노드의 포트를 수신하고 해당 포트의 요청을 웹 애플리케이션을 실행하는 Pod로 전달하는 것이 있다.
Services Type
NodePort는 "Services"가 노드의 포트에서 내부 Pod에 액세스할 수 있도록 한다.
CusterIP는 클러스터 내부에 가상 IP를 생성하여 프론트엔드 서버 집합에서 백엔드 서버 집합으로의 통신을 가능하게 한다.
LoadBalancer는 클라우드 공급자에서 서비스에 대한 로드 밸런서를 제공하여, 여러 웹 서버에 로드를 분산할 수 있게 한다.
NodePort
NodePort는 "Services"가 노드의 포트를 Pod의 포트에 매핑하여 통신하는데 도움을 준다.
총 세개의 포트가 있으며 실제 웹 서버가 실행 중인 Pod의 포트는 80이다. 이를 targetPort라고 하는데, "Services"가 요청을 전달하는 곳이다.
두 번째 포트는 Services 자체의 포트이며 간단하게 Port라고 부른다.
이러한 용어는 서비스 관점에서 나온 것이며, 서비스는 사실 노드 내부의 가상 서버와 같다.
클러스터 내부에는 자체 IP 주소가 있으며 그 IP 주소를 서비스의 클러스터 IP라고 한다.
마지막으로 노드 자체의 포트가 있는데, 이를 사용하여 외부에서 웹 서버에 액세스한다. 이것을 NodePort라고 하며 예시에서는 30008을 사용하고 있다. 허용된 볌위는 30,000 ~ 32,767이다.
"Services"의 spec 영역에는 "type"과 "ports"가 있다.
type은 만들려는 "Services"의 유형이며 NodePort, ClusterIP, LoadBalancer가 될 수 있다.
ports는 배열로 targetPort, port, nodePort를 지정해 주어야 한다. 이 중에서 port만 필 수 필드이며, targetPort는 지정하지 않으면 port와 동일한 것으로 간주되고, nodePort를 지정하지 않으면 30,000 ~ 32,767 범위 내에서 자동으로 할당된다.
"Services" 생성했지만 어떤 Pod에 연결되는 것인지 지정되지 않았으며, 이것을 지정하기 위해 label과 selector가 사용된다.