티스토리 뷰
▣ 서비스(Service) : 포드를 연결하고 외부에 노출
쿠버네티스는 디플로이먼트를 생성할 때 포드를 외부로 노출 하지 않으며, 디플로이먼트의 YAML 파일에는 단지 포드의 어플리케이션이 사용할 내부 포트만 정의한다. 이 포트를 외부로 노출해 사용자들이 접근하거나, 다른 디플로이먼트의 포드들이 내부적으로 접근하려면 서비스(Service)라고 부르는 별도의 쿠버네티스 오브젝트를 생성해야 한다.
서비스의 핵심 기능
- 여러 개의 포드에 쉽게 접근할 수 있도록 고유한 도메인 이름을 부여한다.
- 여러 개의 포드에 접근할 때 요청을 분산하는 로드 밸런서 기능을 수행한다.
- 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포트 등을 통해 포드를 외부로 노출한다.
서비스(Service)의 종류
컨테이너(포드)의 호스트 이름 을 반환하는 간단한 웹 서버 이미지를 사용한다.
vi deployment-hostname.yaml
kubectl apply -f deployment-hostname.yaml
kubectl get pods -o wide (포드 IP확인)
서비스의 종류에 따라 포드에 접근할 수 있는 방법이 달라진다. 서비스는 여러 가지 종류가 있으나, 주로 사용하는 서비스 타입은 크게 3 가지이다.
- ClusterIP 타입: 쿠버네티스 내부에서만 포드들에 접근할 때 사용한다. 외부로 포드를 노출하지 않기 때문에 쿠버네티스 클러스터 내부에서만 사용되는 포드에 적합하다.
- NodePort 타입: 포드에 접근할 수 있는 포트를 클러스터의 모든 노드에 동일하게 개방한다. 따라서 외부에서 포드에 접근할 수 있는 서비스 타입이다. 접근할 수 있는 포트는 랜덤 으로 정해지지만, 특정 포트로 접근하도록 설정할수도 있다.
- LoadBalancer 타입: 클라우드 플랫폼에서 제공하는 로드 밸런서를 동적으로 프로비저닝해 포드에 연결한다. NodePort 타입과 마찬가지로 외부에서 포드에 접근할 수 있는 서비스 타입이다. 그러나 일반적으로 AWS, GCP 등과 같은 클라우드 플랫폼 환경에서만 사용할 수 있다
■ ClusterIP 타입의 서비스 - 쿠버네티스 내부에서만 포드에 접근
vi hostname-svc-clusterip.yaml
spec.selector 항목은 이 서비스에서 어떠한 라벨을 가지는 포드에 접근할 수 있게 만들 것인지 결정한다. 위 예시에서는 app: webserver라는 라벨을 가지는 포드들의 집 합에 접근할 수 있는 서비스를 생성한다. deployment-hostname.yaml 파일로 생성된 디플 로이먼트의 포드는 이 라벨이 설정돼 있으므로 이서비스에 의해 접근 가능한 대상으로 추가될 것이다.
spec.ports.port : 생성된 서비스는 쿠버네티스 내부에서만 사용할 수 있는 고유한 IP(Clust erIP)를 할당받는다.
spec.ports.targetPort : selector 항목에서 정의한 라벨에 의해 접근 대상이 된 포드들이 내부적으로 사용하고 있는 포트를 입력한다.
kubectl apply -f hostname-svc-clusterip.yaml
kubectl get services / kubectl get svc
ClusterIP타입의 서비스가 생성되었다. kubernetes라는 이름의 서비스는 미리 생성되어 있다.
이 서비스는 포드 내부에서 쿠버네티스의 API에 접근하기 위한 서비스이다.
쿠버네티스 클러스터의 노드 중 하나에 접속해 위 IP로 요청을 보내도 되지만, 이번에는 kub ectl run 명령어로 임시 포드를 만들어 요청을 전송해 본다.
kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never -- bash
서비스의 IP와 포트를 통해 포드에 접근할 수 있음
요청을 보낼때마다 다른 포드들이 응답한다. 이는 서비스에게 전해진 요청들이 자동으로 분산되는 것이다.
즉, 별도의 설정 없이도 서비스를 통해서 로드 밸런싱이 되고 있다는 것을 알 수 있다.
■ NodePort 타입의 서비스 - 서비스를 이용해 포드를 외부에 노출하기
NodePort 타입의 서비스는 모든 노드(Node)의 특정 포트(Port)를 개방해서 서비스에 접근하는 방식이다. 스웜 모드에서 컨테이너를 외부로 노출하는 방식과 비슷하다.
vi hostname-svc-nodeport.yaml
kubectl apply -f hostname-svc-nodeport.yaml
NodePort타입의 서비스가 생성되었다. 30476이란 포트는 모든 노드에서 동일하게 접근할 수 있는 포트를 의미한다.
내부 IP로 접근하기 위해서는 클러스터 내부에 접속한 상태여야 한다.
클러스터 내부로 접속하는 대신 적절한 보안그룹 규칙을 추가한 뒤 외부로 접속해서 테스트 할 수도 있다.
curl 10.110.136.136:30476 --silent | grep Hello
@@@잘안됨 왜안될까.......
내부로 접근해서 테스트해보자
kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never -- bash
curl 10.110.136.136:8080 --silent | grep Hello
@@@잘안됨 왜안될까......
■ LoadBalancer 타입의 서비스 - 클라우드 플랫폼의 로드 밸런서와 연동하기
(지금부터는 aws eks환경에서 실습한다.)
▣ 네임스페이스(Namespace) : 리소스를 논리적으로 구분하는 장벽(
지금까지 테스트한 모든 리소스들을 정리하는 명령어이다.
kubectl delete deployment,pod,rs --all
'클라우드,가상화,방화벽' 카테고리의 다른 글
[AWS] VPC를 이용한 3-Tier 아키텍쳐 구성-1 (0) | 2023.07.02 |
---|---|
kubernetes create, apply, replace 차이 (0) | 2023.06.22 |
[Kubernetes]쿠버네티스 - 1 (1) | 2023.06.05 |
ASA방화벽-1 (0) | 2023.05.24 |
[docker]도커 스웜(swarm) (1) | 2023.05.22 |