본문 바로가기

Kubernetes

Kubernetes 기본 개념 정리 + Istio

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 인증서 처리

출처 : https://subicura.com/k8s/guide/ingress.html#ingress-%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5

 

 

 

* Ingress 더 파헤치기 

ELB의 종류는 L4의 NLB(Network LoadBalancer)와 L7의 ALB(Application LoadBalancer) 있다. 

ALB가 L7에 대한 좀 더 다양한 설정이 가능하기 때문에 조건이 많기도 하고, 설정할 수 있는 옵션도 많다. (Ingress는 여기에 해당)

NLB는 비교적 설정이 적고, 따라서 개발자가 설정해줄 수 있는 항목도 적다.

 

 

 


Istio

Istio에 들어가기 앞서, 먼저 Service Mesh란?

MSA, Kubernetes를 사용하면, 관리자는 수백~수천개의 인스턴스를 모니터링 + 관리 해야 하며 서비스 간의 통신도 매우 복잡해진다.

더보기

자세히 말하자면, Kubernetes는 Pod를 배포하고 확장할 수 있지만 Pod 간의 라우팅을 관리하거나 자동화할 수 없으며 이러한 연결을 모니터링, 보호 또는 디버깅하는 툴을 제공하지 않습니다. 클러스터의 컨테이너 수가 증가함에 따라 컨테이너 간에 가능한 연결 경로의 수가 기하급수적으로 증가하여 구성 및 관리가 상당히 복잡해질 수 있습니다.

 

출처: https://www.ibm.com/kr-ko/topics/kubernetes

Service Mesh는 이같은 관리 및 프로그래밍 오버헤드를 낮추기 위한 아키텍처이다.

 

 

기존 서비스 아키텍처에서의 호출이 아래와 같이 직접 호출 방식이었다면,

출처 : https://gruuuuu.github.io/cloud/service-mesh-istio/

 

Service Mesh에서의 호출은 서비스에 딸린 proxy끼리 이뤄지게 된다.

출처 : https://gruuuuu.github.io/cloud/service-mesh-istio/

 

 

Service Mesh에서의 통신은 사이드카로 배치되고 경량화된 L7계층기반의 proxy를 사용한다.

* 사이드카: 어플리케이션 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴이다. 어플리케이션 컨테이너(오토바이)의 변경이나 수정 없이 독립적으로 동작하는 컨테이너(사이드카)를 붙였다 뗐다 할 수 있다. (오토바이와 사이드카로 생각하면 쉬움. 오토바이는 사이드카 없어도 운전 가능)

 

 

서비스와 프록시 수가 증가하면서, 각 프록시에 대한 설정정보를 중앙집중화된 컨트롤러가 통제할 수 있게 설계되었다. (아래 사진 참고)

출처 : https://gruuuuu.github.io/cloud/service-mesh-istio/

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 마이크로서비스에 요청을 전달하기 전에 추가적인 애플리케이션별 라우팅 및 로직을 제공합니다.

출처 : https://sharplee7.tistory.com/71

 

출처 : https://sharplee7.tistory.com/71

위 사진 설명

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://subicura.com/k8s/guide/deployment.html#deployment-%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5

쿠버네티스 정의 : 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/