Kubernetes
컨테이너를 조화롭게 사용하기 위한 기술 (컨테이너 오케이스레이션)
주요 기능
- Container Orchestration
- Auto Scaling
- Auto Healing (장애 복구)
- Load Balancing
- Auto Rolling Update (version up)
- Persistence Volume (DB)
구성 요소
Master Node
• 클러스터에 관한 전반적인 결정을 수행하고 클러스터 이벤트를 감지하고 반응
Worker Node
• 동작 중인 컨테이너를 유지시키고 Kubernetes 런타임 환경을 제공
Kubernetes의 Object
리소스의 가장 기본적인 구성 단위, 시스템에서 영속성(running)을 가지는 객체
Deployment
Pod를 배포하는 가장 기본적인 방식 (replicaset 정의, 새로운 버전으로 업데이트/롤백)
**Pod는 자체 IP를 가지고 다른 Pod과 통신할 수 있지만, 쉽게 사라지고 생성되는 특성 때문에,
별도의 고정된 IP를 가진 Service를 만들고 그 Service를 통해 Pod에 접근하는 방식을 사용한다.**
Service
Pod를 노출하고 클러스터 외부에서 접근할 수 있도록 함.
- ClusterIP: 클러스터 내부에 새로운 IP를 할당, 서비스 이름을 내부 도메인 서버에 등록하여 Pod끼리 서비스 이름으로 통신 가능 (내부에서만 통신 가능)
- NodePort: 클러스터 내부에서만 접근할 수 있는 ClusterIP에 반해, NodePort는 클러스터 외부(노드)에서 접근 가능 (ClusterIP 기능포함)
- LoadBalancer: 노드가 사라졌을 때 자동으로 다른 노드로 접근하지 못하는 NodePort에 반해, 살아 있는 노드에만 접근하기 위해 모든 노드를 바라보고 있음. (NodePort의 기능을 포함함)
**하나의 클러스터에서 여러 가지 서비스를 운영하는데 NodePort를 이용한다면,
서비스 개수만큼 포트를 오픈하고 사용자에게 어떤 포트인지 알려줘야 합니다.
사용자가 ip와 port가 아닌, url로 접속할 수 있게 하는 Ingress 방식을 사용한다.**
Ingress
Layer 7 에서의 요청 처리 방식
• 로드 밸런싱
• 특정 경로 라우팅
• SSL/TLS 인증서 처리
* Ingress 더 파헤치기
ELB의 종류는 L4의 NLB(Network LoadBalancer)와 L7의 ALB(Application LoadBalancer)가 있다.
ALB가 L7에 대한 좀 더 다양한 설정이 가능하기 때문에 조건이 많기도 하고, 설정할 수 있는 옵션도 많다. (Ingress는 여기에 해당)
NLB는 비교적 설정이 적고, 따라서 개발자가 설정해줄 수 있는 항목도 적다.
Istio
Istio에 들어가기 앞서, 먼저 Service Mesh란?
MSA, Kubernetes를 사용하면, 관리자는 수백~수천개의 인스턴스를 모니터링 + 관리 해야 하며 서비스 간의 통신도 매우 복잡해진다.
자세히 말하자면, Kubernetes는 Pod를 배포하고 확장할 수 있지만 Pod 간의 라우팅을 관리하거나 자동화할 수 없으며 이러한 연결을 모니터링, 보호 또는 디버깅하는 툴을 제공하지 않습니다. 클러스터의 컨테이너 수가 증가함에 따라 컨테이너 간에 가능한 연결 경로의 수가 기하급수적으로 증가하여 구성 및 관리가 상당히 복잡해질 수 있습니다.
Service Mesh는 이같은 관리 및 프로그래밍 오버헤드를 낮추기 위한 아키텍처이다.
기존 서비스 아키텍처에서의 호출이 아래와 같이 직접 호출 방식이었다면,
Service Mesh에서의 호출은 서비스에 딸린 proxy끼리 이뤄지게 된다.
Service Mesh에서의 통신은 사이드카로 배치되고 경량화된 L7계층기반의 proxy를 사용한다.
* 사이드카: 어플리케이션 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴이다. 어플리케이션 컨테이너(오토바이)의 변경이나 수정 없이 독립적으로 동작하는 컨테이너(사이드카)를 붙였다 뗐다 할 수 있다. (오토바이와 사이드카로 생각하면 쉬움. 오토바이는 사이드카 없어도 운전 가능)
서비스와 프록시 수가 증가하면서, 각 프록시에 대한 설정정보를 중앙집중화된 컨트롤러가 통제할 수 있게 설계되었다. (아래 사진 참고)
Control Plane: 프록시들에 설정값을 전달하고 관리하는 컨트롤러 역할
Data Plane: 프록시들로 이루어져 트래픽을 설정값에 따라 컨트롤하는 부분
Istio란?
Data Plane의 핵심 요소인 Envoy proxy를 설정하고 제어하는, Control Plane 오픈소스 Service Mesh Layer
- 각 Kubernetes 클러스터에 관리자와 프로그래머에게 보이지 않는 사이드카 컨테이너를 추가해 다른 컨테이너 간의 상호 작용을 구성, 모니터링 및 관리한다.
- 각 연결을 개별적으로 구성할 필요가 없도록, 컨테이너 간 연결을 구성하는 단일 정책을 설정한다. 따라서 컨테이너 간의 연결을 더 쉽게 디버깅할 수 있다.
Istio Gateway와 Spring Gateway 의 차이
복잡한 트래픽 관리, 클러스터 외부 서비스와의 통합, 고급 로드 밸런싱 및 장애 조치(failover) 전략이 필요한 경우에는 Istio Gateway를 사용할 수 있습니다.
아래 사진 설명
kubernetes가 서비스 탐색 기능을 제공한다면,
Eureka 서버없이 Istio gateway와 Spring gateway가 함께 쓰일 수 있습니다.
이 경우에는 Istio Gateway는 메시로 들어오는 트래픽에 대한 에지 게이트웨이 역할을 하고,
Spring Gateway는 두 번째 계층 역할을 하여 Spring 마이크로서비스에 요청을 전달하기 전에 추가적인 애플리케이션별 라우팅 및 로직을 제공합니다.


