서비스는 여러 개 파드에 접근할 수 있는 IP 하나를 제공한다. 본질적으로 로드밸런서 역할을 하고 다양한 기능을 제공한다.

파드는 컨트롤러가 관리하기 때문에 한 곳에 고정돼서 실행되지 않고, 클러스터 안을 옮겨 다닌다. 이 과정에서 노드를 옮기면서 실행되기도 하고 클러스터 안 파드의 IP가 변경되기도 한다. 이렇게 동적으로 변하는 파드들에 고정적으로 접근할 때 사용하는 방법이 쿠버네티스의 서비스이다. 

서비스를 사용하면 파드가 클러스터 안 어디에 있든 고정 주소를 이용해 접근할 수 있다. 클러스터 외부에서 클러스터 안 파드에 접근할 수도 있다. 인그레스로도 접근할 수 있는데 서비스는 주로 L4 영역에서 통신할 때 사용하고 인그레스는 L7 영역에서 통신할 때 사용한다는 차이점이 있다. 


서비스 타입 

ClusterIP: 기본 서비스 타입이며 쿠버네티스 클러스터 안에서만 사용할 수 있다. 클러스터 안 노드나 파드에서는 클러스터 IP를 사용해 서비스에 연결된 파드에 접근하다. (클러스터 외부에서는 사용할 수 없다)

 

NodePort: 서비스 하나에 모든 노드의 지정된 포트를 할당한다. ex) node1:8080, node2:8080처럼 노드에 상관없이 서비스에 지정된 포트 번호만 사용하면 파드에 접근할 수 있다. 노드의 포트를 사용하므로 클러스터 안 뿐만 아니라 클러스터 외부에서도 접근할 수 있다. (클러스터 외부에서 클러스터 안 파드로 접근할 때 사용할 수 있는 가장 간단한 방법이다.)

 

LoadBalancer: AWS같은 퍼블릭 클라우드 서비스, 오픈스택 같은 프라이빗 클라우드, 쿠버네티스를 지원하는 로드밸런서 장비에서 사용한다. 클라우드에서 제공하는 로드밸런서와 파드를 연결한 후 해당 로드밸런서의 IP를 이용해 클러스터 외부에서 파드에 접근할 수 있도록 해준다. (kubectl get service 명령으로 서비스 상태를 확인하면 EXTERNAL-IP 항목에 로드밸런서 IP를 표시한다. 이 IP를 사용해 클러스터 외부에서 파드에 접근한다.)

 

ExternalName: 서비스를 .spec.externalName 필드에 설정한 값과 연결한다. 클러스터 안에서 외부에 접근할 때 주로 사용한다. 이 서비스로 클러스터 외부에 접근하면 설정해둔 CNAME 값을 이용해 클러스터 외부에 접근할 수 있다. (클러스터 외부에 접근할 때 사용하는 값이므로 설정할 때 셀렉터(.spec.selector 필드) 가 필요 없다.) 


서비스 사용

서비스 기본 설정 예시

  1.  .spec.type 필드에서 서비스 타입을 설정할 수 있다. (따로 설정하지 않으면 기본 타입은 ClusterIP이다.)
  2.  .spec.clusterIP 필드에서 클러스터 IP를 직접 설정할 수 있다. (설정하지 않을 시 자동으로 IP값이 할당된다.)
  3.  .spec.selector 필드에는 서비스와 연결할  파드에 설정한 .labels 필드 값을 설정한다.
  4.  .spec.ports[ ] 필드는 배열 형태이다. 서비스에서 한꺼번에 포트 여러 개를 외부에 제공할 때는 .spec.ports[ ] 하위에 필드 값을 설정하면 된다. 

위와같이 디플로이먼트로 생성하는 서비스에 연결할 파드를 실행해준다. nginx 컨테이너를 실행하는 nginx-for-service라는 이름의 파드이다. (포트 번호는 80, 서비스에서 사용할 레이블은 파드 이름인 nginx-for-service로 자동 설정된다.)


1. ClusterIP 타입 서비스 사용

clusterIP 타입의 서비스를 만드는 설정

 

Cluster IP 타입 서비스의 구조

 

 

TYPE 항목이 ClusterIP고 CLUSTER-IP 항목에 10.101.112.209로 클러스터 IP가 생성되었다. EXTERNAL-IP 항목은 외부 IP가 없고 포트에는 80번 포트가 연결되었다.

 

$ kubectl describe service 서비스이름

 

위 명령어로 좀 더 자세한 정보를 확인할 수 있다.

 

현재 실행 중인 파드들의 IP 확인

 

앞서 실행했던 nginx-for-svc 디플로이먼트의 파드가 2개 실행중이고, IP가 각각 10.1.0.103, 10.1.0.104이고 위 clusterip-service의 Endpoints 항목과 값이 같다.

 

이제 위 클러스터 서비스의 클러스터 IP인 "10.101.112.209"로 파드에 접근할 수 있는지 확인해본다(클러스터 IP는 쿠버네티스 클러스터 안에서만 사용 가능하다). 쿠버네티스 클러스터 안에 파드를 하나 실행하고 해당 파드 안에서 앞서 만든 클러스터 IP로 접속해본다.

 

파드 안 컨테이너의 배시 셸에 접속한 뒤 curl 파드IP 명령을 실행하면 nginx 접속 페이지의 HTML 마크업을 출력한다.

위 결과를 보았을 때, ClusterIP 타입 서비스가 잘 설정되었고 정상 작동 중임을 알 수 있다.


2. NodePort 타입 서비스 사용

NodePort 타입 서비스 예시

 

NodePort 타입이고 CLUSTER-IP 항목이 10.96.237.69로 설정돼있다. PORT(S) 항목의 80:30080/TCP는 노드의 30080 포트가 ClusterIP 타입 서비스의 80 포트와 연결되어 있다는 뜻이다.

 

localhost:30080으로 접속했을 때 위와같이 기본 화면이 나오면 서비스가 정상 작동하는 것이다. 


3. LoadBalancer 타입 서비스 사용

LoadBalancer 타입 서비스 설정

LoadBalancer TYPE/ CLUSTER-IP/ EXTERNAL-IP : localhost/ PORT(S) 항목도 30267 포트로 설정된 것을 확인할 수 있다.

 

도커 데스크톱에서 실습을 할 때는 외부 로드밸런서가 없어 EXTERNAL-IP 항목이 localhost로 나타난다. 외부 로드밸런서와 연계되어 쿠버네티스 클러스터가 설정된 상태라면 localhost가 아닌 실제 외부에서 접근 가능한 IP가 나타난다.


4. ExternalName 타입 서비스 사용

ExternalName 타입 서비스 설정 예시

 

연결하려는 외부 도메인으로 google.com을 설정해주었다.

$ dig 도메인이름 #위 명령을 실행하면 도메인의 DNS 레코드가 CNAME 타입의 google.com으로 설정되었는지 볼 수 있다.

 

 

 

<출처>
정원천 외 3명, 쿠버네티스 입문 90가지 예제로 배우는 컨테이너 관리 자동화 표준

+ Recent posts