Zero To One
쿠버네티스 서비스타입 본문
1. 쿠버네티스가 파드에 직접 접근하지 않도록 하는 이유
- Decoupling
- 모놀리식 아키텍쳐 : 어떤 하나의 서비스가 하나로 응축되어 있는 것
- 단점 : 하나의 모듈을 바꾸기 위해서 전체를 배포하고 테스트해야하는 강한 의존성에 대한 문제가 발생함
- 서비스 간의 강한 의존성을 제거하기 위함
- 디커플링을 제거하기 위한 방법 : 메세지Queue (어떤 하나의 서비스가 죽어도 메세지는 보관되기 때문에 다른 서비스에게 메세지가 전달 될 수 있게 한다)
- 파드를 만들어 놓고 연결하는 것은 직접연결하지 않고 서비스를 이용
- 모놀리식 아키텍쳐 : 어떤 하나의 서비스가 하나로 응축되어 있는 것
2. 서비스
- 파드를 네트워크 상에 노출시킬 수 있게 만든 리소스
- 파드 접근 정책을 정의하는 추상적 개념
- 셀렉터에 의해서 해당 파드를 찾아서 연결시켜줌
3. 서비스 디스커버리 (서비스를 찾는 것)
- 마이크로서비스 사이에서 서로가 서로를 호출하는 방법 (IPC, Inter-Process Communication)
- 동기적인 방법 : REST API
- 비동기적인 방법 : 메세지 큐
- 수평 확장 되는 서비스IP 호출방법 : 로드밸런서
- 좋은 서비스 디스커버리?
- 고가용성 (클러스터 환경을 지원해야됨, 여러대의 수평확장을 지원할 수 있어야 함)
- 노드는 서비스의 상태를 알 수 있음
- 부하 분산 (로드밸런서의 기능)
- 대표적인 방법
- 1. DNS 이름에 여러 IP를 할당 ( -> www.example.com - 10.0.1.11 )
- 10.0.1.27
- 10.0.1.133
- ECS의 서비스 디스커버리
- 1. DNS 이름에 여러 IP를 할당 ( -> www.example.com - 10.0.1.11 )
ECS의 서비스 디스커버리 ENABLE -> Rout53에서 DNS주소와 IP주소 매핑 -> 클라이언트가 Route53을 이용해 접근 -> IP에 따라서 ECS의 서비스 디스커버리 -> 적절한 Fargate로 들어감
- 2. 로드밸런서 사용
1. Service Registry에서 대상그룹 등록
2. Service Request 요청이 LoadBalancer로 들어옴
3. Load Balancer에서 Service Registry에게 Query를 함
4. Healthy한게 있다면 특정 타겟(인스턴스)으로 트래픽을 보냄
- 쿠버네티스의 접근
- kube-proxy + 셀렉터
4. 쿠버네티스의 서비스 타입
4-1. NodePort
30000 ~ 32767 번대의 포트로 접근하면 파드로 연결한다
만약 30000번대로 접근시, 192.168.1.3:30000 으로 접속한다
4-2. ClusterIP
- 바깥에서 접근하는 서비스 X
- 내부적으로 iptable을 만들어 주는 서비스 (내부용)
- 파드는 프라이빗 DNS를 가지고 있다
- 서비스에 접속하면 파드1 혹은 파드2, 파드 n개 중 하나에 연결
- 파드가 복제 됬을 때, 클러스터 IP로 접근하면 파드1이 죽더라도 파드2로 접속시킬 수 있게 한다 (수평확장했을 때 서비스에 접근)
4-3. LoadBalancer
- 부하분산