위 사진 설명
Kubernetes에서 로드밸런싱과 간단한 라우팅을 지원하지만 Spring Gateway는 복잡한 라우팅, 보안, 필터링, 모니터링 등을 수행해줌으로 보통 Kubernetes + Spring gateway를 사용한다.
Gateway는 secret key를 알고 jwt 검증과 role을 검사하며 인증, 인가과정을 거친다.
헷갈리는 용어 정리
- 클러스터링 : 서로 유사한 속성을 갖는 데이터를 같은 군집으로 묶어주는 작업
- 쿠버네티스 클러스터 : 컨테이너화(필요한 모든 파일 및 라이브러리와 함께 번들로 제공하는 소프트웨어 배포 및 런타임 프로세스)된 애플리케이션을 실행하는 컴퓨팅 노드 또는 작업자 머신 그룹
- 프로비저닝 : 사용자가 요청한 IT 자원을 사용할 수 있는 상태로 준비하는 것
ALB와 NLB 내용추가 +
1. ALB
Ingress는 클러스터 외부에서 내부 서비스로의 HTTP 및 HTTPS 경로를 설정하는 방법입니다. (ALB는 AWS의 L7 Load Balancer로 ingress 중 하나) Ingress는 주로 HTTP/HTTPS 트래픽에 사용되며, URL 경로를 통해 라우팅을 관리합니다. (ingress, istio는 보통 L7계층 용어)
2. NLB
NLB는 Kubernetes에서 type: LoadBalancer로 서비스가 설정되면, 클라우드 제공업체는 자동으로 NLB를 생성하고, 이 NLB는 서비스와 연동됩니다. 클라우드 제공업체가 생성한 NLB는 DNS 이름을 가집니다. 클라이언트는 이 DNS 이름을 통해 NLB에 접근합니다. (예: my-service-1234567890.us-west-2.elb.amazonaws.com)
클라이언트 요청
클라이언트는 NLB의 DNS 이름(예: http://my-service-1234567890.us-west-2.elb.amazonaws.com)로 요청을 보냅니다.
NLB는 이 요청을 Kubernetes 서비스의 IP 주소와 포트로 전달하고, 서비스는 포드 내부에 트래픽을 전달합니다.
참고 )
쿠버네티스 정의 : https://www.ibm.com/kr-ko/topics/kubernetes
ELB 종류 : https://velog.io/@ausg/eks-k8s-elb
Istio 정의 : https://www.ibm.com/kr-ko/topics/kubernetes
Istio 실습 : https://gruuuuu.github.io/cloud/service-mesh-istio/