서비스는 여러 개 파드에 접근할 수 있는 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 필드) 가 필요 없다.)
서비스 사용
- .spec.type 필드에서 서비스 타입을 설정할 수 있다. (따로 설정하지 않으면 기본 타입은 ClusterIP이다.)
- .spec.clusterIP 필드에서 클러스터 IP를 직접 설정할 수 있다. (설정하지 않을 시 자동으로 IP값이 할당된다.)
- .spec.selector 필드에는 서비스와 연결할 파드에 설정한 .labels 필드 값을 설정한다.
- .spec.ports[ ] 필드는 배열 형태이다. 서비스에서 한꺼번에 포트 여러 개를 외부에 제공할 때는 .spec.ports[ ] 하위에 필드 값을 설정하면 된다.
위와같이 디플로이먼트로 생성하는 서비스에 연결할 파드를 실행해준다. nginx 컨테이너를 실행하는 nginx-for-service라는 이름의 파드이다. (포트 번호는 80, 서비스에서 사용할 레이블은 파드 이름인 nginx-for-service로 자동 설정된다.)
1. ClusterIP 타입 서비스 사용
TYPE 항목이 ClusterIP고 CLUSTER-IP 항목에 10.101.112.209로 클러스터 IP가 생성되었다. EXTERNAL-IP 항목은 외부 IP가 없고 포트에는 80번 포트가 연결되었다.
$ kubectl describe service 서비스이름
위 명령어로 좀 더 자세한 정보를 확인할 수 있다.
앞서 실행했던 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 타입이고 CLUSTER-IP 항목이 10.96.237.69로 설정돼있다. PORT(S) 항목의 80:30080/TCP는 노드의 30080 포트가 ClusterIP 타입 서비스의 80 포트와 연결되어 있다는 뜻이다.
localhost:30080으로 접속했을 때 위와같이 기본 화면이 나오면 서비스가 정상 작동하는 것이다.
3. LoadBalancer 타입 서비스 사용
LoadBalancer TYPE/ CLUSTER-IP/ EXTERNAL-IP : localhost/ PORT(S) 항목도 30267 포트로 설정된 것을 확인할 수 있다.
도커 데스크톱에서 실습을 할 때는 외부 로드밸런서가 없어 EXTERNAL-IP 항목이 localhost로 나타난다. 외부 로드밸런서와 연계되어 쿠버네티스 클러스터가 설정된 상태라면 localhost가 아닌 실제 외부에서 접근 가능한 IP가 나타난다.
4. ExternalName 타입 서비스 사용
연결하려는 외부 도메인으로 google.com을 설정해주었다.
$ dig 도메인이름 #위 명령을 실행하면 도메인의 DNS 레코드가 CNAME 타입의 google.com으로 설정되었는지 볼 수 있다.
<출처>
정원천 외 3명, 쿠버네티스 입문 90가지 예제로 배우는 컨테이너 관리 자동화 표준
'DevOps > KUBERNETES' 카테고리의 다른 글
[9] 시크릿(secret) (0) | 2024.05.08 |
---|---|
[8] 컨피그맵(configmap) (0) | 2024.05.02 |
[6-2] 컨트롤러(Controller) - 디플로이먼트 (1) | 2024.04.26 |
[6-1] 컨트롤러(Controller)- 레플리케이션 컨트롤러, 레플리카세트 (1) | 2024.04.25 |
[5] 파드(Pod) -2 (1) | 2024.04.23 |